学习VIM

#=================================================================================
#  作者:老猴
#  Copyright (c) 2008 老猴
#  本文遵循自由软件GPL协议,允许自由复制、修改、传播,但请保留作者名,版权申明。
#=================================================================================

==前言==
想学习VIM应该是我第一次用Linux的时候,当时应该还不知道vi和Vim的区别,只知道可以用vi在Linux下修改一点文本的东西,知道按i插入,按wq或x保存退出,如果不想保存,就用q!,当然,还知道!的能力很强大,它可以让你干成系统不想让你干的任何事情。

我学习编程是从VC开始的。非常遗憾的是,我并不喜欢当时教学用的Turbo C,而是一开始就拿VC入门了。多年以后我看到我的一个研究生师弟居然先用TC写程序,然后再到VC中调试,这让我感受到了习惯的力量有多强大。而我是一直用VC6.0的,加上破解个的Assistant,用得也很是习惯,可以用Alt+left和Alt+right回退的功能就让我兴奋不已。我基本没有学会在VC8编程,和VC6完全不一样的界面让我非常不舒服,还有就是微软总喜欢自作聪明地在工程里加上一堆他认为可以给我带来方便的东西,但这都不是我想要的。于是我就用VC6编写了大约有10多万行的代码,大多数都是和Windows平台相关的,当然有时候也会用点别的,比如用EVC写过掌上系统的程序,用VC7/8写过Windows Mobile的程序,当然我也用破解了的UtraEdit,但总的说来,用得最多的就是VC6 + Assistant + Intel C/C++ Compiler + NASM的组合。后来我写的程序基本上都是平台无关的算法,对于微软的工具的依赖就越来越小了。

真正的在Linux下编程是从2年前开始的,那时候我刚换工作到现在这家公司,在嵌入式Linux上作开发。当时人比较少,很难多人以前也没有怎么用过Linux,服务器也很少,大家都登录到一台服务器上干活。很多人都用Samba共享自己在服务器上的工作空间,用Source Insight编辑和查看放在服务器上的代码,用Putty或者用VNC登录到服务器上编译和调试。这还是我第一次将编辑和编译分开来工作,以前在VC下写完代码按一下F7就搞定的事情现在要分好几个窗口,虽然很快就能学会,但真正适应了这种方式还是花了很长时间。

Source Insight确实是个很好的编辑器,特别是搜索功能,但遗憾的是只能在Windows下用。当我在家工作,要登录公司服务器的时候,以前所有的编辑和阅读习惯都不再能用,这实在是件闹心的事情。

从另外一个角度,VC也好,UtraEdit也好,还是Source Insight也好,毕竟都是收费的商业软件,因为特殊的原因,我们现在还可以有破解的版本可用,但这毕竟不是什么好的事情,随着全球化进程的步伐,这些软件变为收费的也将是迟早的事情。总之一句话,我不能离开了Windows就不能工作,也不要离开了盗版软件就不能工作,我得为我现在工具找些替代的产品。

于是我就开始学习Vim。在这个时候还有个小插曲:公司的一个老员工,也是我入职时候的Supervisor,他以前也是完全不会Linux,后来开始潜心研究Vim,好像颇有心得,每次见到我用Source Insight的时候都会来一句:”怎么还在用这么落后的工具?”潜台词中,Vim是要比Source Insight先进了。

但我还是坚持认为,工具仅仅就是工具而已,熟悉一个工具是必须的,但不要把工具的技巧太当回事,不要舍本逐末。

Vim和其它Windows的工具不一样的是它不是那么容易上手,需要一段时间的学习和练习才能用的顺手。学习Vim最好的资料就是它的用户手册,说实话,真的很少有软件能把用户手册写得那么详细的,何况一个共享软件。这个手册有简体中文的,一共300多页。不要担心它厚,打印出来放在身边,有空就看一点,慢慢的就会有很多收获的。还看过一本资料是台湾李果正先生写的《大家来学Vim》也很不错。

下面我就讲讲我是怎么用Vim的,实际上我现在对Vim也是刚刚了解的程度,这些技巧只适合那些想学习Vim但还不得其道的新手们,如果您已经学会了这些技法,请一笑而过。

==基本操作==
打开文件:
  一般来说,咱们都很习惯先进入某个目录,然后找到某个文件,然后再用vim filename去打开一个文件,在编辑另外一个文件的时候,又单独开一个窗口,再用相同的命令打开另外一个文件。我现在的习惯是,在工作目录的顶端打开vim,然后用:e filepath/filename来打开文件,需要编辑另外一个文件的时候,用同样的命令打开(与Source Insight不同的是,在打开下一个文件之前,必须对当前文件存盘)。这个时候你用:ls或者:buffers命令查看一下,能看到什么?是的,能看到所有打开的文件,并对其编号。这时你可以用类似于:e#1的命令来切换文件,这里的1为文件编号。

插   入:
  插入字符:以前只知道i表示在当前光标前插入,而我的习惯是在当前光标后插入,所以现在用得最多的是a,还有就是I,表示在当前行的行首插入。

  插入行: o/O,搞清楚这两个区别对于写程序的人来说还是很重要的o表示在当前行的下一行插入,O表示在当前行的上一行插入。这对于写程序的人来说是很方便的。

存档/退出:
  用x替代wq,区别是,如果文件没有被改变,x不会有存档动作,而wq无论有无改变都会进行存档操作。这在读代码的时候显得比较有用,快与慢给人带来的心情是不一样的。

移  动:
  非常抱歉的是,我的Windows习惯还是很难改正的,至今还不习惯用hjkl来移动光标,虽然据说这个几个键是经过精心挑选过的(但我打游戏的时候喜欢用左手控制方向,设置的键是awsd),所以我现在还是用箭头键来移动光标,用PageDown和PageUp来翻页,用Home来跳到行首,用End来跳到行尾。虽然我也知道对应的Vim的操作应该是Ctl+f,Ctl+b,0,$。

  我比较习惯用的Vim的命令是:用gg跳到文档首行,用G跳到文件尾,用zz将当前编辑的位置放在屏幕中间(这对于写到底部了的时候很管用)。当然,还有用:n跳到第n行,或许w也会很有用,它表示在前进的时候以词为单位,而不是以字母为单位。
 
  其它的一些精确移动我是不用的,比如^和0的差别,^会跳到行首的第一个字母处,而0会跳到真正的行首————我是个粗人,干不了这么细的活。

是用的比较多的移动命令,它会跳到匹配的{} [] ()上,这对于编写和阅读程序来说,简直是必须的。其它的诸如:) 移动到下一个句子的句首;( 移动到下一个句子的句首; [ 移动上一个段落的首部; ] 移动到下一个段落的首部。这些我都是不用的,估计是为了英文写作而设计的命令。

  跳回到先前编辑的位置,在Source Insight的时候用alt+,和.,在VC Assistant中用alt+左右箭头,在Vim中用Ctl+o。(或许还有更好的方法,只是我还不知道而已)

复制与粘贴:
  如果是复制并粘贴一行,这就太简单了,yy和p或者P,p是粘贴在当前行的下一行,P是粘贴在当前行的上一行。
 
  如果只是复制某一部分,就现按v进入Visual模式,然后再选中,再按y,再移动到要粘贴的位置后用p即可粘贴。

  同样,按Ctl+v后进入Visual block模式后,可以列选,同时也可以列编辑。

  其实还可以用yny的方式来复制多行,但我个人觉得这并不方便,人老眼花,经常数不明白,还是选中来得直接。

  复制一个词是yw,复制两个词是y2w。

  罗唆一句,在Vim中复制不是Copy,而是Yank,粘贴不是Paste,而是Put。

  另外,用c可把选中的部分剪掉,同样可以用p粘贴,还有d,dd掉的数据,同样可以用p粘贴,因为这些数据都是放到寄存器中的,寄存器中的数据可以用:registers命令查看,用"ap粘贴寄存器a中的数据,用"5ayy可以复制5行数据到a缓冲区

书签:
  书签应该是一个非常有用的功能,但我却一直没有用好过。如果你需要加入一个书签a,就用m,无论移动到了文档的任何地方,都可以用"a跳回来。但我在移动的时候总是忘了加书签,所以也很少用到这个功能了。

查找:
  /为向前查找,?为向后查找,*为想前查找光标处的词,#为向后查找光标处的词。n为按查找的方向继续查找,N按相反的方向查找。
  更高级一些的查找?这跟Vim无关,学习正则表达式吧。

替换:
  替换的语法为:[range]s/pattern/string/[c,e,g,i]
  range指的是范围,1,7行表示从地一行第7行,%表示目前编辑的文档。pattern表示被替换的字串,string将替代pattern所表示的字串。c表示confirm,e表示不显示error,g为globe表示整行替换,i为ignore,表示忽略大小写
  pattern的格式?同样需要学习正则表达式。

do和undo
  undo: U
  do: Ctl+r

多窗口编辑:
  按一下Ctl+w+v试试,是不是多出了一个窗口?要在水平方向多一个窗口,就用Ctl+w+s,或者直接用命令:split。可以连续的按ctl+w在多个窗口间切换,还可以用Ctl+w+hjkl,这里hjkl和移动的左下右上相同。用:q或者Ctl+c可关闭当前窗口,或者用:only指令关闭除当前窗口的其它窗口。
 
显示当前文档名字:
  有时候会忘掉当前文档的名字,那么就按Ctl+g吧。

页面重排:
  Shift+> 向右移动一个tab,shift+< 向左移动一个tab。

man一个函数的用法:
  在光标所在地,按一下K试试。

==设    置==
需要用:设置,也可以写到.vimrc文件中。

语法高亮显示:
  syntax on
设置颜色风格:
  colorscheme desert
设置tab键的宽度:
  set shiftwidth=2
  set tabstop=2
tab用空格扩展:
  set expandtab
设置文件格式(可避免打开dos文件时结尾显示^M):  
  set ffs=unix,dos
  set ff=unix
搜索时,在字符串还未完全输入时就开始搜索:
  set incsearch
我不喜欢自动换行功能,所以设置:
  set nowrap,如果需要自动换行,则可用set wrap.
设置自动对齐:
  set autoindent
指令扩展:
  这个东西实在是太强大了,比如作这样一个映射:
  nmap ," _i"<ESC>A"<ESC>
  这实际上是将一连串用,"替换,这一连串动作为:移动到行首,然后在行首前插入",再移动到行尾插入"。这时候,那些精细移动的指令就可派上用场了。
 
  有动作录像的功能,就是将一连串的动作录下来,在需要的时候可以重复那一连串的动作,这个指令为q,比如qa^i"<ESC>$a"<ESC>q 就会把^i"<ESC>$a"这一连串动作录下来,放在@a中。相同的办法,可以录制qb, qc……
 
==插    件==
  Vim有很多插件可以用。插件的安装非常简单,将插件文件拷贝到$HOME/.vim/plugin下,把对应的文档拷在$HOME/.vim/doc目录下就可以了。
  我现在安装的插件有:
  tabbar,它可以用标签显示已经打开的所有文件,使用alt+标签号在文件间切换。使用这个功能的前提条件是你的终端软件没有打开更多的标签,否则这个快捷键就会被终端软件占去。
  taglist,这个和ctags结合,可以动态显示当前文件所有的宏和函数列表,这个功能和Source Insight一样,但更新速度较慢,对新添加的函数需要过一段时间才能看到。我不知道会不会有什么设置可以加快它的刷新速度。
  Winmanager,这是个文件浏览器,打开后可显示文件树列表。
  a,这个插件很有意思,敲入命令:A的时候,会自动在当前文件的对应.cpp或者.h之间切换,但前提条件是这两个文件都已在vim中打开,否则它会新建一个文件。

==脚   本==
  Vim另外的一个强大的武器,它的存在使得Vim好像无所不能,这部分内容我还需要继续学习。

==正则表达式==
  这不是Vim特有的,几乎所有的优秀编辑器都支持。但正则表达式确实使Vim如虎添翼,看着那些简单的几个符号就像变魔术一样完成文本处理,那种感觉实在是太奇妙了。不过正则表达式真不是那种很友好的语言,乍看上去怎么都觉得跟天书一样,这需要努力地学习。

==总结==
  ”工欲善其事,必先利其器”,在工具上花点功夫总是值得的。但我同时还是要坚持自己的观点,”工具就是工具”,程序设计的重中之重还是在程序设计思想和对算法的深刻理解上。
  不过Linux下的工具确实不适合懒惰的人,你总得花一点时间学习才能用得得心应手的,所以我也很高兴有这样一次学习的经历,它居然让我这个很慵懒的人变的稍稍有点勤快了,这对预防老年痴呆还是有好处的。


posted @ 2008-07-13 12:27  老猴的技术博客  阅读(1876)  评论(1编辑  收藏  举报