找回密码
 注册
关于网站域名变更的通知
查看: 338|回复: 1
打印 上一主题 下一主题

了解一下vim ctags的使用方法吧

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-1-17 10:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
windows下很多人都使用source insight 编写和查看代码。linux下可以使用VIM,刚开始会觉得VIM像windows下的记事本,而如果使用得当,它并不比source insight 逊色。$ O6 E1 _7 `$ C) r
    在这里,我会尽我所能细致地讲清楚如何把vim变成source insight, 然而你仍然需要积极地思考,并且必须自己去摸索一些东西。
; G; C2 h- R  M( X: T. K& [    为了避免过于罗嗦,我把基础的部分放在后面,如果你越看越觉得太简单了,那么本文并不适合你;如果看完前面的仍有疑问或者看不懂前面说的是什么东西,不用担心,后面会有一些必备的知识介绍。
/ W7 [- e0 S; e
  C  w  o. t6 C6 O; f8 G7 F一、用好系统自带软件ctags# d: b# _, b6 V/ o! v( D
大部分的unix系统都有ctags软件,它能跟vim很好地合作。: F1 T1 n: G7 o" @+ `0 b* W
用途:
2 l( t/ L8 p: F. V( d/ F    生成c语言的标签文件,实现相关c文件之间的跳转。+ c( O5 v) }% r
用法:
* |' P# i% B: V4 o; w    1.生成标签文件
# P5 p2 q( A' E5 b  ?        在当前目录下(运行$提示符后面的命令): ( G0 v; {0 m. N! g+ ~5 l3 p
        $ctags -R .) p2 g: K. q9 W& l* H$ P0 s1 A
      -R表示recursive,递归,为当前目录及其子目录中的c文件生成标签文件。最后一个.表示在当前目录。
! b- A+ P- V4 k0 F! [/ C        运行完当前目录会多一个文件tags,就是c标签的索引文件。9 [& H, l( ~8 m2 T) ~
7 ?# j; N5 s1 B/ g. ~5 r
    2.跳转
' b' d1 J! x8 l& e6 y  ?        1)用vim打开一个已经建过标签的c文件   
4 `6 F  {  T# R# S4 c, g        2)ctrl+] 找到光标所在位置的标签定义的地方" F6 O2 C- l, A  \' L- u: U
        3)ctrl+t 回到跳转之前的标签处2 v  c! @7 D- v7 s2 g  j
    注意:此时运行vim,必须在"tags"文件所在的目录下运行。否则,运行它会找不到"tags"文件,而需要在vim中用":set tags="命令设定"tags"文件的路径。对于一个稍微大点的项目,你可能在任何一个目录下打开vim,然而在每个目录下都生成一个tags文件并不 是个好主意,那么如何解决呢?方法是在.vimrc中增加一行:1 f4 @; u( F. I" R" o# u
        set tags=tags;/
5 B3 i$ \5 e* Z+ f3 z: S    这是告诉vim在当前目录找不到tags文件时请到上层目录查找。3 |4 C) N# }. c
! ^$ |; [2 o0 F
二、需要额外安装的脚本:- L4 T' O7 R5 R( }0 d0 y% [0 ]' Q

, [* ~8 x5 _/ ~% [3 S1、taglist
2 M, M8 w" D/ x下载地址http://www.vim.org/scripts/script.php?script_id=273! Z8 F1 T+ I' w3 ]# ?
若你下载时地址已改变,请到 www.vim.org 找到正确的地址,这很简单。
3 Q' z* v+ k6 }$ w4 L
4 X* Q, \: _; k2 }2 q2 A9 C用途:
6 k" u. X1 O/ K8 p8 C    打开后,可以显示源码的整体架构,方便地进行跳转。(用惯source insight的人一定勾起某些回忆了^_^)" {, r1 {; a8 v
用法:
  t6 H$ E: V+ L) `    下载插件并安装,使用时在vim中输入命令/ D/ G; H# I2 \8 F7 e
        :Tlist2 P) f6 [+ L. {) o, @
    即可打开/关闭taglist窗口。- m0 N2 C9 q! Y7 ^* v5 a
    一个简单的方法是设定快捷键,在.vimrc中增加一行:
  |( T" q; J8 r        nnoremap <silent> <F8> :TlistToggle<CR>
* U" F* e. Q$ I8 P" s7 n4 H+ h0 E    这样在vim中按F8就可以打开/关闭taglist了。
2 ?" u8 r" u9 w0 m* L% ~/ M& j& @    更多相关配置请看后面关于.vimrc的介绍。! m  Y4 N+ s, I( A4 ]
! v, {9 ?2 q: \* a. {7 C
三、基础知识探讨
; _( z7 M( ?9 C0 v/ e' K
  p1 \- K9 A9 _" n5 w    约定:为了方便和准确,我们约定本文中"$"标示符后的命令为在终端下运行,而":"后的命令为在vim中运行。1 [% ]7 y! G' Y5 ]$ D5 `8 q
" B/ q1 U( D; h9 Z' y4 G7 [
VIM的配置文件一般放在用户主文件夹下,也就是非root状态时在终端运行
2 R% D9 t6 b! l/ }9 ]        $cd ~/2 f- z$ a1 W7 a% Y
    会到的那个目录,文件名为.vimrc。
) L9 @. V5 s1 ~( h    看不到?有两个可能:
* f. q9 e" n- Z- v3 ]8 o5 o; u        1、文件名前面有一个点,表示是隐藏文件,ls查看时需加-a选项。6 M- _/ E" n2 }
            $ls -a- n2 n) X  l3 P! I: n) ?
        2、你还没有建.vimrc文件,自己创建一个就行,先建个空的吧,以后可以不断往里面填东西。) O4 ~) {4 C' _3 z; G1 A% B7 ?
            $touch .vimrc
) C: m$ l' K& B7 G% I$ C$ a2 [" g3 E# ]% T; u) \: a0 ~' k: j
    主文件夹下还有一个.vim文件夹,没有请自己mkdir
% k6 p/ G( w& u% }3 W4 K! P        $mkdir ~/.vim
0 V# q) O5 h: b# g    在.vim文件夹下,再建两个子文件夹:plugin和doc
4 n4 c1 d- }4 T. J7 b8 g, w- ~        $mkdir ~/.vim/plugin
) {: x* u  R! }* O! J9 [+ d        $mkdir ~/.vim/doc$ D) Y9 B! t0 l; b* v& C5 c5 ?
    plugin文件夹下放插件,doc文件夹下放相应的help文档。5 T9 u; w; \7 L) z& w: A, |
    去下一个taglist吧(我们应该把它叫作脚本还是插件呢?它是放在plugin文件夹下的,那么应该是插件;而在vim.org,它是作为scripts存在,那么应当是脚本。),我们当作例子来请解。) p5 ^1 ~8 u" }
    下载的是一个zip包,把它放在 ~/.vim 目录下,然后
# y! g0 d* M* M# d5 i) s8 @        $unzip filename.zip
6 s, L1 j; I* W3 |" z" ]    它已经自动把taglist.vim和taglist.txt分别放到plugin、doc文件夹下了。* T5 h$ A* H$ \/ H: q: X+ o
    这时重新启动vim
* Y. g( C. ^8 w7 X! U2 d        $vim
6 H( k; Q* c2 q    运行. C; r; D* J1 r+ X% l
        :Tlist, N2 k+ v# f: K) u0 _9 ~
    发现旁边多了一栏没有?如果你打开的是c文件,并且已经生成了tags文件,那么里面应当会显示一些有用的信息。
: F! A7 Z2 N" B1 o6 u    这个时候,taglist的help文档已经在 ~/.vim/doc 目录下了,但是你在vim下敲! r) b2 G( A; x! Y( h
        :help Tlist
( v7 V7 P. }% [6 }, ~# j1 `    却没有任何反应,那是因为vim还没有获取帮助文档里面的tag,解决方法是在vim下
8 r2 \. {  k# S. g- n        :helptags ~/.vim/doc7 S" C  j% B3 z. R3 r& l
    现在,你再6 O2 x5 Y. V+ k# R
        :help Tlist" G1 ^; k$ q3 o* k( U; m2 m
    看看有没有反应?
% ]) ?, D! ^1 @9 ]. b4 l1 C5 V( \* ~" O% Z9 P& i
    关于.vimrc
1 s. R( h, {2 d( h- w    我自己的.vimrc也在不断地完善中,完善的过程中得益于从网络上获取的很多知识,感谢提供信息的朋友,也是他们促使我写下这篇东西。我把自己.vimrc的一部分贴在下面,你可以把这些根据需要加到你的.vimrc里面去。6 }: ~9 ?6 I% R

6 k3 T# B% m' `2 m* N".vimrc( u5 Q8 e; b2 C3 _3 ]2 F  q) S5 h
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
5 X" L' a8 [1 y( Z- t4 m" General
" U0 E$ \! v6 c% K/ K"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""- b8 _8 h' v5 t9 [5 I! l
"For ctags, then it can find the 'tags' file even not in current directory8 M# _0 i3 w( z+ [" Q! t
set tags=tags;/! Y# N: l4 G) y1 E9 {* n

3 `+ Q. Z5 U- \: z( d. H* A"Get out of VI's compatible mode..8 A( u$ h. B8 i7 I
set nocompatible9 ]) O2 s: y8 M6 r! c* M

3 K; Q  i# {  p, m# T# e"Sets how many lines of history VIM har to remember" ?5 ]; h' t5 Y0 D
set history=400: F3 ]6 ?2 p$ I. f0 J; ^/ g# b7 q
. ~: o- X" j; m. m
"Set to auto read when a file is changed from the outside+ z4 o9 Z* l" E( x. F
set autoread
9 K& S% ~) k* H2 S
0 P* \5 k. ~+ u$ G8 ]( ~$ k& B"Have the mouse enabled all the time:7 V' m3 y+ n  i9 {% [5 p, k4 [
"when you need to copy from vim, maybe you have to ':set mouse=' first
: P+ Z' d1 y: d2 ^% e& Iset mouse=a! s; R0 y1 |( E' l' e& r
- H; J" @9 l  Q$ r
"""""""""""""""""""""""""""""""""""""
; m0 Z) H* X3 {$ c! r" Colors and Fonts/ ]5 U" E8 f6 P
"""""""""""""""""""""""""""""""""""""/ w6 K0 Q$ m8 e7 U/ f# K/ a) N& e! w
"Enable syntax highlight" A( Y6 M' k9 f
syntax enable' B$ T- w( ?. E5 ?! M' b
  N# n0 D# o& P) H; `2 p7 r, p4 A
"set colorscheme7 V1 F6 R3 O" B6 \; J2 _
colorscheme elflord
4 ?3 Z9 h) f2 `+ V"endif0 G1 I4 Q8 X, Y! _" u$ M. V

5 G: T, Q% `6 Q"""""""""""""""""""""""""""""""""""""4 }. E" _$ |( b. d# [9 C. P0 O
" VIM userinteRFace
# k3 e2 B+ k( G"""""""""""""""""""""""""""""""""""""
# ?# K, P- U% z/ V* {% `" Y"Set 7 lines to the curors away from the border- when moving vertical..
7 x' W5 ]$ x/ t0 }/ g, vset so=7
& @: A, z5 o% k; E  v' U
  W9 D( @1 G+ _2 @"Turn on WiLd menu( B) |  V1 E* u8 ]$ r$ G
set wildmenu1 w* ]) d7 Y7 o2 [& Z" G1 [. `: @/ g

" k% M* x* o0 A) c/ i8 t"Always show current position5 o# P9 O$ J$ z- t" M
set ruler$ n+ X( M2 M& C- O  J' ?
7 Z( Y0 w2 w2 @% ]# j
"The commandbar is 2 high
' K8 @( P- ~2 Bset cmdheight=2
$ c$ ^6 ~: I/ j9 l' y
4 I, h6 W: v' _" j"Show line number- A4 m% u* O& P1 d' }
set nu, x# b" \. ]0 a" P8 Z4 _
1 l  ^# o! s( z8 \
"Set backspace
! g+ f) u: V; bset backspace=eol,start,indent- X. _$ {# Z7 \! R. x6 G# o

! |* C7 u' O* d"Bbackspace and cursor keys wrap to
! d& c: U/ Q( q4 T1 [! rset whichwrap+=<,>,h,l1 l  ~3 I; w1 q) G/ O( T

1 }' O4 @' O/ _6 C( K  j"show matching bracets( j- V# n" w: Y8 x' B
set showmatch# [( q4 w# A% s" Q$ w. j2 M
1 g2 w$ m0 }* R1 Q9 r
"How many tenths of a second to blink% W6 V; C& t3 A) g. I/ u5 e
set mat=2
# ^4 D8 w- K3 b+ y1 B. r3 v
" S2 u' F) F5 F6 H; v. J  l"Highlight search things6 G. {! ]% y$ ~7 Y
set hlsearch8 X! {5 f- c1 {, O0 p
"imediately show the search result& i9 W$ {- R( d
set is
) f( f5 V  M* [+ ]1 w" V% j  z) ]
% x  v/ p9 s* N# A"""""""""""""""""""""""""""""""""""""
3 y% ?# i' m3 x$ m1 S" Folding6 N5 y# P( [* R4 V7 c
"""""""""""""""""""""""""""""""""""""+ Y7 k* k0 [2 ]
"Enable folding, I find it very useful9 g0 s  e7 G* Z
set nofen  H  L3 v: j. m+ g) D
set fdl=0
7 e. O5 n# ~0 W0 l; i! q
/ P1 e# a5 d+ w8 s5 ]# ]$ K5 C" q  y$ y' ]& r; I- X
"""""""""""""""""""""""""""""""""""""
/ w5 l) R! r/ J# D: p$ U! b" Text options
$ y0 z/ f& G, m4 w2 N0 A; P) l. n9 }' d"""""""""""""""""""""""""""""""""""""
9 ^. A! `" E! q0 s$ zset expandtab# t* ^$ Y  r0 b2 ?, e
set shiftwidth=2
( T& Q0 ~: H$ j* S9 lset ambiwidth=double
. y# [5 w+ i5 D$ z9 G, ~set smarttab
  c  Q) \# f, m"Set Tab=4 spaces' s- \) E8 ?# h6 A9 c
set ts=4
' g% U% J! `. W8 y/ p5 p9 Xset lbr8 Z4 v" L9 S! Y2 N, x
set tw=500
2 O( Z% x2 d4 [% dset selection=inclusive
8 b& Q' Q2 f, @! [3 m   """"""""""""""""""""""""""""""/ z! t, n+ d8 e4 t9 O2 K9 K
   " Indent8 h+ x3 Q" A% c+ w8 T1 O" h
   """"""""""""""""""""""""""""""
4 `$ q( ?7 e1 s" k/ o% s* |# f   "Auto indent
2 E5 h# Z5 R  F5 d0 z   set ai. z( Z! n9 h0 p  w
   "Set auto indent width = 4 spaces
3 {6 U, z  y& N+ {   set sw=4
+ C2 l. N* J, f. U
+ s  X3 ~. ~$ ~! o   "Smart indet
& S8 V- S: B" w6 H   set si
8 ~3 H( P1 L- d9 B) ^* \3 L& d) F# @' b7 H
   "C-style indenting
8 C( Z- {# m& _1 \7 N   set cindent "usage: select codes, press '=' key, the codes will autoindenting3 R5 u4 y; H$ {8 L  y
( k" o- ?% F6 o
   "Wrap lines5 W' {) l7 E2 M2 F
   set wrap
, B8 J" P; L4 G& E' d' A' K5 O+ H
"Encoding settings1 S9 ]  p8 y! S0 B- _
if has("multi_byte")( P2 w1 e. z& I0 X: L
    " Set fileencoding priority  u  s" D. v. X' _! f% \
    if getfsize(expand("%")) > 06 r! ]% B& c* f( o
        set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin15 a: D( z" T0 ]) ?. Y  f8 T7 u& {
    else
6 h4 }2 `# Z/ F& _" v        set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
0 L" k" T+ O& ~! K# Y2 A    endif8 q5 M' h' O; e' r9 F2 X( X

" j# d) Q# s( q* N$ x; u    " CJK environment detection and corresponding setting1 a4 p& x2 u0 r0 t: ?3 w& J/ o2 X
    if v:lang =~ "^zh_CN"; o0 \* }; A3 {
        " Use cp936 to support GBK, euc-cn == gb23126 x1 S, C/ _: a6 t0 J; V
        set encoding=cp9363 ~; k( U, n& r3 m
        set termencoding=cp936
6 b$ t/ X- M: z7 b, p        set fileencoding=cp936
  K& O5 l: H9 _" B3 S* G/ _    elseif v:lang =~ "^zh_TW"& z: R: l+ i/ m& Q4 P4 m% Y
        " cp950, big5 or euc-tw2 A$ @3 y1 O4 x! \2 ~7 ~' L
        " Are they equal to each other?4 d& S/ b5 w: K: I
        set encoding=big5
5 K1 c& r3 o4 K2 @$ |! {        set termencoding=big5
' {, O9 ~- [% C+ L% V        set fileencoding=big5
( p& F/ G( S" A, s    elseif v:lang =~ "^ko"
' e3 B5 S  ~$ {+ R0 n1 R- E2 b+ P4 h        " Copied from someone's dotfile, untested/ q" M# }" j. @$ ~# C) X
        set encoding=euc-kr# L- e) ?& y7 E
        set termencoding=euc-kr
" n1 z' q9 z% j' u+ H( g8 D        set fileencoding=euc-kr0 d! c: e) o- b: X* l5 d* O" F
    elseif v:lang =~ "^ja_JP"
% t+ N" _9 U+ v+ g0 m  w        " Copied from someone's dotfile, unteste
* ?# t* _3 _! S" I2 C5 z2 \' L        set encoding=euc-jp
' G9 r! u2 c0 \6 q' V. H+ C        set termencoding=euc-jp
+ C' X, n0 w& `, X' P. m# F9 A        set fileencoding=euc-jp
6 O6 ]2 {, F3 g- G7 D/ |, W9 s    endif4 k. f" ?: e& j. n) C& \4 w8 ~
    " Detect UTF-8 locale, and replace CJK setting if needed. j% A  b) x; Y4 z! S) e$ u
    if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
" r, P! N% N) l# P7 u* I" \5 w7 E& z        set encoding=utf-8" s" L$ @0 p7 c* M2 s
        set termencoding=utf-85 ?' v1 T  A3 i) N+ J# b" Z2 m
        set fileencoding=utf-8; N2 _1 f% s( Q9 X8 _% p
    endif
1 F! Q( E% \+ X5 m4 qelse
' U" k: ~: F" C* D: W    echoerr "Sorry, this version of (g)vim was not compiled with multi_byte": D+ M  y0 D/ K, ]5 v
endif0 }; ]/ L* Q; [- z+ V& {: p! v3 V
& q& e. ?2 q- k, ?9 @# Y

$ [  L* B/ p4 g" \6 r! x  M$ w"""""""""""""""""""""""""""""""""""""
, C9 D8 V2 f/ c3 r  }"plugins/ s$ L$ ~5 T: @0 p: q" V

& L7 `* s7 e0 Y$ G* M" d# y8 L"""""""""""""""""""""""""""""""""""""
$ {, B. X6 r' v4 m% ^$ V7 O$ Q: R6 ~% T" Tlist5 K2 s. q7 l8 A/ E6 b
if &diff% f% u8 B! x! N/ H
let Tlist_Auto_Open=0 "don't auto pen when compare two files8 w9 c' W4 q1 v& J
else
2 T& Y$ A) f6 R- F+ Flet Tlist_Auto_Open=1 "auto pen Tlist when open a file! S9 r! j7 m- a  _
endif
; ?6 i/ D& ]5 |( y9 Z7 ]8 I! ~+ T! O0 P2 q+ f% t& f+ d# |) f3 g
"set taglist window in right, delete the following line if you don't like) U3 e+ N! w/ d1 G/ \
let Tlist_Use_Right_Window=1
# ?& W+ G5 N( B' ]. q. G- E0 {let Tlist_Auto_Update=1
9 ^& N- G; ~- i6 s6 \" k4 Nlet Tlist_File_Fold_Auto_Close=1' O7 ]2 g8 p: B( \
"auto close Tlist when exiting file.( U8 [# u" s! L& r$ i# X  h1 T
let Tlist_Exit_OnlyWindow = 1
0 h: p& r$ N) a' v7 y/ ^0 g' q! f( |+ `" t4 [
nmap <F7> :copen<CR>
. J( P/ H7 d+ |9 d+ Znmap <F6> :cclose<CR>
/ g2 U7 I# f$ J; m
3 z7 }4 y: U+ ?6 G- _

该用户从未签到

2#
发表于 2020-1-17 18:09 | 只看该作者
vim ctags的使用方法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 16:37 , Processed in 0.171875 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表