vim 心得

    现在的工作是在 unix 平台,平时是用 UE 的 ftp 功能来写代码的,有时候文件大了,传输就很慢,而且经常不是很稳定。
下定决心要学学 Vim (现在应该没有人用原始的 vi 了吧),在经过二周的使用后,发现 Vim 实在是非常不错的一个 editor,
现在我在 Windows 上也装了一个 Vim,使用起来颇为顺手,基本上已经替代了 UE。


    下面介绍一些我在使用 Vim 的过程中得到的一些心得:


1. 在使用 Vim 之前一定要进行一些设置,否则你使用起来肯定会很不爽,下面是我的配置


 1  " ==============================================
 2  "  General settings
 3  " ==============================================
 4  
 5 set nocp
 6 set ru
 7  "  使用cindent
 8 set cin
 9 set cino = :0g0t0(sus
10  
11 set sm
12 set ai
13  "  缩近
14 set sw=4
15 set ts=4
16  "  不展开tab为空格,反之set et
17 set noet
18  
19 set lbr
20 set hls
21 set backspace = indent , eol , start
22 set whichwrap = b , s , < , > , [ , ] 
23 set fo+ = mB
24 set selectmode = 
25 set mousemodel = popup
26 set keymodel = 
27 set selection = inclusive
28 set matchpairs+ = <:>
29  
30  " ==============================================
31  "  Cursor movement
32  " ==============================================
33 nnoremap <Down> gj
34 nnoremap <Up> gk
35 vnoremap <Down> gj
36 vnoremap <Up> gk
37 inoremap <Down> <C-o>gj
38 inoremap <Up> <C-o>gk
39  
40 nnoremap <End> g$
41 nnoremap <Home> g0
42 vnoremap <End> g$
43 vnoremap <Home> g0
44 inoremap <End> <C-o>g$
45 inoremap <Home> <C-o>g0
46  
47 nmap <C-F4> :confirm bd<CR>
48 vmap <C-F4> <ESC>:confirm bd<Enter>
49 omap <C-F4> <ESC>:confirm bd<Enter>
50 map! <C-F4> <ESC>:confirm bd<Enter>
51  
52  "  打开语法高亮
53 syntax on
54  "  使用语法进行折叠
55 set foldmethod=syntax
56  
57 if (has( " gui_running " ))
58     set nowrap
59     set guioptions+=b
60     colo inkpot
61 else
62     set wrap
63     colo ron
64 endif
65  
66  "  设置swap文件的目录
67 set dir = D:\vim\tmp
68  " 设置备份文件的目录
69 set backupdir=D:\vim\bak
70  
71  "  设置 leader 的快捷键,原来的“\”太远了,而且位置还不固定
72 let mapleader = " , " 


这里是一些基本设置
如果有什么不太清楚的,可以在 Vim 里 normal 模式下
:h 关键字 
查看帮助


2. Vim教程
推荐先看看Vim自带的Tutor(这可是位好老师)
用vimtutor启动Vim
或者在Vim里面用:h tutor来启动
中文教程我推荐李果正的《大家来学Vim》
这里还有Vim的键位示意图,可以打出来随时查看哦


 
3. Vim的插件
有几个插件强烈推荐
(1) A.vim 在同名的cpp和h文件之间切换 http://www.vim.org/scripts/script.php?script_id=31
(2) NERD_comments:超强的注释插件,支持很多语言的注释风格,按照上面的设置,只需要",cc"就可以添加注释了 http://www.vim.org/scripts/script.php?script_id=1218
(3) csupport:写C/C++代码必备 http://www.vim.org/scripts/script.php?script_id=213
(4) LargeFile:再也不用担心打开大文件会慢了 http://www.vim.org/scripts/script.php?script_id=1506
(5) TipOfTheDay:多读读vim的tips会有很多收获的,记得要经常更新tips文件啊 http://www.vim.org/scripts/script.php?script_id=88
(6) cppomnicomplete:提供C++中类/对象成员的补全(需要Vim7) http://www.vim.org/scripts/script.php?script_id=1520
(7) ColorSamplerPack:提供上百种颜色主题,必有一款适合你,不过大多数都是在GUI下才有相应的效果 http://www.vim.org/scripts/script.php?script_id=625
(8) vimcdoc:汉化的vim帮助 http://vimcdoc.sourceforge.net/


3. 在telnet中使用vim的颜色
如果是在linux中使用telnet,SecureCRT会自动使用合适的颜色来显示vim不同的颜色,但是如果在其他unix下就会无法显示正确的颜色,所有的东西都是同一种颜色。


在.vimrc中加入(^[的输入方式是Ctrl-v然后输入Esc):
if !has("gui_running")
set t_Co=8
set t_Sf=^[[3%p1%dm
set t_Sb=^[[4%p1%dm
endif
并在SecureCRT的模拟终端类型选择ANSI,并钩上ANSI Color,就可以显示不同的颜色了


4. vim的自动补全功能
一般使用Ctrl+n就可以自动补全了,从Vim7后,C/C++的函数、变量或者是类的成员,使用Ctrl+x,Ctrl+o也可以自动补全。在安装了cppomnicomplete后,对象的成员也可以用Ctrl+x,Ctrl+o来补全


5. 代码折叠
许多editor都支持代码折叠,Vim也不例外
常用的快捷键
zc 折叠代码
zo 打开折叠的代码
还有其他的快捷键可以查看帮助
:h fold


6. 自动格式化代码
在Visual模式下,选中代码按=就可以了
Normal模式下,按=会格式化光标所在行


7. 脚本支持
Vim不仅有内建的脚本功能,还支持Perl,Python,Tcl,Ruby和MzScheme这些流行的脚本语言编写Vim的扩展


Vim的功能是不是很强大?
经过1年多的测试Vim 7.0也release了,还不快下载来试试
http://www.vim.org


Happy Vimming!


对于已经习惯了使用Vim但是要在Windows下编程的用户
我还推荐
ViEmu,可以在VisualStudio下模拟Vi的编辑操作
不过只有30天的试用期






程序开发-文武之道
Do the right things right Email: sina@live.cn


 
vim操作技巧第二期:我的vim插件 


tabBar.vim
这个插件实现了类似UltraEdit中的标签页的功能,而且能通过Alt-<n>来切换, 
安装:
拷贝文件到[你的gvim的安装目录]\vimfiles\plugin\中即可!
下载:
http://www.vim.org/scripts/script.php?script_id=1338




word_complete.vim
Insert模式下在输入的时候自动补全单词,如果补全正确可以按Tab键接受,否则可以不管它继续输入或者按


Ctrl-n,Ctrl-p切换补全。 注意是输入三个字符后才开始补全。
安装:
1. 拷贝文件到[你的gvim的安装目录]\vimfiles\plugin\
2. 激活补全模式
:call DoWordComplete() 
3. 取消补全模式
:call EndWordComplete()
4. 自动加载补全模式
在.vimrc或_vimrc文件中加入
:autocmd  BufEnter  *  call  DoWordComplete()
下载:
http://www.vim.org/scripts/script.php?script_id=73




c.vim
这个插件超强,提供了很多便于C/C++编程的功能,比如文件头模版,代码片断等。
就像帮助文档的头一句写的那样: C/C++IDE for vim/gvim.具体如何的强大家就看看帮助好了.
安装:
这个相对地比较简单,但是文件却是不少:
1. 拷贝cvim.zip到[你的gvim的安装目录]\vimfiles,
   执行unzip,(注意,如果是window的unzip,请选择解压缩到当前目录)
2. 你可以设置一些个人信息在.vimrc或_vimrc中.例如:


      let g:C_AuthorName      = 'Moonz_wu'     
      let g:C_AuthorRef       = 'Mn'                         
      let g:C_Email           = 'moonz.wu@gmail.com'            
      let g:C_Company         = 'FSky co.'    
3. 重新启动vim,并执行命令
:help [你的gvim的安装目录]\vimfiles\doc来产生帮助文档.
基本上完成这些步骤,这个cvim插件就可以用了,不过这里要说明的是解压完后,你会看到两个压缩文件
c-templates-comm.zip和c-templates+comm.zip,这两个区别就是c-templates+comm.zip带方法注释,
c-templates-comm.zip没有, 你可以解压其中一个,并拷贝到.\plugin\templates.
你可以在解压完的doc中找到一个hotkey.pdf文件,里面讲了cvim定义的所有快捷键.




crefvim.vim
为VIM定制的C参考手册,这样对于语法或者函数不清楚的地方可以方便的查找了
安装:
1.将脚本拷贝到你的本地目录中,
Unix: ~/.vim/plugin
windows: [你的gvim的安装目录]\vimfiles\plugin
2. 将帮助文件(即doc下的文件)拷贝到
  Unix:    ~/.vim/doc
  Windows: [你的gvim的安装目录]\vimfiles\doc
3.将语法文件(即syntax下的文件)拷贝到
  Unix:    ~/.vim/after/syntax
  Windows: [你的gvim的安装目录]\vimfiles\after\syntax




然后启动vim就将自动的加载脚本。然后在vim执行以下命令
Unix
:helptags ~/.vim/doc
windows
:helptags [你的gvim的安装目录]\vimfiles\doc
呵呵,那么搞定后你在vim中写入一个atoi(),运行命令\cr,看看效果。
这个是crefvim帮助里的(<Leader> = \)
  <Leader>cr normal mode:  get help for word under cursor
                           Memory aid cr: (c)-(r)eference
  <Leader>cr visual mode:  get help for visually selected text
                           Memory aid cr: (c)-(r)eference
  <Leader>cw:              prompt for word CRefVim should search for
                           Memory aid cw: (c)-reference (w)hat
  <Leader>cc:              jump to table of contents of the C-reference manual
                           Memory aid cc: (c)-reference (c)ontents
具体还需看看帮助。
下载:
http://www.vim.org/scripts/script.php?script_id=614


这里有一篇很好的讲vim插件的文章,我也借鉴了一部份^_^!
http://www.pconline.com.cn/pcedu/soft/gj/photo/0609/877033_5.html


 一、VIM的历史- 二、VI/VIM基础知识- 三、编程辅助- 四、强大方便的帮助系统- 五、其它高级功能- 六、VIM Scripts- 七、VIM资源- 八、编译安装最新CVS版的VIM;VIM的不足-


二、VI/VIM基础知识


  很多人应该都知道VI是个有模式的编辑器:编辑模式和命令模式,按ESC回到命令模式,用i或者a进入编辑模式,由于区分了模式,导致VI的命令非常简洁,而无模式编辑器比如Emacs,所有的命令都需要加上控制键Ctrl或Alt,所以有个笑话说Emacser们最希望计算机备一个脚踏板,这样就可以用脚踩Ctrl和Alt键了(编辑器圣战——在VI和Emacs之间有很多口水战,自然也引出非常多的幽默),这里罗嗦一句VI vs. Emacs: VI继承了ed的理念,另外也有历史原因,VI追求的是快捷——启动程序迅速,编辑文本高效,功能专注,而Emacs追求的是功能的丰富强大以及集成带来的方便,在Emacs里头可以发邮件,上新闻组,听mp3,浏览网页,玩游戏,几乎可以login->emacs->logout了:-),VI和Emacs都是程序员的编辑器,相比而言,Emacs更是提供了一种程序员的生活氛围。


  闲话少说,这篇文档也不是一份VI/VIM教程,所以这一节只会简单的提及VI/VIM的基础知识。VIM引入了更多的模式,在VIM里头:help mode可以看到VIM的所有模式,主要有如下几种:


Normal mode  即通常所谓的命令模式,在此模式使用a、i、A、I、o、O等进入Insert mode
Insert mode  即通常所谓的编辑模式,在此模式使用ESC进入Normal mode或者Ctrl-o临时进入Normal mode。
Command-line mode 命令行模式,在Normal mode下按冒号进入,按ESC取消执行命令或者回车执行命令,然后回到Normal mode。(Visual Studio.Net也添加了命令行脚本功能,幸甚)
Visual mode  即选择模式(注意跟用鼠标选择不同),用v,V,C-v或C-q进入
Select mode  鼠标选择
Replace mode  在Normal mode下按R进入,按ESC返回Normal mode,相当于Windows下命令行中按Insert键进入的覆盖模式
  从VI/VIM中退出: 按ESC确认返回到Normal mode,然后


:wq 保存并退出
:q! 不保存并退出
:x 退出,如果文件更改则保存
ZZ 退出,如果文件更改则保存(按住Shift,再按两次z)
  VI的命令是非常具有美感的,下面是几个例子:


i 在光标前插入 I 在行首插入
a 在光标后插入 A 在行末插入
o 在下一行插入 O 在上一行插入
x 删除当前字符 X 删除前一个字符
  类似的还有b,B,ge,gE,w,W,e,E,f,F,t,T,这些命令都可以用:help cmdname查到帮助。


dd 删除一行 yy 拷贝一行
h j k l 左下上右移动光标
Ctrl-w h,Ctrl-w j,Ctrl-w k,Ctrl-w l 切换到左下上右窗口
  类似ed,VI/VIM的命令大多都可以带一个数字前缀或者一个数字范围,比如:


5dd 从当前行开始删除5行
5yy 从当前行开始拷贝5行
1,3d 删除1至3行
1,3y 拷贝1至3行 (.代表当前行,$代表最后一行)
  d<motion>,y<motion>,c<motion>,v<motion>分别代表删除/拷贝/修改/选择<motion>


  命令指定的范围,比如
  int main(void)
  {
  ......;
  }


  将光标放在{处,然后输入v%就可以把大括号中内容选定,然后按=就可以按照C语言格式缩排(:help =可以看到=命令的描述),%命令的作用是跳到匹配处,比如括号之间,C的宏指令#if #else #endif之间。


  int some_ugly_modifier and some_ugly_name (void)
  如果光标放在第一个s上,想删除到“(”为止,则输入dt(就可以了,t(的作用是跳到下一个
  "("前。


  dG可以从当前位置一直删除到文件末尾,因为G的作用是跳到文件最后一行。


  VIM的命令可以非常快捷的做到一些复杂的编辑操作,下面是几个示例:
----------------------------------------------------------------------------------我是书签------------------------------------------------------------------
  (a)


  将“(1), ...., (2), ....,(100)”替换成“(2), ...., (3), ...., (101)”。


  在文本中一处处找到并修改是很累的,在VIM下一条命令就可以搞定:


  :%s/(\(\d+\))/\="(".(submatch(1)+1).")"/g


  命令解释如下:


%       全文(“%”是“1,$”范围的缩写)
s       替换
/       搜索字符串开始
(       左括号
\)      开始记录匹配
\d+     一个或多个数字
\)      结束记录匹配
)       右括号
/       搜索字符串结束
\=      把后面的表达式计算出来作为替换字符串
"("     左括号
.       字符串连接运算符
(submatch(1) + 1)       把第一个匹配的结果加一作为一个整体返回
.")"    添上右括号
/g      替换字符串结束,g表示替换每一行的所有匹配结果。
  (b)


  这个问题是笔者曾经碰到的,有一个log系统对于输出行长度有限制,因此在输出很长的log时需要断行,在断行时以单行的“-$-”标记,现在的需求是把这些行连起来,在VIM中也可以很方便的做到(edyfox at newsmth指点):


  :%s/\n-\$-\n//g


  命令的含义就是把“换行-$-换行”替换成空,另一个办法是:


  :g/-\$-/norm ddkJx


  命令g/-\$-/的含义就是找到所有的断行标记,然后norm表示在找到的每一个行上执行后面的命令,dd删除这个断行标记,k移动到上一行,J合并当前行和下一行,由于J合并后会留一个空格(只对于英文情况下),所以x来删除这个空格。


  (c)在Fortran代码


  integer, dimension(:, :), allocatable ::  &
  short_var, &
  A_very_long_name_var, &
  other


  中,想把每行的&符号定位到固定的一列,比如第78列,手动对齐也是很麻烦的,这个问题可以用VIM的Align插件(http://www.vim.org/scripts/script.php?script_id=294)解决,另外利用宏也可以:


:set ve=all 使得光标可以定位到屏幕任何位置(缺省下VIM的光标只能放在行内的字符上)
gg              到文件第一行
/\s\+&\s*$      找以&结尾的行,&前至少一个空白字符,后0或多个空白字符
qa              记录宏到寄存器a
D               删除到行尾
78|             定位到第78列
i&<ESC>         插入&并返回到命令模式
n               查找下一个&
q               停止记录宏
10000@a         执行一万遍寄存器a中保存的命令
:set ve=""      恢复ve缺省值
  (d)连续插入72个等号


  按ESC进入Normal mode,输入72i=再按ESC即可。


  (e)在多行开始插入//


  移动光标到需要注释掉的第一行开头,然后按Ctrl-v(如果使用了VIM的mswin.vim,则Ctrl-v表示粘贴,这时需要用Ctrl-q代替)进入Visual blockwise模式,这个模式是Visual mode的一种,相当于UltraEdit中的块选择。 然后按j选择上所有需要注释行的行首(看起来效果是选择了第一列),输入I//再按ESC就可以在每一行开头插入//了
 


 一、VIM的历史- 二、VI/VIM基础知识- 三、编程辅助- 四、强大方便的帮助系统- 五、其它高级功能- 六、VIM Scripts- 七、VIM资源- 八、编译安装最新CVS版的VIM;VIM的不足-


三、编程辅助


  既然是程序员的编辑器,自然要show一下它的编程辅助功能。


  (1) ctags,cscope


  现在的IDE都提供了类、函数的索引功能,可以方便的找到某个类或者函数的在哪里定义的,VIM这方面可以利用ctags、cscope做到,Exuberant ctags支持的语言种类非常多,UltraEdit的tags功能也是利用的ctags。cscope只支持C,它能实现Source Insight的一些功能,比如查找某个函数调用了哪些函数,某个函数被哪些函数调用。VIM对这两个工具集成的非常好,利用它们就可以在源文件中方便的跳转搜索类和函数了。


  Reference:


  http://ctags.sourceforge.net Exuberant ctags
  http://iamphet.nm.ru/cscope/ cscope for Win32
  :help ctags
  :help cscope
  (2)multi window,multi buffer,multi tab page


  一个buffer对应一个文件,它可以对应多个window,这样可以方便的对照编辑一个文件的不同部分,tab page跟现在许多编辑器上常见的标签页意义并不一样,可以将tab page理解为一个windows的容器,这样如果想新建一个窗口编辑文件但又不想打乱现在的多窗口布局,那么就可以新开一个tab page,把新窗口放到这个新的tab page里头。tab page是VIM 7.0不久前新增的特性,目前VIM 7.0还未正式发布。(此文发表至PConline时,已经正式发布。)


  Reference:
  :help windows
  :help buffers
  :help tabpage
  (3) 语法高亮


  VIM发行版里带了450多种语言的语法高亮,在其主页vim.org上还可以找到更多。


  Reference:
  :help syntax
  (4) 自动缩进


  在打开自动缩进选项后,VIM会自动的控制缩进,比如输入{自动向右缩进一个tab字符(具体用什么缩进可以配置),输入}自动回退缩进。 使用=命令可以对选择的程序块排版缩进,这对于整理代码非常有帮助。 另外对选择的块用>>和<<命令可以很方便的控制一个程序块的缩进。


  Reference:
  :help cindent
  :help autoindent
  :help smartindent
  (5) 类和函数列表


  taglist等插件可以提供很方便的类和函数列表功能。


  (6) 自动完成


  VIM在Insert mode下输入一个单词的前几个字符,然后用Ctrl-p或者Ctrl-n就可以列出以这些字符开头的单词,特别在配置了ctags后也能列出头文件中的符号,特别方便,除此外VIM还有行自动完成、文件名自动完成等,这点即使是现在强大的IDE也未免不足。


  如果设置了如下选项:


  :set wildmode=list:full
  :set wildmenu
  则在命令行打开文件或者输入命令时按Tab(以输入字符为前缀补全)或者Ctrl-d(列出包含输入字符的所有匹配项目)自动补全,这一功能大大降低了VIM的使用难度。


  另外有许多插件可以实现许多IDE中的自动完成类成员的功能,当然,这个功能还比不上Eclispe、Visual Studio等IDE中的强大,这一点是VIM比较可惜的地方。VIM 7.0引入了Omni Completion,可以自定义匹配完成函数,也许可以弥补这个缺陷。


  Reference: :help 'complete'
  :help omni-completion
  (7) folding


  VIM支持折叠代码,还可以根据文件中特殊的标记对文件中的行折叠,可以实现Outline视图,这可以极大的方便编辑很大的文件。


  Reference: :help fold


  (8) quickfix


  许多人对于UNIX开发的印象都是“编辑代码,退出编辑器,编译,发现错误,记录出错信息,遍辑代码,退出编辑器,编译,用gdb调试,再编辑代码……”,这是古老的VI时代的事情了,有了VIM的quickfix特性,可以在VIM里编译然后直接跳到编译出错的行,这个反复的过程无需退出编辑器,而且VIM的quickfix特性可以经配置后支持不同的编译器以及不同的语言:只要编译器在出错信息里包含文件名和行号。


  不过比较遗憾的是VIM对于集成调试支持还不好,有些项目尝试集成GDB到VIM,比如http://skawina.eu.org/mikolaj/vimgdb/和http://www.volny.cz/zellerin/gdbvim/,在http://www.vim.org/search.php中的scripts处搜索gdb也可以找到一些插件.这方面Emacs的GUD(Grand Unified Debugger)调试界面要更强大,毕竟GCC/GDB/Emacs是一家。


  Reference: :help quickfix


  (9)auto command


  VIM可以在某些事件发生时比如打开文件、保存文件、切换窗口时自动执行一些VIM命令,VIM的许多插件都利用了这个功能。常用的一种情况是把某种文件后缀指定到一种文件格式上,比如*.jv指定到Java文件格式,这样在每次打开.jv类型的文件时自动使用Java的语法高亮:


  :autocmd BufNewFile, BufRead *.jv :set ft=Java


  Reference: :help autocmd.txt


  (10)mode line


  在编辑文件时常常指定一些选项,比如缩进量、是否将制表符转换成空格等,每次手动指定这些选项很麻烦,写到vimrc中却又成了全局选项,而且换了一份VIM,原有的设置就丢失了。VIM可以识别文件中的特殊行,自动设置一些选项,下面是写在C源文件开头的一个mode line示例:


/* vi:set tw=0 ts=8 sw=8 noet nowrap ft=c fdm=syntax: */
/*
* File: xxxx.c
* Author: xxx
*/
 


 一、VIM的历史- 二、VI/VIM基础知识- 三、编程辅助- 四、强大方便的帮助系统- 五、其它高级功能- 六、VIM Scripts- 七、VIM资源- 八、编译安装最新CVS版的VIM;VIM的不足-


四、强大方便的帮助系统


  使用了那么多软件,只有VIM和Emacs的帮助系统给笔者方便快捷的感觉,大部分软件的帮助往往是摆设而已,而VIM的帮助的确是考虑到了自己“help”的身份,利用它能很方便容易的找到想要的东西。


  VIM的帮助是超链接形式的,它使用的就是tags,所以可以跟ctags功能一样按Ctrl-]跳转到链接所指处,按Ctrl-t返回。


:help  打开帮助首页,这个首页分类非常清楚
:help cmd 查找normal mode命令,比如:help dd
:help i_cmd 查找insert mode命令,比如:help i_Ctrl-y
:help :cmd 查找command-line命令,比如:help :s  
:help 'option 查找选项,比如:help 'tabstop
  (这些信息都在:help打开的帮助首页上)


  如果你记不清命令或者选项的全称,那么可以利用Tab或者Ctrl-d的自动补全功能。


  :help options 可以找到所有的选项说明


  查看某一个选项的值(实际上选项是VIM中的一种变量,类似SHELL的变量以$符号引用,VIM的选项以&引用,另外VIM的寄存器以@引用):


  :echo &tabstop


 
 一、VIM的历史- 二、VI/VIM基础知识- 三、编程辅助- 四、强大方便的帮助系统- 五、其它高级功能- 六、VIM Scripts- 七、VIM资源- 八、编译安装最新CVS版的VIM;VIM的不足-


五、其它高级功能


  (1)寄存器


  VIM里面的寄存器可以用来保存拷贝的文本、记录的宏、设置的书签等等,一般的编辑器都只有一个剪切板(MS Office加入了多个剪切板),而VIM和Emacs编辑器中的多寄存器可以实现多个剪切板的功能。VIM中有九类寄存器:


无名寄存器 " 最近一次删除/修改/替换操作的文本都会放入这个寄存器
10个数字寄存器 0-9 拷贝或者删除的文本存入这些寄存器,这些寄存器是循环使用的,在每次存入内容到寄存器1时,原有的内容会依次存入到后一个寄存器中。
小删除寄存器 - 删除内容少于一行时放入这个寄存器。
26个命名寄存器 a-zA-Z  大小写无关。这些寄存器可以在拷贝或者删除等操作中指定使用。
四个只读寄存器  :.%# 特殊用途。
表达式寄存器 = 特殊用途。
选择和拖放寄存器 *+~ 用于与系统剪切板交互,以及接收拖放操作的内容。
黑洞寄存器 _ 放到这里面的内容都被丢弃,这样可以删除或拷贝时不影响其它寄存器。
最后一次搜索模式寄存器 / 保存最后一次搜索的正则表达式。
  使用:reg命令可以看到所有寄存器中的内容,使用"+y或者"*y可以将visual mode下选择
  的内容拷贝到系统剪切板,使用"+p或者"*p可以将剪切板中的内容粘贴到VIM中,如果打开了
  mswin特性的话则在insert mode下使用Ctrl-x,Ctrl-v,Ctrl-c了。


  Reference: :help registers


  (2) 宏
  Normal mode下按q<reg>,<reg>指{a-zA-Z0-9"}37个寄存器中的一个,然后可以进行任何操作,包括在模式间切换,最后在Normal模式下按q可以结束宏录制,用@<reg>命令可以应用这个宏,命令前可以带数字前缀表示执行多少次这个宏。


  Reference: :help q


  (3) 书签


  Normal mode下按m<reg>作书签,<reg>指26个命名寄存器中的一个,然后可以用'<reg>或者`<reg>跳到书签处。


  Reference: :help m


  (4) 映射


  VI/VIM可以将某个按键序列映射到一个命令序列上,比如在配置文件.vimrc(Windows下是_vimrc)中写入


map <F6> <ESC>i<C-R>=strftime("%Y-%m-%d")<ESC><ESC>


  即可以在Normal mode下插入当前日期。


  Reference: :help :map


  (5) 缩写


  VI/VIM支持用一个缩写字符串代替一个长的字符串,比如


  :ab hw hello world


  然后在Insert mode下输入“hw ”(不包括引号)后VIM就自动替换成了“hello world”。这里展示一个Emacs下abbrev功能的动画(没错,是Emacs的):


  http://www.bloomington.in.us/~brutt/msf-abbrev.html
  http://www.bloomington.in.us/~brutt/msf-abbrev-demo.gif


  Reference: :help :ab


  (6) :s//和:g//,:!g//


  这两个命名加上正则表达式,常常能完成非常复杂的编辑任务,可以毫不夸张地说是VIM的两柄瑞士军刀。:s是替换操作,:g是查找匹配模式的行,:!g是查找不匹配模式的行。


  http://www.vim.org/tips/tip.php?tip_id=1063这个tip可以把:g找到的行拷贝到一个新的缓冲区中,非常有用。


  Reference: :help :s
  :help :g
  (7) 插件


  VIM自己有脚本语言,另外也支持用Perl/Python/Tcl/Ruby/Scheme编写插件,这些插件极大的丰富了VIM的功能。


  (8) color scheme


  VIM有许多配色方案,下面这个链接有许多配色方案效果的图样:http://www.cs.cmu.edu/~maverick/VimColorSchemeTest/


  (9) 二进制编辑


  VIM可以利用xxd实现二进制编辑,不过这项功能还是不够好用。


  (10) sign


  sign指在编辑窗口的最左列显示一个标记,利用这个功能能实现很多IDE中的书签标记或者断点标记。


  Reference: :help sign


 






六、VIM Scripts


  VIM script包含几大类:


  color scheme 配色方案
  ftplugin File type插件,特定语言语法的设置,比如如何识别注释
  syntax  语法高亮的配色
  plugin  提供额外功能的插件,比如智能完成、缓冲区管理。
  VIM的script安装非常简单,下载的script文件或者压缩包里头都有安装说明,在VIM的安装目录(比如C:\VIM64)下面有一个vimfiles目录,把script放到vimfiles目录下即可。对于多用户系统,可以在HOME目录(一般是c:\Documents and Settings\ <USER_NAME>\)下面建立一个vimfiles目录,把script放置到这里。


  下面是一些好用的VIM插件,具体使用办法请参考各自。vim文件头部的注释。


  BufExplorer.vim  *****
  http://www.vim.org/scripts/script.php?script_id=42
  这个插件可以使编辑多文件更加方便,装完插件后Normal mode下输入\be即可打开缓冲区列表,光标放置在某一个文件上按回车即可打开这个文件,而缓冲区列表自动关闭。


  Taglist.vim  *****
  http://www.vim.org/scripts/script.php?script_id=273
  这个插件可以实现类或者函数列表功能,支持C/C++,java,perl,python,tcl,sql,php等语言,它可以在VIM中创建一个窗口,列出编辑的源文件中的类、函数、变量定义列表,而且更方便的是这个列表也插入在了右键菜单中,分类存放,访问非常方便。


  TabBar.vim  ***
  http://www.vim.org/scripts/script.php?script_id=1338
  这个插件实现了类似UltraEdit中的标签页的功能,而且能通过Alt-<n>来切换,<n>代表1-9。


  minibufexpl.vim  ***
  http://www.vim.org/scripts/script.php?script_id=159
  实现了类似UltraEdit中的标签也功能。


  c.vim   ***
  http://www.vim.org/scripts/script.php?script_id=213
  提供了很多便于C/C++编程的功能,比如文件头模版,代码片断等。


  CRefVim   **
  http://www.vim.org/scripts/script.php?script_id=614
  为VIM定制的C参考手册,这样对于语法或者函数不清楚的地方可以方便的查找了。


  latex-suite  *****
  http://www.vim.org/scripts/script.php?script_id=475
  http://vim-latex.sf.net/
  提供了很多便于编辑TeX/LaTeX文件的功能,比如在VIM里面编译或者预览、自动插入TeX标记等。


  word_complete.vim ***
  http://www.vim.org/scripts/script.php?script_id=73
  Insert模式下在输入的时候自动补全单词,如果补全正确可以按Tab键接受,否则可以不管它继续输入或者按Ctrl-n,Ctrl-p切换补全。 注意是输入三个字符后才开始补全。


  Vim JDE
  http://www.vim.org/scripts/script.php?script_id=1213
  支持C/C++等的自动完成(需要VIM 7.0,编译时打开+ruby特性).


  cppcomplete.vim  **
  http://www.vim.org/scripts/script.php?script_id=527
  能自动完成C/C++/Java的结构或类成员,注意它的快捷键是Alt-l(字母L)不是Alt-i。


  The NEAD Commenter **
  http://www.vim.org/scripts/script.php?script_id=1218
  在许多类型的文件中方便的加上注释或者取消注释。


  winmanager
  http://www.vim.org/scripts/script.php?script_id=95
  把标准的File Explorer以及Buffer Explorer插件集成在一起,提供现代编辑器中常见的文件列表和缓冲区列表功能。


  sketch.vim ***
  http://www.vim.org/scripts/script.php?script_id=705
  Draw with mouse: boxes, arrows, lines, fills. Transparent/opaque drag and drop.照着它的教程做一遍,你就会震撼于它的创意了。


  DrawIt.vim **
  http://www.vim.org/scripts/script.php?script_id=40
  可以方便的画连线图。


  MultipleSearch  ***
  http://www.vim.org/scripts/script.php?script_id=479
  MultipleSearch2.vim ***
  http://www.vim.org/scripts/script.php?script_id=1183
  Mark.vim  ***
  http://www.vim.org/scripts/script.php?script_id=1238
  otf.vim   **
  http://www.vim.org/scripts/script.php?script_id=634
  这些插件可以同时高亮显示多次搜索结果,这个特性非常有利于显示代码中某些变量或函数的调用位置。


  SearchComplete.vim *
  http://www.vim.org/scripts/script.php?script_id=474
  可以用/搜索时按Tab补全要搜索的单词。


  Vim Intellisense
  http://insenvim.sourceforge.net
  顾名思义,此插件用于给VIM提供智能完成功能,支持C++,C#,Java,JSP,HTML,SQL,XML,笔者安装后一直懒得配置,也就没用上。


  project
  http://www.vim.org/scripts/script.php?script_id=69
  提供一些IDE功能,看介绍似乎很不错。


  JavaBrower
  http://www.vim.org/scripts/script.php?script_id=588
  提供文件中Java类的树状列表。


  vimspell
  http://www.vim.org/scripts/script.php?script_id=465
  ispell or aspell based spell checker with fly-spelling。


  cream
  http://cream.sourceforge.net/
  一套配置文件,可以把VIM的界面改成CUA(Common User Access)模型,降低VIM的学习难度,个人不推荐这种做法,不过其中有些高级配置值得学习(有意思的是Emacs也有类似的项目: Easymacs,EmacsW32)。


  IComplete
  http://icomplete.sf.net
  搭配VIM 7.0的Omni Complete,可以做到C/C++的智能完成功能.




七、VIM资源


  http://www.vim.org VIM主页,有许多scripts和tips,查找插件的第一去处
  http://newsmth.net  新水木BBS的VIM版,有很多VIM爱好者可以讨论
  http://vimdoc.sf.net VIM文档工程
  http://vcd.gro.clinux.org/ VIM中文文档
  http://tnerual.eriogerg.free.fr/vim.html VIM Quick Reference Card
  http://edyfox.codecarver.org/ newsmth VIM版版主的wiki
  http://learn.tsinghua.edu.cn:8080/2001315450/ 王垠的个人主页
  《学习vi编辑器(第六版)》机械工业出版社译,O'Reilly
  几个学习正则表达式的工具(from happyvim at newsmth)


  http://weitz.de/regex-coach/  Regex Coach
  http://jregexptester.sourceforge.net/ JRegexp Tester
  http://www.regexbuddy.com/  Regex Buddy
  http://www.yzis.org/  yzis是一个新的VI变种,它支持变宽字体,目前功能还不够丰富。


  http://ex-vi.sourceforge.net/ 传统VI的源代码




1. 获取源代码


  cvs -z3 -d:pserver:anonymous@cvs.sf.net:/cvsroot/vim co vim7


  源代码位于当前目录的vim7目录下面,假设安装目标在d:\work\program\Vim\vim70b


  2.编译


  注意重新编译前最好clean一下,确保“*obj*”目录被删除了,否则可能出现莫名其妙的问题,比如链接时找不到一些函数。下面是一个批处理脚本:


  rem --------------------------------------------->
  @echo off
  set path=c:\winnt;c:\winnt\system32
  vcvars32.bat
  cd vim7\src
  rem .sh文件跟其它程序有关联,避免运行VC的link时执行了link.sh
  ren link.sh link.sh.old
  @echo clean...
  rem clean时加入这些选项是因为$(OUTDIR)和$(OBJDIR)根据这些标志合成的, 
  rem 如果不加这些标志, 在rmdir /s /q时会找不到目录, 从而没有删除掉。
  nmake -f Make_mvc.mak clean FEATURES=HUGE GUI=yes OLE=yes MBYTE=yes IME=yes GDYNAMIC_IME=yes GIME=yes PERL=d:\work\program\Perl DYNAMIC_PERL=yes PERL_VER=58 PYTHON=d:\work\program\Python24 DYNAMIC_PYTHON=yes PYTHON_VER=24  SNIFF=yes CSCOPE=yes CPUNU=i586 DEBUG=yes MAP=lines
  @echo build big debug version...
  nmake -f Make_mvc.mak all FEATURES=HUGE GUI=yes OLE=yes MBYTE=yes IME=yes GDYNAMIC_IME=yes GIME=yes PERL=d:\work\program\Perl DYNAMIC_PERL=yes PERL_VER=58 PYTHON=d:\work\program\Python24 DYNAMIC_PYTHON=yes PYTHON_VER=24  SNIFF=yes CSCOPE=yes CPUNU=i586 DEBUG=yes MAP=lines
  ren link.sh.old link.sh
  @echo done.
  pause
  @echo on
  rem <-----------------------------------------------


  对于MinGW,


  @echo off
  @echo clean...
  make -f Make_ming.mak clean DEBUG=yes
  @echo make...
  make -f Make_ming.mak all GUI=yes OLE=yes MBYTE=yes IME=yes GDYNAMIC_IME=yes GIME=yes PERL=d:/work/program/Perl DYNAMIC_PERL=yes PERL_VER=58 PYTHON=d:/work/program/Python24 DYNAMIC_PYTHON=yes PYTHON_VER=24 CSCOPE=yes CPUNU=i586 DEBUG=yes MAP=lines
  @echo done.
  pause
  @echo on
  如果发现MinGW编译出来的gvimd.exe非常大(约4~5MB),可以用MinGW自带的strip处理一下。


  3. 安装


  如果你的系统先前有一份不同版本的VIM,那么需要先卸载掉(运行vim\vimXX\uninstal.exe,或者在拷贝完文件后运行新版VIM的install.exe,它也会提示卸载旧版本),最近的VIM 7 CVS代码安装目录也从vim70aa转变到vim70b,也需要卸载原先的vim70aa,这一步主要是删除一些注册表项。


  如果你从CVS上更新代码后,install要求的安装目录名字没有改变(也就是说VIM版本没变),那么不需要卸载原先的版本,直接拷贝文件覆盖即可,如果你想更改目录安装的话也需要卸载。


  cd vim7
  dir /s/b *.exe
  dir /s/b *.dll
  xcopy vim7\runtime d:\work\program\vim\vim70b (vim70b是一个目录)
  copy vim7\src\*.exe  d:\work\program\Vim\vim70b
  copy vim7\src\xxd\xxd.exe d:\work\program\Vim\vim70b
  copy vim7\src\vimtbar.dll d:\work\program\Vim\vim70b
  copy vim7\src\GvimExt\gvimext.dll d:\work\program\Vim\vim70b
  copy vim7\src\VisVim\Visvim.dll d:\work\program\Vim\vim70b
  然后进入vim70b目录运行install.exe,如果发现一个DOS窗口一闪而逝,那么很可能是建立的vim70b目录名不对,比如笔者前几天升级后使用的仍然是vim70aa目录名,在DOS窗口中运行install.exe它就提示需要在vim70b目录下运行,将vim70aa改名即可。install.exe的源代码是vim7\src\dosinst.c,这里面修改了注册表,并拷贝一些文件到WINDOWS目录下等等。


  4.善后


  视情况你需要更新PATH环境变量、文件关联、_vimrc中的路径名等,并将diff.exe,ctags.exe,cscope.exe拷贝到vim70b下面。


  最后运行gvimd.exe,键入:ver开始享受VIM吧。


九、一份vimrc配置文件(注:原文如此,不太清楚作者所要表达的信息)


十、VIM的不足


  前面已经提到,VIM在自动完成和集成调试方面还比不上现代的许多IDE,另外VIM对二进制编辑还没有UltraEdit强大,对于现在流行的重构,VIM也支持不力,但是作为一个文本编辑器而言,堪比的只有Emacs,另外Visual SlickEdit也很强大,不过它是商业软件。VIM也可以嵌入到Visual Studio中作为编辑器,另外Code Forge,Eclipse,NetBeans,Sun Visual Workshop等也提供了一定的VIM支持或者键绑定。


  Reference:
  :help workshop
  :help netbeans
  :help debugger 




vim cscope支持文件下载 


--------------------------------------------------------------------------------
cscope是*nix下功能强大的开发支持功能, 它极大地方便了对源代码库的浏览, 查询. 比如回答:
(1) 函数foo就调用了哪些函数
(2) 函数foo被哪些函数调用过
(3) 变量v_t 的定义在哪里
等等.


vim中内置的ctags支持提供了类似的功能, 但cscope的功能更为强大. 要了解vim中关于cscope的主题, 可以在vim中用
:h cscope


windows下的gvim预编译版提供了对cscope的支持, 但是默认安装好之后还是不能使用它, 这跟cscope的工作原理有关. 要提供对一个源代码库的cscope支持, 必需先用cscope.exe 来收集这些源代码的信息, 生成一个(默认)cscope.out的符号信息文件. 然后在gvim中用ex命令行:
:cscope add cscope.out
其中的cscope.out是cscope.out库文件名, 可以改为任何你生成的cscope文件名.
如果添加成功, gvim将调用cscope.exe, 这是一个命令行程序, 它的运行会产生一个DOS窗口, 这是cscope.exe原本的面目, 也就是说, 没有vim, 你仍可以在命令上使用cscope功能, gvim为了提供透明的cscope支持, 将这个包容cscope.exe运行的窗口隐藏了起来, 通过管道与这个后台支持的cscope.exe程序进行对话, 最终向用户提供无缝的cscope.exe支持.


安装:
:h cscope-win32
会告诉你有人已经实现了win32下cscope的支持功能, 顺着网站
http://iamphet.nm.ru/cscope/index.html
你可以下载一个win32的cscope, 不过, 它不能用. 运行的时候会说找不到pdcurses.dll中的一个函数, 估计是作者放错了文件. 我email过作者询问这个问题, 一直没有得到答覆.


http://sourceforge.net/
上有cscope15.4的版本, 抓回来, 可以运行, 它是在win2k的窗口下它会把代码页切换回437去--这是一个DOS下的16位程序, 运行它时win2k必需通过ntvdm.exe给它提供一个虚拟机, 根据我调试gvim的结果来看, 这正是cscope在gvim中不能正常使用的根本原因, win2k对所谓legacy DOS程序支持还毕竟有限.


自编译:
万般无奈, 我只好抓回源代码, 修改, 编译. 它需要的东东有:
pdcurses
regexp
这两个软件包在编译时需要其头文件, 链接时需要其.lib文件, 运行时需要其动态运行库, 必需下载
bison
flex
这两个是在编译前运行, 通过它们生成egrep.c和 fscanner.c这两个源文件. 只要能正确运行就行. 我用的是djgpp里带的, 理论上, 如果有其它平台上的这两个程序, 只要运行一下它们生成必要的egrep.c 和 fscanner.c两个文件, 也行.


通过静态分析它们的Makefile文件, 用VS.NET 生成一个C++项目, 编译.
放到vim的运行目录下, 
:cscope add cscope.out


OK!
现在我把这必需的3个文件压缩后放在这些, 应该大家直接解压到VIM的运行目录(即gvim.exe所在的那个目录, 典型的是C:\vim\vim62)下即可.
我的测试环境是
win2k professional chinese version, sp3
vim6.2 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值