|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
windows下很多人都使用source insight 编写和查看代码。linux下可以使用VIM,刚开始会觉得VIM像windows下的记事本,而如果使用得当,它并不比source insight 逊色。5 h, m* u/ H6 T3 E
在这里,我会尽我所能细致地讲清楚如何把vim变成source insight, 然而你仍然需要积极地思考,并且必须自己去摸索一些东西。( y9 e9 M2 X, o) w1 e& o8 h* p+ I( W
为了避免过于罗嗦,我把基础的部分放在后面,如果你越看越觉得太简单了,那么本文并不适合你;如果看完前面的仍有疑问或者看不懂前面说的是什么东西,不用担心,后面会有一些必备的知识介绍。3 u4 f2 b# X% q
* J$ f/ x5 l7 g& A- Y* \一、用好系统自带软件ctags; y7 Z& D/ T4 A) Q) E% T
大部分的unix系统都有ctags软件,它能跟vim很好地合作。+ q- m6 G* V* t
用途:
I: }1 ^8 @4 K1 Z+ h 生成c语言的标签文件,实现相关c文件之间的跳转。3 r& m+ c' m5 @4 M9 q
用法:5 S, H5 Q6 }2 ]: a+ V* K4 F
1.生成标签文件
. D# q+ f1 S2 e+ T0 ^% m! o5 d4 z 在当前目录下(运行$提示符后面的命令): % q2 h) \: m1 m
$ctags -R .! F' q e6 Q& C# L2 H% {% b
-R表示recursive,递归,为当前目录及其子目录中的c文件生成标签文件。最后一个.表示在当前目录。% a* J! j# W' {& f
运行完当前目录会多一个文件tags,就是c标签的索引文件。 J: `6 d% S" M( Z" Y% T4 m
, J4 c* p& D% C; i' m 2.跳转; X9 k" Y) n$ K( T' w4 G5 [
1)用vim打开一个已经建过标签的c文件 0 M3 C, S; }+ q/ L' ]# c8 h
2)ctrl+] 找到光标所在位置的标签定义的地方3 L, ]0 k3 D# F$ |
3)ctrl+t 回到跳转之前的标签处
3 d9 W1 g* `* J' P" ^ C. \* N- c1 t 注意:此时运行vim,必须在"tags"文件所在的目录下运行。否则,运行它会找不到"tags"文件,而需要在vim中用":set tags="命令设定"tags"文件的路径。对于一个稍微大点的项目,你可能在任何一个目录下打开vim,然而在每个目录下都生成一个tags文件并不 是个好主意,那么如何解决呢?方法是在.vimrc中增加一行:
- ?; |; ~1 {4 C8 f& j& E* x- F set tags=tags;// Q7 Q |9 H: P& Z+ R9 `7 ]& R1 ?
这是告诉vim在当前目录找不到tags文件时请到上层目录查找。
$ q9 ]" A& E6 O' Q% A0 i" \) v$ F" D: `+ v0 P$ f2 S
二、需要额外安装的脚本:4 j, {! S4 E# q
% h% |* ^, J! d8 J( [1 v: m: y1、taglist
/ j( u' g& c7 }' P- q \: ?) q下载地址http://www.vim.org/scripts/script.php?script_id=2734 j% H8 b6 B$ ~; D+ a2 t
若你下载时地址已改变,请到 www.vim.org 找到正确的地址,这很简单。' [. {) {4 @" i' u" D# o5 ~
! m7 |# a3 X: l2 D( g; s/ i
用途:
$ L i Z: }, r- ] l 打开后,可以显示源码的整体架构,方便地进行跳转。(用惯source insight的人一定勾起某些回忆了^_^)2 `5 N3 G- ]" G5 Q" ]7 M7 b
用法:
5 [" x7 S6 u+ _$ y& J$ r) h) P 下载插件并安装,使用时在vim中输入命令6 R& }, n6 A2 f9 Q4 ?
:Tlist
0 o7 R; _% t, I+ w9 }$ |5 D 即可打开/关闭taglist窗口。" x5 y2 V N8 [( w( _0 p/ W
一个简单的方法是设定快捷键,在.vimrc中增加一行:
$ E# Z! M2 W" x1 Z2 B1 H2 f5 D* C nnoremap <silent> <F8> :TlistToggle<CR>
% U6 P# c# W- @/ k+ _' s" @1 h 这样在vim中按F8就可以打开/关闭taglist了。
+ E% P$ f" s' M9 J! |! p, ~ 更多相关配置请看后面关于.vimrc的介绍。
5 {2 x( n0 z S- }9 @5 j0 T f% z
8 w- g- [, B1 p' W三、基础知识探讨9 }. S1 I; w8 `
" B3 G5 {1 o: X" |3 J
约定:为了方便和准确,我们约定本文中"$"标示符后的命令为在终端下运行,而":"后的命令为在vim中运行。9 T8 S: |- R5 r8 _3 S& ]
+ B! ~7 b' N" v1 N& v9 V v1 r7 I
VIM的配置文件一般放在用户主文件夹下,也就是非root状态时在终端运行& ~; U( R: S& @6 q! U
$cd ~/
- }. S! t) F: n$ s6 E 会到的那个目录,文件名为.vimrc。& p% F- \" m$ h$ g) d
看不到?有两个可能:3 A4 ^$ A0 ^( h
1、文件名前面有一个点,表示是隐藏文件,ls查看时需加-a选项。
% c: w' f8 X+ v' m $ls -a; T! ?6 D5 N8 E& s( a6 U# z
2、你还没有建.vimrc文件,自己创建一个就行,先建个空的吧,以后可以不断往里面填东西。
' W7 ^8 G! X3 M5 Y. L6 e9 N $touch .vimrc
( \6 A* ]' D6 g+ [( Q
( O, w0 _9 @5 \+ m( [ 主文件夹下还有一个.vim文件夹,没有请自己mkdir
0 P8 u# R- @6 ]% x" G $mkdir ~/.vim; y0 w, f5 Z6 J0 K
在.vim文件夹下,再建两个子文件夹:plugin和doc& J" g) c+ A# J8 y% L
$mkdir ~/.vim/plugin
$ {# R0 B8 a; b3 z, R' R! B W $mkdir ~/.vim/doc
: v4 Y) { G Z0 G; | B7 j plugin文件夹下放插件,doc文件夹下放相应的help文档。9 R ]* E: m4 w F% s
去下一个taglist吧(我们应该把它叫作脚本还是插件呢?它是放在plugin文件夹下的,那么应该是插件;而在vim.org,它是作为scripts存在,那么应当是脚本。),我们当作例子来请解。3 |0 i% i% v( H# P% c. K" Y
下载的是一个zip包,把它放在 ~/.vim 目录下,然后
' j4 A2 _; O! S9 T: B* V $unzip filename.zip
3 B2 ~& K! ?2 W% d: M; F; D 它已经自动把taglist.vim和taglist.txt分别放到plugin、doc文件夹下了。
3 x: K& z! A% A9 c* V$ _ 这时重新启动vim4 M( v8 z" P, f. j4 B2 D
$vim
& ?; c4 S6 C( C% Y. ?8 K7 o, w 运行3 Y [3 v5 X7 H
:Tlist0 k% [; {* G9 J; Q
发现旁边多了一栏没有?如果你打开的是c文件,并且已经生成了tags文件,那么里面应当会显示一些有用的信息。
2 j9 N. A$ a7 C( ^% h2 T 这个时候,taglist的help文档已经在 ~/.vim/doc 目录下了,但是你在vim下敲; `9 L3 B$ @( z* V8 y
:help Tlist/ N2 u9 |1 l) o( r$ B
却没有任何反应,那是因为vim还没有获取帮助文档里面的tag,解决方法是在vim下, |3 n( y2 W4 d$ J$ k. c
:helptags ~/.vim/doc3 ?! [) ~5 Y( \- x) T
现在,你再( U4 z4 K* t* c2 g4 L, M
:help Tlist
+ ^. b6 W6 y! Y, J }: D 看看有没有反应?+ ?/ r7 Z+ q* y' H
8 ~' C" }6 Y, W! U2 G: f
关于.vimrc
, ^3 L9 ^- n+ L 我自己的.vimrc也在不断地完善中,完善的过程中得益于从网络上获取的很多知识,感谢提供信息的朋友,也是他们促使我写下这篇东西。我把自己.vimrc的一部分贴在下面,你可以把这些根据需要加到你的.vimrc里面去。" z/ [) T6 `' X. a% J
2 U9 P/ i( b5 x' ^
".vimrc$ M; \. D6 ~, {7 w% k
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
, P0 t _& H7 `- a" General
( b( _: a; v% F1 ]1 ?7 u. |"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""7 {& B9 {* U+ `. U; c, l& I
"For ctags, then it can find the 'tags' file even not in current directory
$ l+ y$ P- s& h2 `set tags=tags;/
1 D9 B+ Z( R; i F0 e1 J4 N% G2 ~7 R1 H
"Get out of VI's compatible mode..( o) ^8 r- `! Q$ _4 J, Q
set nocompatible6 T' _ W" x5 I8 ~: R0 W
$ ?0 w# N( M. C. k9 N"Sets how many lines of history VIM har to remember
* j9 Y, H3 X; v+ Dset history=400
/ Y4 U. T' m) ?2 G7 _ O" m; \5 p, b% M+ K! v5 j
"Set to auto read when a file is changed from the outside. w) z1 ]' \% }, ]) X7 f9 w0 Y
set autoread1 ~/ ~2 K6 J ^/ P3 |% z' L) ^
% J8 D# O/ \8 S7 i& E- z0 `"Have the mouse enabled all the time:& s$ b- ^$ `9 h
"when you need to copy from vim, maybe you have to ':set mouse=' first" _3 f' L1 q' D8 U6 `
set mouse=a( |8 ~7 n( w# _. s: B6 O
& g. f, M3 J4 E6 N9 v
"""""""""""""""""""""""""""""""""""""
' n' Y, S" }" w( g8 w" Colors and Fonts
* f4 F l" T/ h( W4 o+ K"""""""""""""""""""""""""""""""""""""+ `/ B- b+ Q: ?- t- G1 x5 `; E
"Enable syntax highlight
$ Z( p* J" m& G7 Y( ^- Esyntax enable
7 L' h: F% b3 ~' p" z) o. M, \) P+ d
"set colorscheme0 n& ^& V. [! ?% c- v% T
colorscheme elflord
5 n( u! G* U* Q1 Q0 `2 N"endif
7 N2 J9 E6 [3 b( ]* R, T( n( C& K
& g! e/ c8 K2 l* j0 M6 Q""""""""""""""""""""""""""""""""""""" O6 G3 \" @( X, I: A' x/ D
" VIM userinteRFace* S a B0 f4 v5 C6 f( d
"""""""""""""""""""""""""""""""""""""
) o3 |8 s: V8 x& G"Set 7 lines to the curors away from the border- when moving vertical..
8 N3 ?" C; c i* S5 Eset so=7, h4 @. n9 M. h# h
& a! D D' \0 w8 @' j- H' p7 T
"Turn on WiLd menu4 Q X- D4 m& i
set wildmenu
, {5 m2 G7 e2 [" u8 Z* V3 t5 `. ?0 u, C3 L v
"Always show current position
+ t, j. R8 ?$ n' b* Hset ruler
; E3 I; ^6 ]' o8 p1 ]- P% r" y, _; B
/ n& x# p, \) W"The commandbar is 2 high
: O1 m' M d: p. @$ cset cmdheight=24 S1 Z' _2 o. H- a+ ^3 v
/ ` T9 i" Q; H( m
"Show line number+ W- _- l* q* D
set nu0 p" {) [5 ?3 g7 o5 h9 Z5 u; W
2 ?0 m8 J! }, @1 C9 q! A* x8 e b
"Set backspace4 K) v# p2 B+ P/ Q" u: w' v7 w! Q% a
set backspace=eol,start,indent
% n! H* J; V: K7 G, ]( y5 E6 [2 s! W$ v/ ?$ v; X
"Bbackspace and cursor keys wrap to; L+ c' {7 U5 f( c4 I) b- k3 M
set whichwrap+=<,>,h,l
4 U+ t v) P1 f4 n
1 F0 i X: {4 z2 F! j0 Q"show matching bracets
; K8 e8 n- P( Y3 T/ hset showmatch
5 H. |3 q" w* y/ L$ N6 w0 @0 o& |( {( K
"How many tenths of a second to blink
% }+ u$ r& ]* {set mat=2/ ?5 E7 Z3 N3 M c" c
+ U! \5 G W, P1 I9 r"Highlight search things
" z' W& |4 g8 g( {/ @set hlsearch
! K7 U( k* o' l1 x"imediately show the search result& t% s& p6 J1 U6 ]: @9 J3 ]1 t
set is
+ _ M7 m9 f* J
+ R# R$ J' r S, e& a"""""""""""""""""""""""""""""""""""""
+ Z: i- v9 {& P" Folding
6 v+ K- T; Z* H @# a"""""""""""""""""""""""""""""""""""""; y( _6 w* t1 r% c- M4 }6 _; ^
"Enable folding, I find it very useful4 r) Q5 E8 E) b2 r9 r; H+ V* e; a* j9 d
set nofen
! Z/ o/ q4 h* B5 \% Uset fdl=04 O: Y* P9 W' _7 {
3 R2 Q4 L- d# o% b
& o& q, W! U! ~; {1 i"""""""""""""""""""""""""""""""""""""+ v% k1 Y( W& J5 |: {0 o$ D
" Text options. p5 r8 X4 p$ x1 F8 U
"""""""""""""""""""""""""""""""""""""# k. `( J5 a- f& V' D {3 J
set expandtab
9 S; \; [! d' @" J+ a. Kset shiftwidth=2
% y7 H1 {" r- Rset ambiwidth=double
; w- T8 p4 V) c( Z9 Z- {; bset smarttab
0 P5 b& F; U4 q7 Q2 h/ i"Set Tab=4 spaces
: w! ~2 y T+ E' A" wset ts=42 M, r7 @/ \8 g" s
set lbr, s, P) l; X, i+ C6 {! [
set tw=500+ C7 ?+ C) E. f# ^8 U0 d5 l# L& P; s- O
set selection=inclusive% E6 }6 h4 R4 ~' Y$ |1 i
""""""""""""""""""""""""""""""
- T6 l( {3 J) ^7 a& g5 p/ R " Indent ~& I$ M1 T+ ^/ J( J
""""""""""""""""""""""""""""""
, ~! [. I2 [5 f- {: Y1 ? "Auto indent
: b2 ~# |, @9 s/ k. v; L. W set ai
! @( H3 x) w3 r5 `4 C% t# N* } "Set auto indent width = 4 spaces% R- ?/ S0 s4 H
set sw=4+ E* w' {. b+ ~! [4 n; T
6 D5 ~0 `- q0 o6 a# X# x( A
"Smart indet: F; N, }# f b
set si0 i5 {6 D5 P. R# h9 K/ x/ ~
$ v6 A; e2 R( j# T: [2 g
"C-style indenting6 ^) n7 ]5 {9 d0 Y* L( `- @2 y
set cindent "usage: select codes, press '=' key, the codes will autoindenting" F8 X+ ]1 K. v( r# \
4 r* J' C# s/ b3 ~ "Wrap lines" t+ F6 y5 U. w& S& |5 g+ Z4 O
set wrap
6 t( d" m- P; u' \6 c
! c/ ]7 {" h) ^- ]( j"Encoding settings! c7 A* t7 |- {. f `2 ], e
if has("multi_byte")9 p9 v6 H) v) n* e/ w+ o: b
" Set fileencoding priority
+ }% y% w9 \6 Q) T) o( J if getfsize(expand("%")) > 0
2 |4 \+ K" C8 { set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
. Q6 k* `2 R1 R6 ] else
. S0 Q" i+ h1 S+ D" t set fileencodings=cp936,big5,euc-jp,euc-kr,latin17 x0 ^# @# e8 ~9 T$ x+ C% z
endif
1 s, b0 v/ e k4 @! X l6 b! R/ V
: \2 K4 m$ q Z4 o+ Y " CJK environment detection and corresponding setting
! W# T. q& B8 H7 _& F6 p* j if v:lang =~ "^zh_CN"
& u+ C9 G) A1 t " Use cp936 to support GBK, euc-cn == gb2312
; G4 e4 k* v, p5 E0 C set encoding=cp936
+ ], m5 P) u. c# b6 k* s( f6 F! X set termencoding=cp936- ?5 d6 ^9 `5 w" n) V0 p# g
set fileencoding=cp936
6 C! N7 M7 f0 u. @2 S% v. k$ l elseif v:lang =~ "^zh_TW") A( ^ o% f" H7 U
" cp950, big5 or euc-tw$ r& g; P0 F0 M$ v1 ^8 ~6 T- X/ u
" Are they equal to each other?0 ~( H0 ^( ?6 ^
set encoding=big5
$ _0 ^& s& g& A; g1 q- w+ W set termencoding=big59 Z, t" ~" f q @5 H: R
set fileencoding=big5
6 y. v+ n* A0 K elseif v:lang =~ "^ko": N# O- \! y! [$ h9 @8 E0 o4 S* n/ b" y
" Copied from someone's dotfile, untested
0 R, h9 d. ^6 \1 o5 v" V/ y; P set encoding=euc-kr! L2 `+ k6 @1 e0 X
set termencoding=euc-kr
; e' @$ W& m2 w+ x- R4 n set fileencoding=euc-kr
1 f5 O' _( a" N elseif v:lang =~ "^ja_JP"
2 T6 Q/ u8 h% l& R0 Y " Copied from someone's dotfile, unteste, v X% R( P; T& V
set encoding=euc-jp. }/ x5 ?( y6 W$ i
set termencoding=euc-jp
. N6 F0 u# g" j2 N) V1 l set fileencoding=euc-jp
9 S0 A/ l$ G. ^$ M. Y7 {2 i& {' f! L endif% L1 K4 }( n" R' f6 H6 Z
" Detect UTF-8 locale, and replace CJK setting if needed% p7 U& w7 W$ a; m
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"2 g5 h1 b. b$ p$ d# n, E: ?( `
set encoding=utf-8
- M& b) }' Q3 ~' h* N6 Q# |8 ~7 a set termencoding=utf-8
( f1 s# x+ Z& ^. Q$ E4 j set fileencoding=utf-8
3 J; ^7 B) G7 x) n endif5 v9 f! V: y0 [8 q+ N
else8 f- m$ I7 o2 m) [
echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
8 A! V: ^4 T0 f/ s6 [1 F+ L3 wendif9 `+ ?# Z& f* l
" f, @; | r3 x+ @$ l7 h& V
& L3 e9 \9 E3 \: l* r6 t"""""""""""""""""""""""""""""""""""""
* _/ q. a! N0 O' G, Q"plugins
7 q6 g7 A x* R3 y1 Z. S# E W: _, U8 W- a
"""""""""""""""""""""""""""""""""""""$ o6 Q5 |. r. w7 B8 c% q# G
" Tlist/ h [( z1 f; F. _+ b3 ^+ e
if &diff. r' t* ^# ~) y
let Tlist_Auto_Open=0 "don't auto pen when compare two files
/ g, R/ _, ?: f' B. Felse9 R& f; p1 K# l% l" B, P: s
let Tlist_Auto_Open=1 "auto pen Tlist when open a file
+ X2 X9 y$ W) [$ E ]endif
8 R) _7 @8 {: M4 z9 ? p) c" c% V* S( K1 O
"set taglist window in right, delete the following line if you don't like4 k" n8 z' ?1 F1 o! ^* g+ ?
let Tlist_Use_Right_Window=1. w( b/ B9 j' @* ]. s$ X6 O" g
let Tlist_Auto_Update=1
4 g% W# l/ j9 |5 c% U3 h# ]let Tlist_File_Fold_Auto_Close=1
i- E) C \! i"auto close Tlist when exiting file.
! T: |& l7 O* Rlet Tlist_Exit_OnlyWindow = 1
9 k4 ?3 F Q2 {+ j: G6 m2 h# _9 e# O' _
nmap <F7> :copen<CR>3 P" i2 H3 N4 N+ p
nmap <F6> :cclose<CR>4 \0 @! _' q% o, S
6 B }% t# ^: ^- `6 U |
|