|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
windows下很多人都使用source insight 编写和查看代码。linux下可以使用VIM,刚开始会觉得VIM像windows下的记事本,而如果使用得当,它并不比source insight 逊色。
$ J V F# }% o# R: ?" \ 在这里,我会尽我所能细致地讲清楚如何把vim变成source insight, 然而你仍然需要积极地思考,并且必须自己去摸索一些东西。6 ?$ [% M" G; A X* D
为了避免过于罗嗦,我把基础的部分放在后面,如果你越看越觉得太简单了,那么本文并不适合你;如果看完前面的仍有疑问或者看不懂前面说的是什么东西,不用担心,后面会有一些必备的知识介绍。
9 P0 N9 @( _' w( \5 E! ^4 V P' L( A& E8 R; N Q% h/ w
一、用好系统自带软件ctags
$ ?7 u3 B5 _0 ]& r. u* M大部分的unix系统都有ctags软件,它能跟vim很好地合作。9 v( v H- F1 q6 a8 A6 z3 L; e3 B) i
用途:
+ u+ E3 r4 x1 ]2 K3 t u4 w2 n 生成c语言的标签文件,实现相关c文件之间的跳转。
6 \3 v* q2 g2 \# p, m) b用法:4 d% m! M. ]" |/ K$ }+ Q
1.生成标签文件+ G& Z5 ^! E2 z% I8 C; b
在当前目录下(运行$提示符后面的命令): 3 g+ t. G+ G( Q2 L) o% S3 |
$ctags -R ./ O; m: h1 c# Y2 |% Y7 i7 S
-R表示recursive,递归,为当前目录及其子目录中的c文件生成标签文件。最后一个.表示在当前目录。
0 a+ s8 n1 D4 |8 G% t2 u 运行完当前目录会多一个文件tags,就是c标签的索引文件。1 w0 c$ t8 d7 \9 m0 k
$ S' }) V) }# H3 z, ~4 s2 o
2.跳转
7 Z- X, }: Z6 T/ J 1)用vim打开一个已经建过标签的c文件
3 E4 a5 H0 X# z4 b7 q 2)ctrl+] 找到光标所在位置的标签定义的地方, c4 c* g }4 S g0 j4 O
3)ctrl+t 回到跳转之前的标签处
; K3 K( c9 v [5 m 注意:此时运行vim,必须在"tags"文件所在的目录下运行。否则,运行它会找不到"tags"文件,而需要在vim中用":set tags="命令设定"tags"文件的路径。对于一个稍微大点的项目,你可能在任何一个目录下打开vim,然而在每个目录下都生成一个tags文件并不 是个好主意,那么如何解决呢?方法是在.vimrc中增加一行:
% G; E" ]6 q2 b; P set tags=tags;/* T, x& l& m: {' n, @
这是告诉vim在当前目录找不到tags文件时请到上层目录查找。8 k9 w" B/ X# ^8 G o5 U# ^
6 U4 b! M* J3 }/ g二、需要额外安装的脚本:) p; R- L" P& C( s
# N) q- H+ q) | i5 w
1、taglist
5 m& N9 e8 J% [1 x下载地址http://www.vim.org/scripts/script.php?script_id=273: E7 _) d. T$ g
若你下载时地址已改变,请到 www.vim.org 找到正确的地址,这很简单。
' }1 m5 \$ T" t7 k" _* T+ p6 J6 h% K) L! f0 Y% U- W
用途:& B3 T/ d6 B+ _3 [* M# f' \, ^
打开后,可以显示源码的整体架构,方便地进行跳转。(用惯source insight的人一定勾起某些回忆了^_^)- j+ R6 x3 M3 k+ T
用法:
' P8 ~0 p2 f- @$ t 下载插件并安装,使用时在vim中输入命令
- O( n+ X& A X; ~ :Tlist' [9 J5 S, l8 M% h- E
即可打开/关闭taglist窗口。$ w4 V! J: _3 A3 m1 ~: ^+ h
一个简单的方法是设定快捷键,在.vimrc中增加一行:( q' i5 k8 D- W" }7 m( p% {- M+ U
nnoremap <silent> <F8> :TlistToggle<CR>
. M8 T+ v! x1 W/ L# o 这样在vim中按F8就可以打开/关闭taglist了。! ^8 p- s" r7 q* ^7 ]- W6 O
更多相关配置请看后面关于.vimrc的介绍。' ~$ w& o: Z4 z: h5 B
- `1 l1 O! z: {! @
三、基础知识探讨; r Q7 W) V, t3 R& g) |" X
0 S5 {- v) w/ d, q$ M& F. d 约定:为了方便和准确,我们约定本文中"$"标示符后的命令为在终端下运行,而":"后的命令为在vim中运行。1 e- ~( O/ M) L: U+ q( n {5 e [; ~
5 U2 `4 @. a( H/ V/ y
VIM的配置文件一般放在用户主文件夹下,也就是非root状态时在终端运行8 U4 K. g- C/ g4 S* G
$cd ~/! J9 b9 `+ ]) T% ]
会到的那个目录,文件名为.vimrc。$ d- g F6 ^) X( ~! }" V. }
看不到?有两个可能:
4 h: V4 x1 z/ {+ |/ S/ a8 R 1、文件名前面有一个点,表示是隐藏文件,ls查看时需加-a选项。0 L0 ^0 K% u) k0 o, _! G
$ls -a) ? M' y; Y9 q! q' w% k
2、你还没有建.vimrc文件,自己创建一个就行,先建个空的吧,以后可以不断往里面填东西。2 e" l5 D6 n: ]! n* [6 m/ j$ w+ y) {
$touch .vimrc
7 M2 U& ^9 H: s; u# Y4 _
/ O8 Y" T# v+ B: c5 F- M 主文件夹下还有一个.vim文件夹,没有请自己mkdir
: @' K) ]" K( L $mkdir ~/.vim
+ Y$ X" d" _0 }# {$ T I" j 在.vim文件夹下,再建两个子文件夹:plugin和doc
! G9 d, p+ R& G6 m+ j4 X2 }3 E' x* ]/ P $mkdir ~/.vim/plugin& \4 e1 p5 ?6 i0 b2 F6 v0 X' k" q
$mkdir ~/.vim/doc" t0 c0 _8 E9 ]# n% _* _# G
plugin文件夹下放插件,doc文件夹下放相应的help文档。. W7 b$ y. U; z" k1 U: v& n+ o
去下一个taglist吧(我们应该把它叫作脚本还是插件呢?它是放在plugin文件夹下的,那么应该是插件;而在vim.org,它是作为scripts存在,那么应当是脚本。),我们当作例子来请解。
9 F4 Y2 G, \* o* S( \' V4 k8 F 下载的是一个zip包,把它放在 ~/.vim 目录下,然后
2 ?+ U7 T* M/ Y6 r+ S $unzip filename.zip! o4 X4 A) c4 R6 c
它已经自动把taglist.vim和taglist.txt分别放到plugin、doc文件夹下了。# x7 ? m& {6 v& C0 X1 s
这时重新启动vim
" C' d2 W; u, u) _ $vim
/ v7 T# P) Y2 ]1 [ 运行; ?7 B* X: ^( a/ E$ l! W0 k: q
:Tlist: R/ S0 T7 A1 A0 ~; t( v [
发现旁边多了一栏没有?如果你打开的是c文件,并且已经生成了tags文件,那么里面应当会显示一些有用的信息。% o1 K' }6 Q: z4 |9 ], H
这个时候,taglist的help文档已经在 ~/.vim/doc 目录下了,但是你在vim下敲
, v" \0 a6 V0 _/ F9 E :help Tlist
# g9 Q+ U* G5 j0 E; p% i 却没有任何反应,那是因为vim还没有获取帮助文档里面的tag,解决方法是在vim下, P4 z7 W+ g0 K: f% P
:helptags ~/.vim/doc# G ^: ~; h# |, Z
现在,你再5 v: {) y# w( C) O& Q9 }! u
:help Tlist
, {. i- U' K4 Y" N5 x& @ 看看有没有反应?
. B% e% y8 L* j! M1 i# y0 e+ [% e4 s9 l6 q
关于.vimrc
$ U& F2 f# M! m/ ^7 D: ~/ G 我自己的.vimrc也在不断地完善中,完善的过程中得益于从网络上获取的很多知识,感谢提供信息的朋友,也是他们促使我写下这篇东西。我把自己.vimrc的一部分贴在下面,你可以把这些根据需要加到你的.vimrc里面去。9 R" Q) k7 h6 T
5 G% O% W% G( x n
".vimrc
! s0 [6 P2 K/ Z5 V/ k8 s( o: E! K; G4 G"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
# |% f% G/ u- _/ S" General
. k+ A+ F% u& I2 t0 ^0 v- ^! d- E"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""5 v4 X; |0 y5 z: H, g
"For ctags, then it can find the 'tags' file even not in current directory. }9 U, ^ O2 f1 |. x& J3 j
set tags=tags;/* a- b3 Z; q" [: m
: I5 F g f% ~: O* _
"Get out of VI's compatible mode..
8 o$ |* S: q: G# I$ P% rset nocompatible
( o6 F2 q! B: k) H& ]# X3 N# d5 A
"Sets how many lines of history VIM har to remember& R6 o9 G/ ]8 J" R
set history=4004 R1 [; J3 j8 o% B/ p e( P
5 Z* T# L. N' k4 ~3 T9 C" F& G
"Set to auto read when a file is changed from the outside
7 Q( S# j( h* C% zset autoread
9 u& f( T" j& u& P0 \6 _0 g! V' s' G5 [0 E0 s5 _
"Have the mouse enabled all the time:
: ~8 d0 \& j/ u1 S0 G0 q"when you need to copy from vim, maybe you have to ':set mouse=' first) G; g5 `' y' j, ~. q3 w! [
set mouse=a6 \$ Y( t) [0 e8 s8 k& G+ K
, x" G) _" j6 w1 y
"""""""""""""""""""""""""""""""""""""
) M4 w- }1 w) h/ A" Colors and Fonts* T0 d2 M' l( f+ J. c
"""""""""""""""""""""""""""""""""""""' S8 j% \4 L5 G# r8 I
"Enable syntax highlight- ~6 {1 P2 c7 @
syntax enable
, n# f R6 |% n5 ]: H5 o& o
( p( ~1 i6 ~% Z8 q"set colorscheme
, _7 u8 `: D. c" G' M, Bcolorscheme elflord& }% E f" q9 M
"endif
* f! b# ?4 ?- S$ i, l8 R/ b( U+ k: j% R+ _) O+ P
"""""""""""""""""""""""""""""""""""""
$ c4 D9 j2 K8 o' @" VIM userinteRFace
0 n3 N* f1 e! r& |; O"""""""""""""""""""""""""""""""""""""
- r* k! {$ V1 ^8 ?* C# a"Set 7 lines to the curors away from the border- when moving vertical..
/ V7 H( z% N; W: sset so=7# O) c; k+ L8 q4 M3 P' g
" N4 J8 Z. w2 }) N6 a
"Turn on WiLd menu4 ?" a+ W7 ?" e0 i# \! @
set wildmenu
- p/ @+ E- g8 U7 l* g/ Y+ K1 T5 O4 |; e h7 B
"Always show current position% x E6 U9 l, Q/ X" C- R& P
set ruler) l/ F9 d9 ^* V0 S' h% Z! V
a' }7 n* y, e6 ~
"The commandbar is 2 high
) v4 n, W4 \5 nset cmdheight=2( h' a" C9 x# ~8 |/ G M. f* e
. S$ U+ I* j. u! |( m/ {: b"Show line number$ n% e3 k& r, `$ t
set nu
0 F* e4 W6 P# V, `: K2 h4 X8 s9 Y5 Q4 r8 t) N( q
"Set backspace9 j2 k: I) c' ^; ~
set backspace=eol,start,indent
# D& A$ D) h6 ~+ h$ ^+ I; ~5 X* v. X, P( u
"Bbackspace and cursor keys wrap to8 ?: K5 ^5 H4 z% s3 l) f
set whichwrap+=<,>,h,l6 x5 g# L( ?4 N3 |2 |
6 J8 }3 T, d' ^$ V5 c/ C
"show matching bracets
. c6 l/ a* U. p1 G& c' Rset showmatch! ~- U4 d S+ t5 ]9 ^
! k& _: J' S1 l! Z. q* t4 |"How many tenths of a second to blink
1 m' v: x& u i# M' c, i% U- ^' x4 aset mat=2
0 k3 B- o* p" Q# Z, f" d2 i) ?0 k& F- K4 V
"Highlight search things6 r ?! |, B8 Y( x" `1 \
set hlsearch
9 j1 L6 R( J5 s4 ]. [# O2 g( b p5 a"imediately show the search result! D3 `2 t( g7 Q; `6 E
set is
- \( ~/ P. d: F8 {" s
( e# J: T( i% {: k/ g# Q! z"""""""""""""""""""""""""""""""""""""4 Q0 v# J1 k4 o8 t* t- ~6 L2 x
" Folding
) H0 { D3 W5 T"""""""""""""""""""""""""""""""""""""+ z. y2 i) {! [3 h/ _* x
"Enable folding, I find it very useful
/ |9 I8 _: I: F0 z+ Rset nofen5 r! s' l5 b" p) ?1 D# ^5 N: d
set fdl=0
# D6 b) ]. p$ I- K Z& P* l1 R" U" J( x6 a8 Y
' ?# M) j# |1 g P2 H- k5 s' A+ P p"""""""""""""""""""""""""""""""""""""
7 P/ ~( e( z8 x! h7 g" Text options
" r* {4 d, ?1 d0 p) G9 p( w"""""""""""""""""""""""""""""""""""""1 Q, \7 b& P0 J+ S
set expandtab7 z8 X! z+ J# l* F# j2 I" ^3 A& N
set shiftwidth=2
1 {0 L% R7 M; b3 s1 rset ambiwidth=double
" q3 J( Z( L5 n, {- @set smarttab M! x, M, B( U$ M! Q% w
"Set Tab=4 spaces! S6 ?2 S3 T9 ?! q* E: |# c
set ts=4
) [ y" d) W, F9 ^set lbr
0 \6 F) N" [# a, K& Kset tw=500
& p9 W2 H& n: m/ _) J" bset selection=inclusive
& d9 t8 K C: c& u- t """"""""""""""""""""""""""""""
# Q! @8 Q5 b) G( _0 {) w9 N+ x " Indent
! q$ F/ \* I, V9 Z" W+ ?- z1 d """"""""""""""""""""""""""""""3 u9 G; k9 {% f
"Auto indent
' F6 i7 n6 ]3 G6 K6 g+ O set ai
- |- d5 G* I# d" G+ _ "Set auto indent width = 4 spaces
9 J8 `* h& p4 H/ T set sw=4( Z3 g* w" n( X- p' o
0 ~ x# U5 b4 o8 ?1 L& e$ u+ x1 q- }
"Smart indet
# s Y, a4 R) I! j# `' ? set si
% [. J" u2 k& `# v' C( C0 [
* v7 t& q* a4 O; v "C-style indenting
$ |+ n, E, Y. D! K set cindent "usage: select codes, press '=' key, the codes will autoindenting
8 u7 h# S; L [ y0 Y" y
6 y0 {+ M8 B9 f- Y# t7 B0 E "Wrap lines) U3 l& s+ Z% H
set wrap
, Y0 h: E) X! d: y5 ?0 h0 p! `0 \. s- V. f/ A O( ^- X
"Encoding settings9 S/ ]1 W) z- L4 i& c& {% V) M
if has("multi_byte")
2 v; i! ?$ Y7 Y/ B9 T8 \8 O " Set fileencoding priority: [8 c% Y$ v, z) D0 `9 n& ?8 K
if getfsize(expand("%")) > 0$ h! _; G+ W6 t+ K8 v' M
set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1" y5 \( B4 T* n9 ^" }" f
else4 P4 o# d) i) r7 b
set fileencodings=cp936,big5,euc-jp,euc-kr,latin1% _- u# \- l# F" b' ?
endif
$ l& L' P! _( H
! `# b: Z% f9 F0 [3 H6 g " CJK environment detection and corresponding setting* z- M+ O, V; O. V8 h2 V1 i
if v:lang =~ "^zh_CN"
. P4 R: V- ^0 N. ?/ W0 D1 Q " Use cp936 to support GBK, euc-cn == gb2312
5 Z( O1 n3 }) z# d set encoding=cp936
# F5 V) ]- r, _2 N. b set termencoding=cp936
5 D) E6 y H. n% a' k set fileencoding=cp936
4 o2 g4 o9 @6 ^& { elseif v:lang =~ "^zh_TW"0 q- r/ H3 u. m$ V( J/ t' _6 h
" cp950, big5 or euc-tw
/ z6 e9 ^ v5 |5 y4 H0 w " Are they equal to each other?
: T# U* q S. C- i set encoding=big5! J1 i6 U+ a$ D7 i2 b O9 F
set termencoding=big5+ B9 G: U/ W' c/ `' \
set fileencoding=big5
T; ^$ _2 z% Z! k' b elseif v:lang =~ "^ko"! k6 x2 _) ^1 Z; k: o1 U
" Copied from someone's dotfile, untested
3 C" u; D; ~, }3 H9 j set encoding=euc-kr9 r0 f* h; k6 } H& d* X
set termencoding=euc-kr6 s" P2 `& ^( k$ J, a+ \3 E- U
set fileencoding=euc-kr+ I' s D) P* y9 g5 U
elseif v:lang =~ "^ja_JP"
* B1 h9 \' e) ^3 b _. D: v2 S " Copied from someone's dotfile, unteste
/ c9 g5 `9 _# j' m q set encoding=euc-jp; \& }4 K' k0 A- [
set termencoding=euc-jp: Y& Z$ t1 K7 q+ R* O7 O2 \* G
set fileencoding=euc-jp
- I1 J* c+ r5 o$ |5 a& w+ t endif0 Q* W( t W% @; C" V
" Detect UTF-8 locale, and replace CJK setting if needed0 ~ J' x B" t" P/ G
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
$ ?) w" Z( |. n set encoding=utf-8$ x8 z. V) m: ]( v$ @9 P
set termencoding=utf-8
+ E3 z, c6 W2 `3 h set fileencoding=utf-8# Q/ i# \% T6 i
endif! }6 h6 c+ Y$ X+ K E
else7 X* _* M* }5 v" e7 U% f
echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"( n1 a$ U# p( Q P8 t
endif" H4 z1 e! o- E$ a
3 P ^' B0 i- d* i M
9 P6 t' j" k4 ?8 u$ i, R' N
"""""""""""""""""""""""""""""""""""""
5 q0 W7 g3 k: x# |! D+ b. d"plugins$ P- b0 L' Y1 n2 i
9 Z: ]( {: @* s( c1 t* ~3 A4 E
"""""""""""""""""""""""""""""""""""""3 |& ?3 z4 j0 Y5 b+ J0 P9 }
" Tlist3 a$ E2 p6 g+ h* A
if &diff v" A2 L# z# ]0 U. y2 I% z
let Tlist_Auto_Open=0 "don't auto pen when compare two files z1 f+ r9 b7 h3 w, x
else# {6 J# _2 K$ y, @9 {& N) Q( e, |, ]
let Tlist_Auto_Open=1 "auto pen Tlist when open a file
5 g" a' `+ g+ a* ] k* }endif
. {3 r9 ^- X# n
. o, K) W/ u3 q9 K6 |9 N"set taglist window in right, delete the following line if you don't like
) z% I2 K0 {9 B; e9 g6 ?& @! H4 Clet Tlist_Use_Right_Window=11 F- H3 j, n# j; b8 L2 @
let Tlist_Auto_Update=1
3 N4 Q- G6 x/ j/ k0 s Y/ ?let Tlist_File_Fold_Auto_Close=1
! S t+ v. ^6 D"auto close Tlist when exiting file.
3 M4 \9 w& u7 G0 b, f6 slet Tlist_Exit_OnlyWindow = 1 1 e( k J9 L! h
+ G5 {) D8 w T1 E- S" X, Lnmap <F7> :copen<CR>7 j. m. @. `( s# v4 n+ t
nmap <F6> :cclose<CR>8 k; \8 d: Z* w, Y/ z
8 j3 _- D! r+ o9 Q |
|