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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
windows下很多人都使用source insight 编写和查看代码。linux下可以使用VIM,刚开始会觉得VIM像windows下的记事本,而如果使用得当,它并不比source insight 逊色。
: ^5 s* ~0 O% g    在这里,我会尽我所能细致地讲清楚如何把vim变成source insight, 然而你仍然需要积极地思考,并且必须自己去摸索一些东西。
. {1 Q) S  I" k6 E6 K    为了避免过于罗嗦,我把基础的部分放在后面,如果你越看越觉得太简单了,那么本文并不适合你;如果看完前面的仍有疑问或者看不懂前面说的是什么东西,不用担心,后面会有一些必备的知识介绍。' I, z, p3 {/ }

, b6 w) Y! b1 T& b) s- F一、用好系统自带软件ctags8 c0 ?) I1 D' ^4 K3 N+ ~
大部分的unix系统都有ctags软件,它能跟vim很好地合作。; x0 N% X' f4 [. z4 P7 x
用途:( u$ b" o# L+ @. W4 b& R" Y7 w1 p% ^
    生成c语言的标签文件,实现相关c文件之间的跳转。8 I* X4 E5 _) f0 i  d; z
用法:
  h: A& r* O' e  V1 i) b    1.生成标签文件1 V% ^5 i# R0 e& r7 s: c
        在当前目录下(运行$提示符后面的命令):
- Q/ e1 \+ ^; a# B8 J" f7 L        $ctags -R .! x" {$ L, i* W, I# p# v2 R4 W5 L
      -R表示recursive,递归,为当前目录及其子目录中的c文件生成标签文件。最后一个.表示在当前目录。0 z/ k1 S; Y& _2 }! {
        运行完当前目录会多一个文件tags,就是c标签的索引文件。- I" {1 a" n9 M! U- G7 V( V

+ |; p8 ?4 h  g' r    2.跳转( o# g; F* y: k" K8 z* j
        1)用vim打开一个已经建过标签的c文件   
  m3 h% O* m1 n. ]        2)ctrl+] 找到光标所在位置的标签定义的地方
: x* t% t. I' k: z( E1 x        3)ctrl+t 回到跳转之前的标签处3 c$ j, I3 `  j
    注意:此时运行vim,必须在"tags"文件所在的目录下运行。否则,运行它会找不到"tags"文件,而需要在vim中用":set tags="命令设定"tags"文件的路径。对于一个稍微大点的项目,你可能在任何一个目录下打开vim,然而在每个目录下都生成一个tags文件并不 是个好主意,那么如何解决呢?方法是在.vimrc中增加一行:
) ?8 T9 r( A+ k( y: ?        set tags=tags;/
$ ?2 u4 M8 i* r8 c' H* p    这是告诉vim在当前目录找不到tags文件时请到上层目录查找。
! x6 I7 D/ I6 u) H) a  j: f1 P4 ^( i. f& F0 r
二、需要额外安装的脚本:
; T5 {% W6 j4 b' W4 ]: H
; J8 b8 @3 n' N# P8 u1、taglist' L/ o" }" a2 N; [6 F0 V$ _% x: T8 g
下载地址http://www.vim.org/scripts/script.php?script_id=273
! w2 u6 a! J+ D若你下载时地址已改变,请到 www.vim.org 找到正确的地址,这很简单。
8 \. T7 g# B6 n( M4 u* @( _  g
& i8 R3 J* Q3 E, t# a% b1 K- Q用途:2 g$ B* K$ L( V( A
    打开后,可以显示源码的整体架构,方便地进行跳转。(用惯source insight的人一定勾起某些回忆了^_^)% f: U) ~% V! [1 G8 m: ~. {+ a+ V
用法:2 |( _2 r) d( m8 v. ~) D
    下载插件并安装,使用时在vim中输入命令
2 g5 x: V- R" a9 Q        :Tlist
6 k$ h) J1 {. M, g* w4 T: ^    即可打开/关闭taglist窗口。
$ U+ n0 ]$ k# H) ]; _    一个简单的方法是设定快捷键,在.vimrc中增加一行:
6 Z1 B. F8 R) D# q# b        nnoremap <silent> <F8> :TlistToggle<CR>1 U: L- Q+ l! A. \
    这样在vim中按F8就可以打开/关闭taglist了。
, x; Z) j" I4 K9 T) @0 L    更多相关配置请看后面关于.vimrc的介绍。
; X: n* e; e1 ]* y- K  c6 v/ p! i/ U& @2 \6 C
三、基础知识探讨# O, x8 _' k7 W" w6 C

5 z4 ]6 c, o) P- s' r: ~9 o$ x    约定:为了方便和准确,我们约定本文中"$"标示符后的命令为在终端下运行,而":"后的命令为在vim中运行。0 z; ^# {8 N0 {' X8 U1 O) ^" Z6 D) T5 f
  A2 Y7 h- ]- ^: U2 c
VIM的配置文件一般放在用户主文件夹下,也就是非root状态时在终端运行3 k: I0 F+ q1 H3 v1 {  k0 ?& V/ h
        $cd ~/; d1 {# V: D/ G/ ]7 N4 d/ k
    会到的那个目录,文件名为.vimrc。3 I1 y* q' m) H5 p+ S0 }
    看不到?有两个可能:4 r# A5 }) ]* r2 T; ^
        1、文件名前面有一个点,表示是隐藏文件,ls查看时需加-a选项。3 n2 l8 f4 O; z  k2 g% F
            $ls -a
- L( B# U9 _+ @/ C3 J. |6 n        2、你还没有建.vimrc文件,自己创建一个就行,先建个空的吧,以后可以不断往里面填东西。" t/ I' Y" e. h& q6 U
            $touch .vimrc- d- s9 @# ~5 ?. U8 N

" {' y2 ]" g3 {8 c- t0 i    主文件夹下还有一个.vim文件夹,没有请自己mkdir4 O  u3 q/ E' M3 W
        $mkdir ~/.vim4 K: U. W3 [% j
    在.vim文件夹下,再建两个子文件夹:plugin和doc, i" m2 v- W$ T* x6 M
        $mkdir ~/.vim/plugin) g% z; E- I8 U7 }3 Z$ Y
        $mkdir ~/.vim/doc
# M5 n) \. p9 j6 o6 z  g% _    plugin文件夹下放插件,doc文件夹下放相应的help文档。- M& x( L5 I5 x+ p$ E
    去下一个taglist吧(我们应该把它叫作脚本还是插件呢?它是放在plugin文件夹下的,那么应该是插件;而在vim.org,它是作为scripts存在,那么应当是脚本。),我们当作例子来请解。, q" ?7 }" z; @( ^& e4 L
    下载的是一个zip包,把它放在 ~/.vim 目录下,然后
1 M$ O' K: a& S4 N) \, o: J        $unzip filename.zip  ^8 F1 v4 Y  q" S: Q
    它已经自动把taglist.vim和taglist.txt分别放到plugin、doc文件夹下了。
) I2 _. V9 f' O4 |+ ^  G" k    这时重新启动vim4 P: b: C6 K% C" M& h
        $vim# e9 H; u, m! T; V, q1 I; {' p
    运行
' @. |" C* t6 @* g6 L! a0 H' d3 a        :Tlist
6 ]& K. ]0 I, v    发现旁边多了一栏没有?如果你打开的是c文件,并且已经生成了tags文件,那么里面应当会显示一些有用的信息。
: Y" {# f4 x1 L6 C8 `) M9 a    这个时候,taglist的help文档已经在 ~/.vim/doc 目录下了,但是你在vim下敲
4 b* H9 P: b- E& x        :help Tlist1 p/ f$ s0 V; B; G1 Q( ^
    却没有任何反应,那是因为vim还没有获取帮助文档里面的tag,解决方法是在vim下- c% s+ G& |9 O+ x; o
        :helptags ~/.vim/doc. \' Y5 v5 f7 K% z0 L9 F1 L. m  w  P
    现在,你再
' O7 X3 u$ t' \: S( e( I+ s        :help Tlist$ K2 m8 n' L0 {: O0 q& `& K, o  \5 M* F
    看看有没有反应?
+ x  K  J/ c$ V2 F* a/ M2 y' W0 q: ^( I3 B3 r/ [1 o
    关于.vimrc
1 K, ^+ \) o/ Q. Z5 P    我自己的.vimrc也在不断地完善中,完善的过程中得益于从网络上获取的很多知识,感谢提供信息的朋友,也是他们促使我写下这篇东西。我把自己.vimrc的一部分贴在下面,你可以把这些根据需要加到你的.vimrc里面去。
6 e, R3 p  n  t% O; p) d- l" `- v1 S7 j% i
".vimrc- P+ n* G* ?" W% o' L
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
6 i6 d. n, }, f0 p" General* c( I! I& c  D
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" t, S0 r1 w% u: t"For ctags, then it can find the 'tags' file even not in current directory
/ d, z6 c3 e* cset tags=tags;/
3 S! H; i4 x9 p+ X6 C
# F/ S% ~# i) Y3 k"Get out of VI's compatible mode..- ~6 C  x) K7 _9 k  N8 X& f" V' r
set nocompatible* I  l8 r$ U" O5 x
$ h  h( Z2 ?7 \  r
"Sets how many lines of history VIM har to remember
( F: p$ D$ g* T. Vset history=400
- C1 e9 s# P7 P7 j; C5 s; W0 s
; c1 K# }6 C- ~7 @4 s! q4 J  F* d"Set to auto read when a file is changed from the outside& y+ M# u! t1 Z/ Y- \3 |# n
set autoread, j' W: K: H& F, _1 H* t2 L
) a: H! E/ Q8 I! Z- {/ A; s& [& i
"Have the mouse enabled all the time:! ?; G3 Y' c2 w3 F1 w+ S
"when you need to copy from vim, maybe you have to ':set mouse=' first
6 Y: ~6 C. v; p) |6 d( `7 Nset mouse=a) M  U4 X' d' ]( A& E0 v; ^) i

# i7 m% j( D, h0 ~; k"""""""""""""""""""""""""""""""""""""
: N$ U+ M* J2 j: Y3 _5 @0 N" Colors and Fonts8 g. g+ T; A' j! j2 w
"""""""""""""""""""""""""""""""""""""' y6 X; q+ U3 f& o+ K( ~1 h
"Enable syntax highlight' ?5 X( a/ y9 u2 F
syntax enable& k* _, t& F  w  K

5 w6 g$ N5 l- {9 `- o% s! }: _"set colorscheme
  p4 ]* C0 [$ k+ [3 I, D+ Bcolorscheme elflord
. ?6 a, g& B! R6 O"endif% K8 V5 o9 |  C( t

# e: q; c6 P& Z$ G$ s8 G0 j8 \"""""""""""""""""""""""""""""""""""""
) w2 ?& a, |3 R& I# q2 c: j" VIM userinteRFace( l% n4 L& I, `! B9 [
"""""""""""""""""""""""""""""""""""""
" w, u. r5 p) q"Set 7 lines to the curors away from the border- when moving vertical..
  J8 B# W( p5 kset so=7
5 h0 w% O- }) U! B. W6 f+ F1 C6 }
1 w# R8 b# K1 Z6 j; {( T+ N* z" V3 O"Turn on WiLd menu
' C# j- V/ P2 v( G$ Vset wildmenu
$ i* R3 r% f# q; A
7 E9 @5 p+ j2 g* l) r2 x! E"Always show current position  r; R! a" V; l" I/ ?
set ruler: o5 s0 i& R2 d" t: k1 c0 r

) n' I- U7 a7 m2 \- v"The commandbar is 2 high
" e2 t* S* }6 v4 q9 s, k/ B1 sset cmdheight=2
& \% q3 i7 h- @+ ~
/ J7 Y/ E! S4 ~"Show line number" q5 r9 C3 ?5 o% }
set nu) m2 N5 @1 f- ?
. T$ ]) K9 A# ?9 Q
"Set backspace% q0 l: }4 Y7 J+ |3 d2 K
set backspace=eol,start,indent5 S, S+ y% s  X% q# |5 ?4 d
6 {8 h! H' F' y+ q& e# o% F, a
"Bbackspace and cursor keys wrap to
. Y3 z7 i7 Q1 ~+ ?% j# Lset whichwrap+=<,>,h,l: R% M/ V/ q! T, y: a! B+ W, _, \

  f; G& [0 ]3 e! I% M; I& E, }"show matching bracets) p  q# F7 S4 M0 ]: H- s" z
set showmatch
* b& x- z4 i0 w' s/ H% B# J" J0 J
"How many tenths of a second to blink
3 {2 j- p! q+ N7 }set mat=2
6 r, g$ ?9 u7 a: G. b2 _4 t9 W+ Z. {6 s: e
"Highlight search things
1 B4 E  E! f! U7 a- W' A( Fset hlsearch
3 O% X* {: N# \3 u4 I"imediately show the search result  e7 d  X# Q  A& ~7 M6 P+ |6 ]. j4 R
set is# O" u) {, ^2 c3 l9 R- l& U
8 l% H6 L0 M; R" S9 D
""""""""""""""""""""""""""""""""""""", W: e. }0 d7 b0 i  g% \/ S+ I( K
" Folding2 E( n& q& d, d% X
"""""""""""""""""""""""""""""""""""""  P1 J' c4 S5 D* @, ^% e5 a
"Enable folding, I find it very useful- c! z/ T$ j+ _% [, P
set nofen. l7 W6 ?2 d- ~3 i% ?  ^
set fdl=08 U! |8 G6 J1 c1 U/ A; i; Q
6 H2 }0 |0 T& K% p
2 X% I8 z2 v, U# \1 G9 E( y7 X
"""""""""""""""""""""""""""""""""""""( j8 U+ q3 X& l1 i5 w
" Text options& ?- E) u/ G5 o" [
"""""""""""""""""""""""""""""""""""""# D: v5 l* T2 @1 E0 S* B8 c+ U: C
set expandtab/ b, A  X) t! b8 A/ z
set shiftwidth=2. H2 c4 B) H; t2 X, Q, X) q& ]
set ambiwidth=double) {' E. O8 N4 R% E7 j) a( y
set smarttab4 N; p1 R. F- \3 `& l! R9 Y
"Set Tab=4 spaces$ B/ @! h6 U( ?* O
set ts=4
! g' C8 S' k: H  E! g" U" nset lbr
: V1 I/ A) M: P3 _set tw=500( p4 Y# q6 P. a4 ^5 n1 H8 ^" @
set selection=inclusive
8 @- K; h( i0 g. W$ d7 X   """"""""""""""""""""""""""""""
; {4 a. {: @* c6 v  n   " Indent
; B& J" @& Y6 m" Y0 v   """"""""""""""""""""""""""""""
( z4 G9 }! q; A   "Auto indent5 d- i; f: ~# p" ?0 ^* n! }
   set ai
. e1 _+ C' Q# s$ G2 C( K' ~# ~   "Set auto indent width = 4 spaces4 u! A2 W7 }/ D& P" d/ d( {
   set sw=4+ S, n. X) F3 n0 H$ f

& r* c3 U2 Y( L/ J1 g   "Smart indet( f! G/ N9 N$ p/ j2 H" u3 G2 H
   set si6 f" y8 Y# ^, P2 r9 O! J
+ }3 ~; }4 }  T1 h* ^% s% n+ _
   "C-style indenting
5 o+ j/ b& U3 O: ^8 L2 w6 }   set cindent "usage: select codes, press '=' key, the codes will autoindenting! s' Y2 p; B0 l6 Y; _
3 h) \  a! u  S  T* J6 `% f
   "Wrap lines
( i- D9 o; f) w) t  N3 `' S: X   set wrap
/ ~9 g2 J" Z! J" E# {+ L
- G% K1 w( S( ?8 X2 j% w"Encoding settings
( k' Q' N$ x( C- X. M* a  T! c4 Aif has("multi_byte")1 h- Y- M) {# {% U3 i, x0 s8 C/ L
    " Set fileencoding priority$ U8 ~% q5 p6 n1 Q
    if getfsize(expand("%")) > 0
' V! W# M5 f' l# M        set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
% B8 \, e2 F9 q. T    else# l. p5 H/ a$ |# B
        set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
+ |; S* ~6 ^% H2 C- \) ^    endif- K3 i# f" u4 x6 {& V6 r% D
" E( D7 C. u7 Y! N2 X
    " CJK environment detection and corresponding setting
" U% l3 X, y. j/ n    if v:lang =~ "^zh_CN", L; U: w& m( v+ V. k
        " Use cp936 to support GBK, euc-cn == gb2312
* ~7 t' `. T  b: S/ \% U: I( s        set encoding=cp936
4 Y! f* R& g1 |5 @7 j! \        set termencoding=cp936: x$ `7 g6 n% b$ n: ?3 e( @
        set fileencoding=cp936
; Q$ a  Q' @3 m' j    elseif v:lang =~ "^zh_TW"
/ V  n" T$ n+ B' L        " cp950, big5 or euc-tw
+ A" R. W9 m, Y        " Are they equal to each other?
, |, v# l& x6 s        set encoding=big5
* s% m( ~& ]) h, I; ~        set termencoding=big59 V. f5 v( j; ?
        set fileencoding=big5# N( v$ M% Q0 ^1 v+ A
    elseif v:lang =~ "^ko"0 U% J! r: I3 W, p1 P* ?( r* ~
        " Copied from someone's dotfile, untested0 c0 Y1 l# G: A3 C
        set encoding=euc-kr
4 [7 I* Q+ S, g. J        set termencoding=euc-kr9 h9 t& B5 @# Z9 \, @
        set fileencoding=euc-kr
2 n- S* J5 q! _! B2 @    elseif v:lang =~ "^ja_JP"6 f$ X2 @+ \% W! s) s6 t' {
        " Copied from someone's dotfile, unteste
; o) j& V5 W, I        set encoding=euc-jp, d2 ]. S/ y( b  n
        set termencoding=euc-jp; g' G" c) d  P4 o, _
        set fileencoding=euc-jp, S: G" }0 Q6 {
    endif  C, q+ M! W' R% [: c
    " Detect UTF-8 locale, and replace CJK setting if needed
1 [7 n1 a+ y4 o) q5 F% z3 |! O5 \    if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
' [  S2 X' {: G+ d% t        set encoding=utf-8
  J! i( C5 X& M        set termencoding=utf-8" E. F7 B: d- j: t5 A3 b
        set fileencoding=utf-89 {$ k) d5 H' o- q, l; l! x% C+ p
    endif
9 M) T6 V9 _1 P' |, Oelse! l( j" G$ t- c
    echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"3 U$ n5 B9 O3 W
endif4 T9 u& |0 U# G3 V

. l1 U' |; F  c7 W
' T- ]6 z. r! e) s: s6 j3 Q0 `"""""""""""""""""""""""""""""""""""""  j! I2 N# H* U1 _0 u- Y3 t
"plugins
0 i( Z9 [+ ]& J* @4 [& R
" M  Z* }/ y9 N8 w' S2 D"""""""""""""""""""""""""""""""""""""
2 d+ s$ S4 u1 J3 m0 i; j2 a. ?" Tlist( c4 y3 v- @4 X+ S3 r+ n
if &diff
' ~; D# @! ?6 e* rlet Tlist_Auto_Open=0 "don't auto pen when compare two files
2 B3 c1 p; D7 N6 i9 Gelse
3 }# Q$ U! ]$ Y7 C! l3 ^* |6 t3 glet Tlist_Auto_Open=1 "auto pen Tlist when open a file8 z' T/ K$ y  [9 e0 S: l
endif- d8 R/ O9 f3 \  w& c: O* T3 X

7 m3 {7 q7 Z* s5 b3 d"set taglist window in right, delete the following line if you don't like
7 g: c$ k. p/ _: }let Tlist_Use_Right_Window=1( P* T7 J  _/ f4 n! r
let Tlist_Auto_Update=1
( [$ U. w  B8 Q  L. `% U( y& Jlet Tlist_File_Fold_Auto_Close=1
7 l: ]: p9 @# d+ O: A"auto close Tlist when exiting file.
# z1 `# ]6 K' Q8 alet Tlist_Exit_OnlyWindow = 1
+ R4 m) B+ b2 `& X( E
$ ~1 }+ e% w0 D' a* @: Inmap <F7> :copen<CR>3 @5 `- [; l: F: X7 @# L
nmap <F6> :cclose<CR>0 A4 G5 o5 ^/ h
  F" O. M8 S0 T( N) a: N. I$ Y

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 17:31 , Processed in 0.187500 second(s), 23 queries , Gzip On.

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

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

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