|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
windows下很多人都使用source insight 编写和查看代码。linux下可以使用VIM,刚开始会觉得VIM像windows下的记事本,而如果使用得当,它并不比source insight 逊色。
& S6 t6 y" r1 v/ F' k& `' K+ j0 D: b 在这里,我会尽我所能细致地讲清楚如何把vim变成source insight, 然而你仍然需要积极地思考,并且必须自己去摸索一些东西。* v% ?+ q( S; r3 K. M: [' Y
为了避免过于罗嗦,我把基础的部分放在后面,如果你越看越觉得太简单了,那么本文并不适合你;如果看完前面的仍有疑问或者看不懂前面说的是什么东西,不用担心,后面会有一些必备的知识介绍。, u6 |: P. A( X9 ^
* R( x) V# o6 |2 t/ X* j
一、用好系统自带软件ctags: N" n" |# e$ D) x# n, M6 ~7 K% {
大部分的unix系统都有ctags软件,它能跟vim很好地合作。
) c$ s% J F( U用途:1 N: a& Q( f5 i! [; z& z
生成c语言的标签文件,实现相关c文件之间的跳转。
3 Y% C5 W9 c0 v5 k! I" c用法:2 F& M1 S6 s ~; @5 E' Z% Z/ Z
1.生成标签文件8 j7 B% }* W$ `4 g
在当前目录下(运行$提示符后面的命令): # A( S( {/ {' d x4 U- g+ ^: i+ K& A
$ctags -R ./ m6 o3 J' b) c" M
-R表示recursive,递归,为当前目录及其子目录中的c文件生成标签文件。最后一个.表示在当前目录。1 I5 y( p* g2 s8 \) b
运行完当前目录会多一个文件tags,就是c标签的索引文件。7 I2 t3 w1 l0 `! @+ ]; b+ ]5 V
@9 _5 C; B! u7 U2 S0 ~: T8 |, R k0 E 2.跳转
+ ]0 U1 l% z2 U5 }& J6 r/ V/ R2 i" o7 ~ 1)用vim打开一个已经建过标签的c文件 # I. T" ^. i7 o8 \. B3 c
2)ctrl+] 找到光标所在位置的标签定义的地方( C! I* Q, n' x/ s% v" Q
3)ctrl+t 回到跳转之前的标签处
8 Y7 T/ c8 R4 L x# Q2 R8 m/ |+ U 注意:此时运行vim,必须在"tags"文件所在的目录下运行。否则,运行它会找不到"tags"文件,而需要在vim中用":set tags="命令设定"tags"文件的路径。对于一个稍微大点的项目,你可能在任何一个目录下打开vim,然而在每个目录下都生成一个tags文件并不 是个好主意,那么如何解决呢?方法是在.vimrc中增加一行:
3 S8 v; B0 H' |6 D" N+ \ set tags=tags;/
6 h% ?- {# g F. W. y 这是告诉vim在当前目录找不到tags文件时请到上层目录查找。3 \% j; ~& H* _1 m! J. g
$ x5 @( G7 h7 b- \二、需要额外安装的脚本:' G% u$ U! L1 ?1 Q: I
- X4 d6 }7 P# ?+ ^4 N
1、taglist
" L, L/ e' D1 n7 {1 I下载地址http://www.vim.org/scripts/script.php?script_id=273
* T, z1 u$ p' @若你下载时地址已改变,请到 www.vim.org 找到正确的地址,这很简单。
4 q% J5 `9 W9 ^: Y0 g8 H6 F0 r [# p F9 Z; r
用途:; a- T$ B @+ Z) ^
打开后,可以显示源码的整体架构,方便地进行跳转。(用惯source insight的人一定勾起某些回忆了^_^)
3 B- F2 k7 p3 Q$ c5 n用法:) W0 ~* `& X/ M1 S# ^
下载插件并安装,使用时在vim中输入命令8 X! l4 f" N- a4 L+ @. i
:Tlist9 U3 M& W# a% J: G# Q$ z& {
即可打开/关闭taglist窗口。1 p+ J6 Z! \0 A# A' ?: d% `' Z
一个简单的方法是设定快捷键,在.vimrc中增加一行:' E7 d) y0 K5 ?, J, i
nnoremap <silent> <F8> :TlistToggle<CR>
: K/ W. _( f& z! G 这样在vim中按F8就可以打开/关闭taglist了。
O6 \1 N: q5 t, c& _2 s5 d9 y 更多相关配置请看后面关于.vimrc的介绍。: P V, e: w) v
{. P; c" n" M. T8 k5 G8 K0 e
三、基础知识探讨0 x* r$ w% ]* D$ c9 }! c
) X8 Q$ W% x5 D( ?
约定:为了方便和准确,我们约定本文中"$"标示符后的命令为在终端下运行,而":"后的命令为在vim中运行。# ~$ r" c9 t( r
4 i9 ~4 c1 u, X" ? H
VIM的配置文件一般放在用户主文件夹下,也就是非root状态时在终端运行
' M7 B" M* R+ y( s1 m$ f $cd ~/
0 K9 F9 w# h5 A! `1 [ 会到的那个目录,文件名为.vimrc。9 D- }8 }% ^$ b5 W" _: X! r# O3 D
看不到?有两个可能:
1 O8 V- ?/ T1 Z% w( @, Z 1、文件名前面有一个点,表示是隐藏文件,ls查看时需加-a选项。* X, _* K9 c& {. X' m2 m
$ls -a
; W; T* Z0 a) k5 A9 R 2、你还没有建.vimrc文件,自己创建一个就行,先建个空的吧,以后可以不断往里面填东西。
$ T2 Z4 }9 X. c \7 ?3 d( T: b $touch .vimrc7 u* F$ I4 ]4 E8 C7 a
, C" N' O4 F# D* v
主文件夹下还有一个.vim文件夹,没有请自己mkdir( r8 l$ ^$ E! n' W2 ]
$mkdir ~/.vim+ C9 G! U3 N# q7 V
在.vim文件夹下,再建两个子文件夹:plugin和doc
% F! \' I# c1 p' p. `& F8 Q7 j" a $mkdir ~/.vim/plugin
$ P a3 w; `2 V) @3 M $mkdir ~/.vim/doc
+ g- B. f8 U0 E1 ~- g plugin文件夹下放插件,doc文件夹下放相应的help文档。1 I2 n' W+ J! D5 x" ^2 |) W
去下一个taglist吧(我们应该把它叫作脚本还是插件呢?它是放在plugin文件夹下的,那么应该是插件;而在vim.org,它是作为scripts存在,那么应当是脚本。),我们当作例子来请解。; l/ t% m# S* _# D% n$ i8 ~
下载的是一个zip包,把它放在 ~/.vim 目录下,然后 F/ k4 \. a5 a1 B" P
$unzip filename.zip2 d( m7 U$ C1 Y4 i1 V) D% J' d
它已经自动把taglist.vim和taglist.txt分别放到plugin、doc文件夹下了。% [( J. A( w3 Y/ i
这时重新启动vim
% k7 M4 G- Y: ]' V( z5 [% i $vim
( _0 x q6 }2 G2 c$ M( G1 Z 运行6 R& m+ U5 f6 m
:Tlist
# n8 K1 B2 N+ Y; J 发现旁边多了一栏没有?如果你打开的是c文件,并且已经生成了tags文件,那么里面应当会显示一些有用的信息。
9 w3 T$ D5 w% N4 y) v 这个时候,taglist的help文档已经在 ~/.vim/doc 目录下了,但是你在vim下敲
$ g( w7 y+ o* E :help Tlist- b6 h. H2 s6 W2 o
却没有任何反应,那是因为vim还没有获取帮助文档里面的tag,解决方法是在vim下1 O6 d- ~7 i A3 ^1 V/ d
:helptags ~/.vim/doc
- f( I& R) G9 k6 l/ s i5 t% J 现在,你再7 N; o+ d1 @. r9 p0 a; L; w( i
:help Tlist6 N! U+ F% @# W4 K& `
看看有没有反应?
7 T% ~ x& V8 N2 d7 y, K& }
! h) e5 N7 D8 ?. ]! |( t1 n# Z8 p 关于.vimrc
# V# J' P- _0 r; O: x- P 我自己的.vimrc也在不断地完善中,完善的过程中得益于从网络上获取的很多知识,感谢提供信息的朋友,也是他们促使我写下这篇东西。我把自己.vimrc的一部分贴在下面,你可以把这些根据需要加到你的.vimrc里面去。$ [9 N5 S, I1 i% e/ K
$ ^" V0 [2 ~( j6 P+ ?2 J7 ~' Q".vimrc
. {( v! @5 B. f6 }8 i" u& W9 Q"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
$ Y# V6 e- E) ^5 D4 y0 ]: j" General
" ^: ~& {: W m9 \; `"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
6 {( q# Y- S: @- s8 o, J6 A. I"For ctags, then it can find the 'tags' file even not in current directory( h2 w: k8 @: e% S% T/ v5 J
set tags=tags;/
. \% j3 N9 Z5 S8 n" q( Z) G) @+ l9 k/ f/ B. B$ v5 c4 s" j- U B
"Get out of VI's compatible mode..7 T! u* n" G: B4 W3 ` q3 X
set nocompatible
3 {8 P1 A: z* I! i: L; v
" z* E8 J) G) t7 _; B% C* }- ~"Sets how many lines of history VIM har to remember9 y$ h5 d+ g+ t4 M% \5 ~' _6 H+ {
set history=4007 M, [+ z* a6 V: M% g. C5 C: o
$ A2 I4 N, P! K3 M6 C# E"Set to auto read when a file is changed from the outside) D+ H+ C! g- G0 j/ b- v# ~- ?* Y- c
set autoread
0 N9 [7 y$ |+ v) O" @& ?6 |/ y
"Have the mouse enabled all the time:% H0 g7 Z7 Q4 m9 O
"when you need to copy from vim, maybe you have to ':set mouse=' first) L- ]* d4 t( j# T; p5 a, s
set mouse=a' K+ [. R- h) S( `0 W
0 D7 X1 W8 `/ H
"""""""""""""""""""""""""""""""""""""
2 R; s4 y5 I: F- _" Colors and Fonts- o2 J0 ~/ T/ |$ S8 X
"""""""""""""""""""""""""""""""""""""
. U. h* {" Y9 j# L2 G' M, |"Enable syntax highlight
, x# m1 c; V, Y$ `1 [* Wsyntax enable# \3 M" I- K" R; {6 _% V' W) N
, U2 R7 d3 j; B9 `"set colorscheme
: ]5 }; V$ d. Kcolorscheme elflord
K& `+ [' x$ L& H"endif& s: J* g2 G" w H1 f$ J
! _' D3 h' ~/ M/ c! M" T( _* p" s
"""""""""""""""""""""""""""""""""""""
& g6 _' F- ^/ v4 R6 m! N1 t" VIM userinteRFace
' @6 _) a2 ]0 h! d# L( O9 q* b"""""""""""""""""""""""""""""""""""""
% \2 ?' a* R/ k. I"Set 7 lines to the curors away from the border- when moving vertical..
4 H. P% A' L! H4 g, ~set so=7* x/ ^2 C8 X7 v# ]7 |6 u
0 A% v2 @0 K- i7 c! c" x
"Turn on WiLd menu1 \, I# ?- \, S0 h
set wildmenu
+ c! \6 h/ i& U: q0 f/ p+ ?6 E& R" M, x9 C' E3 ^9 ~$ ^/ l
"Always show current position
, K" O7 P& h& Hset ruler( G- p0 w/ M& I N" |
0 O# }' n" f* R) q4 L& `$ z2 w
"The commandbar is 2 high
, }$ A6 B5 \# kset cmdheight=2: d7 ~, ` \( ^3 J
5 j2 `9 y1 b; \2 o6 r6 A( _3 R9 ~
"Show line number0 [; g0 r3 e* O6 b
set nu9 P( \# i G8 V$ M! d6 j4 f) t
`: P4 C" F. `, ]$ H" M) b"Set backspace* L/ T& {: y; {2 `8 S/ k* P
set backspace=eol,start,indent2 Q: J$ C- m- G, z" r: x0 e
1 Q9 y0 F: E! }
"Bbackspace and cursor keys wrap to
5 x* Y2 i+ l) f9 {5 `set whichwrap+=<,>,h,l8 t! H \, d0 T7 n
3 F0 `$ I; t; G' Z4 k8 ?+ G' [
"show matching bracets6 U( h; P3 y& X) t3 b1 ?) E# F# B
set showmatch# ~/ T4 b1 o: p9 I. B
: T. @* t; }" M, E"How many tenths of a second to blink
8 U6 a0 G# F& M ^0 eset mat=2
0 D& H: W1 F% b
8 G. R; W [8 n+ W4 z+ N"Highlight search things
2 F' k. \5 f* o" R: ]set hlsearch! M; L; o* f* `8 o
"imediately show the search result
# f% ~( Y1 Y! Yset is
$ T- C; a, G% M9 t* v, B5 \# h* s9 W7 @* K( h
"""""""""""""""""""""""""""""""""""""9 S" h! \3 d3 s' w/ ^# t; K
" Folding. a* [ P3 x3 C& k3 A
"""""""""""""""""""""""""""""""""""""
( Q) n1 x& j' t2 Q7 l @4 b"Enable folding, I find it very useful% h6 v+ G7 W# L+ W0 z
set nofen
3 M m: M) V9 [! N0 L" W2 u" q! nset fdl=0
; j& s6 o' U% \( m, g% y
3 o' _. G+ n+ C) v7 m* c$ l0 k3 \" h* T& }7 J" i3 L
"""""""""""""""""""""""""""""""""""""1 t v) Y* N6 ?0 s8 E: z
" Text options! q9 n3 G1 t: H2 Z5 A7 ]
"""""""""""""""""""""""""""""""""""""
$ w- i# d: t. G0 ?set expandtab9 S+ H2 \2 _$ z& F9 Z1 A
set shiftwidth=20 n9 g! C( l% D+ o# c; z
set ambiwidth=double
+ I& o& g$ m0 a. Y' `. Dset smarttab
) }$ _# |3 }$ v0 g"Set Tab=4 spaces
, N5 g8 N& S7 [+ R Qset ts=4
7 g7 p# u% D- v2 [set lbr
U [( H6 ?9 K2 ]set tw=5000 E; x. f' {( o, X
set selection=inclusive- m- c2 T: m3 E6 ]
"""""""""""""""""""""""""""""". _' m. P$ Y0 g- B2 O: k
" Indent- Q; d9 ]7 d- n
""""""""""""""""""""""""""""""$ t5 V2 f3 a9 c" Q. T
"Auto indent
: A/ [& Q6 d) K set ai
+ I0 Y, D F9 f: |$ k0 S | "Set auto indent width = 4 spaces" v6 u1 r/ I& h, f
set sw=4
H: F" w! u" z! A; ~6 W: u) r5 |4 ^; Q" L$ k( H2 Z
"Smart indet+ J: X* O. |- k( i8 \
set si: j9 y8 j) c' E/ ~9 T
0 s5 ^/ J1 g4 W% J& m, Q4 X# ? "C-style indenting
: f% L5 b" w" Y! K- f! H% ~ set cindent "usage: select codes, press '=' key, the codes will autoindenting+ S2 g T+ G/ g" F& z @# c; w
- g! O, L2 a; u9 h9 \
"Wrap lines; f) z& L2 X- T
set wrap, ?- m: {2 L9 T$ a. ]0 m3 k
/ T: r: ]3 j% d"Encoding settings9 ^, i( _1 _ v' s( |0 P
if has("multi_byte")6 Z: W- n, X1 C7 O% {
" Set fileencoding priority
$ S9 G6 @, G6 i5 \$ J if getfsize(expand("%")) > 0
' H. g1 ]9 Q3 |2 u( o) f& b set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1+ X0 L" w% _* V3 M: S
else* u, ?& Y! ?7 h x* @$ U8 ^+ C
set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
# U2 J. d0 o" }. F4 b- R; ] endif/ N( O# B; e9 J' K0 l" r8 ?
3 u2 G( z8 Q" \0 m1 o " CJK environment detection and corresponding setting
/ w. |* Y% G* L3 {# R8 B5 X( P if v:lang =~ "^zh_CN"
6 K. l0 N" o% f8 w2 i) l " Use cp936 to support GBK, euc-cn == gb2312$ c: w) f: e3 l/ u
set encoding=cp9361 z* S+ ~4 e8 F/ o
set termencoding=cp936
& p! M8 S) b, ] set fileencoding=cp936! W$ G+ P! b# S1 R! O! @
elseif v:lang =~ "^zh_TW"" M% J) {; f7 }7 a( t" E# M
" cp950, big5 or euc-tw9 ^2 s* P3 B: d
" Are they equal to each other?
) z( M( _- n0 i. e; l3 @9 j" u set encoding=big5
. _4 f7 g# Q* ]+ T( H" x/ c0 i set termencoding=big50 }2 p4 r6 k0 ^3 w0 D( y4 o
set fileencoding=big5
. m$ o; Z i8 j elseif v:lang =~ "^ko"2 k9 L: M" C, A' ^) M
" Copied from someone's dotfile, untested
a5 Z( t. H3 A- }5 @% |( o' ?* S set encoding=euc-kr
5 a e. \% q v6 L set termencoding=euc-kr
% [/ {1 M( p# Y/ G2 C; C set fileencoding=euc-kr/ T* I- b: X* n) i8 G* |
elseif v:lang =~ "^ja_JP"
; e& j+ l! M5 e' t' ] " Copied from someone's dotfile, unteste
3 K$ k. G9 g& K/ x. C, C) J S/ N& ? set encoding=euc-jp) m3 v' B0 {) G4 D9 S
set termencoding=euc-jp
2 @$ m- t2 ?) K$ X1 |. B/ p+ q set fileencoding=euc-jp" L0 Y" h$ N# @1 Z1 ?: e
endif
+ e- x* U, g* D/ @8 m2 ?" ] " Detect UTF-8 locale, and replace CJK setting if needed
) M. [% S! u0 c0 b if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"& x* b& E. N* {4 `0 Q
set encoding=utf-8
9 ]# g* c% i. d. [4 Q set termencoding=utf-8
- L1 b! Z: W1 f* M& s: _ set fileencoding=utf-8
0 f f+ a( p' M' T/ A# Q endif
. X5 A% u# ]3 g3 Y+ |+ P' p& Ielse
0 [. s1 r+ r$ g9 D; w3 } echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
5 a! _3 v. @9 _endif
3 V6 @2 B! @8 N, M! v7 @2 F0 \0 Y- {
) ^2 d. S5 i/ w; j! {6 @- U& D5 e) v; L+ S% U
"""""""""""""""""""""""""""""""""""""3 z% z- N+ _6 O2 a7 a! g* T5 B
"plugins
! n# _3 R0 O' E- K' F- y
* F4 I9 F& |* K7 e9 a& w# u"""""""""""""""""""""""""""""""""""""6 }- g7 {9 M0 {, K2 u
" Tlist X# b, G/ B( u: @
if &diff
- f. L) V1 d! B& m9 F& Qlet Tlist_Auto_Open=0 "don't auto pen when compare two files, j; D. o8 g1 L2 @
else! |/ b% u6 ?3 d! B5 W
let Tlist_Auto_Open=1 "auto pen Tlist when open a file1 J% L' z! n I e. I' w
endif
3 H4 [, O$ h. Z7 s- X" b$ O C7 d7 A
"set taglist window in right, delete the following line if you don't like- g6 j% {8 ]: ^3 I. h; m
let Tlist_Use_Right_Window=1& m/ o3 v; X) W$ Y7 ^6 m
let Tlist_Auto_Update=1 * _ Q1 V$ W( @
let Tlist_File_Fold_Auto_Close=1* _& y i' f7 C* J/ H: E" O" v
"auto close Tlist when exiting file.4 C4 p ], n( o" i
let Tlist_Exit_OnlyWindow = 1 6 h2 p7 { Z4 ~& ^. q
, H' ?% j: {1 T) U7 L- m* u
nmap <F7> :copen<CR>/ _2 C/ v# q& n8 W9 V
nmap <F6> :cclose<CR>$ v9 _% R: j- k* J. c: j0 v
( P1 Z* p( b1 l
|
|