《2022年程序员的编辑器神奇的VIM .pdf》由会员分享,可在线阅读,更多相关《2022年程序员的编辑器神奇的VIM .pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、程序员的编辑器 VIM dieken at newsmth dot net yubao.liu at gmail dot com 首先请注意标题,我在介绍的是编辑器,不是IDE,所以如果想将 VIM跟Visual Studio、Eclipse 等等比较时,请跟他们的编辑器比较。一、VIM的历史(1)ed ed是UNIX 上最古老最基本的编辑器,它最初是UNIX 之父Ken Thompson 编写的,他第一次在 ed中应用了正则表达式(regular expression),这个创举将 RE 理论带入了实践,对UNIX 界造成了深远的影响。实际上 ed是受来自加州伯克利大学的QED 编辑器的影响
2、,Ken便是从所院校这里毕业的。ed是一种行模式编辑器,下面是一个ed会话的例子:$ed greeting 0#因为新创建文件,所以读入了0个字节 a#进入编辑模式(append)hello world,eveyone.#输入一行文本#回到命令模式 1p#显示(print)第一行 hello world,eveyone.1c#最后一个词写错了,修改(change)第一行 hello world,everyone.#回到命令模式 1p#重新显示第一行,这回发现无误 hello world,everyone.q#退出(quit)?#?表示没有保存或者命令不认识 w#保存(write)23#提示写了
3、 23个字节 q#退出 也许大家觉得这个编辑器比较BT,可是在 70年代,许多使用 UNIX 的人都是用廉价 的终端机通过电话线连到UNIX 服务器上的,因为传输速率慢,所以这种简洁的行模式编辑 就很有意义,现在虽然硬件有了长足的发展,ed 编辑器很少有人用了,但是它的很多理念 比如命令字符、正则表达式却在它的很多后辈身上体现出来。下面这个网址有一些ed的笑 话,从中我们或多或少能体会到那个时代人们的某种精神。http:/www.gnu.org/fun/jokes/ed.msg.htmlGNU ed:http:/www.gnu.org/software/ed/ed.htmlReference:
4、http:/en.wikipedia.org/wiki/edhttp:/snap.nlc.dcccd.edu/learn/nlc/ed.htmlhttp:/cm.bell- ex是ed的扩展,实际上 vi 构建在 ex之上,vi引入了现在我们所熟悉的全屏编辑模式。1/10名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 10 页 -(3)vi 随着硬件的发展,UNIX 上许多全屏模式编辑器被开发出来,pico,nano,joe,jed,jove,但是最为广泛使用的无疑就是VI(nvi,elvis,vim等)和Emacs(GNU Emacs,XEmacs等)。1976年左右 Bill
5、 Joy开发了 vi,他也是伯克利大学的毕业生,后来他跟其他人一起 成立了 Sun Microsystems 公司并成为了 Sun的首席科学家。一开始 Bill开发了 ex,尔后开 发了vi 作为ex的visual interface,也就是说 vi 允许一次能看到一屏的文本而非一行,vi 也因此得名。在当今的 UNIX 系统上,可能没有缺省安装Emacs,但是肯定会有 vi,当然,ed 编辑器也必定存在:-)Reference:http:/www.bellevuelinux.org/vi/history.htmlhttp:/www.theregister.co.uk/2003/09/11/b
6、ill_joys_greatest_gift/(4)VIM 技术不断进步,需求也在不断提高,vi 的各种变种也不断涌现,知名的有nvi,elvis,VIM,vile,yzis,其中移植性最好、特性最多、使用最广的当属VIM,VIM主要是 Bram Moolenaar创作的。下面是 VIM的重要版本历史:DATE VERSION Milestone 2005 Vim 7.0aa Spell Checking,multi tabpage 2000 Jul 09 Vim 6.0a Folding(and more)1998 Feb 19 Vim 5.0 Syntax coloring/highlig
7、hting 1996 May 29 Vim 4.0 Graphical User Interface(Robert Webb).1994 Aug 12 Vim 3.0 Support for multiple buffers and windows.1992 Vim 1.22 Port to Unix.Vim now competes with Vi.This was when Vim became Vi IMproved.1991 Nov 2 Vim 1.14 First release(on Fred Fish disk#591).Reference:Learning the vi Edi
8、tor,6th Edition,OReilly.http:/ (中国电力出版社有中译版)http:/ vim:help vi_diff.txt :help version4.txt :help version5.txt :help version6.txt 二、VI/VIM基础知识 很多人应该都知道 VI是个有模式的编辑器:编辑模式和命令模式,按ESC 回到命令 模式,用i 或者a进入编辑模式,由于区分了模式,导致VI的命令非常简洁,而无模式编辑 器比如 Emacs,所有的命令都需要加上控制键Ctrl 或Alt,所以有个笑话说 Emacser 们最希望 计算机备一个脚踏板,这样就可以用脚踩 C
9、trl 和Alt 键了(编辑器圣战在 VI和Emacs 之间 有很多口水战,自然也引出非常多的幽默),这里罗嗦一句 VI vs.Emacs:VI继承了 ed的 理念,另外也有历史原因,VI追求的是快捷启动程序迅速,编辑文本高效,功能专注,而Emacs 追求的是功能的丰富强大以及集成带来的方便,在Emacs 里头可以发邮件,上新闻组,2/10名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 10 页 -听mp3,浏览网页,玩游戏,几乎可以login-emacs-logout了:-),VI和Emacs 都是程序员 的编辑器,相比而言,Emacs更是提供了一种程序员的生活氛围。闲话少说,
10、这篇文档也不是一份VI/VIM教程,所以这一节我只会简单的提及VI/VIM的基 本知识。VIM引入了更多的模式,在VIM里头:help mode 可以看到 VIM的所有模式,主要有如下几种:Normal mode 即通常所谓的命令模式,在此模式使用 a,i,A,I,o,I等进入 Insert mode Insert mode 即通常所谓的编辑模式,在此模式使用 ESC 进入Normal mode或 者Ctrl-o 临时进入 Normal mode.Command-line mode 命令行模式,在Normal mode下按冒号进入,按ESC 取消执行命 令或者回车执行命令,然后回到 Norma
11、l 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!不保存并退出 ZZ 保存并退出(按住Shift,再按两次 z)VI的命令是非常具有美感的,下面是几个例子:i 在光标前插
12、入 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 的命令大多都可以带一个数字前缀或者一个数字范围,比如:5dd 从当前行开始删除 5行 5yy 从当前行开始拷贝 5行 1,3d 删除1至3行 1,3y 拷贝1至3行 (.代表当前行,
13、$代表最后一行)d,y,c,v分别代表删除/拷贝/修改/选择 命令指定的范围,比如 int main(void).;将光标放在 处,然后输入 v%就可以把大括号中内容选定,然后按=就可以按照 C语言格式 缩排(:help=可以看到=命令的描述),%命令的作用是跳到匹配处,比如括号之间,C 的 宏指令#if#else#endif之间。3/10名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 10 页 -int some_ugly_name and some_ugly_modifier(void)如果光标放在第一个 s上,想删除到(为止,则输入 dt(就可以了,t(的作用是跳到下一个(
14、前.dG 可以从当前位置一直删除到文件末尾,因为G 的作用是跳到文件最后一行。VI的命令可以非常快捷的做到一些复杂的编辑操作,下面是几个示例:(a)将(1),.,(2),.,(100)替换成(2),.,(3),.,(101)。在文本中一处处找到并修改是很累的,在VIM下一条命令就可以搞定:%s/(d+)/=(.(submatch(1)+1).)/g 命令解释如下:%全文(%是1,$范围的缩写)s 替换/搜索字符串开始(左括号(开始记录匹配 d+一个或多个数字)结束记录匹配)右括号/搜索字符串结束=把后面的表达式计算出来作为替换字符串(左括号 字符串连接运算符(submatch(1)+1)把第一
15、个匹配的结果加一作为一个整体返回)添上右括号/g 替换字符串结束,g 表示替换每一行的所有匹配结果。(b)这个问题是我曾经碰到的,有一个 log 系统对于输出行长度有限制,因此在 输出很长的 log 时需要断行,在断行时以单行的-$-标记,现在的需求是 把这些行连起来,在VIM中也可以很方便的做到(edyfox at newsmth指点):%s/n-$-n/g 命令的含义就是把 换行-$-换行 替换成空,另一个办法是:g/-$-/norm ddkJx 命令g/-$-/的含义就是找到所有的断行标记,然后norm表示在找到的 每一个行上执行后面的命令,dd 删除这个断行标记,k 移动到上一行,J
16、合并 当前行和下一行,由于J合并后会留一个空格(只对于英文情况下),所以x 来删除这个空格.(c)在Fortran 代码 integer,dimension(:,:),allocatable:&short_var,&A_very_long_name_var,&other 4/10名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 10 页 -中,想把每行的&符号定位到固定的一列,比如第 78列,手动对齐也是很麻烦的,这个问题可以用 VIM的Align 插件(http:/www.vim.org/scripts/script.php?script_id=294解决,另外利用宏也可以:se
17、t ve=all 使得光标可以定位到屏幕任何位置(缺省下VIM的光标只能放在行内的字符上)gg 到文件第一行/s+&s*$找以&结尾的行,&前至少一个空白字符,后0或多个空白字符 qa 记录宏到寄存器 a D 删除到行尾 78|定位到第 78列 i&插入&并返回到命令模式 n 查找下一个&q 停止记录宏 10000a 执行一万遍寄存器 a中保存的命令:set ve=恢复ve缺省值(d)连续插入 72个等号:按ESC 进入Normal mode,输入72i=再按ESC 即可.(e)在多行开始插入/:移动光标到需要注释掉的第一行开头,然后按 Ctrl-v(如果开启了 VIM的mswin行为,则 C
18、trl-v表示粘贴,这时需要用 Ctrl-q 代替)进入Visual blockwise模式,这个模式是 Visual mode 的一种,相当于 UltraEdit中的块选择.然后按 j 选择上所有需要注释行的 行首(看起来效果是选择了第一列),输入I/再按ESC 就可以在每一行开头插入/了.Reference:http:/newsmth.org VIM board http:/edyfox.codecarver.org/html/index.html这些例子也许初看起来有点吓人,可是在很多时候 VIM这些强大的命令能省不少力,VIM 不愧是为“编辑”这个功能费尽心思:-)三、编程辅助 既然是
19、程序员的编辑器,自然要show 一下它的编程辅助功能。(1)ctags,cscope 现在的 IDE都提供了类、函数的索引功能,可以方便的找到某个类或者函数的 在哪里定义的,VIM这方面可以利用 ctags、cscope做到,Exuberant ctags支持的语言种类非常多,UltraEdit的tags 功能也是利用的 ctags。cscope只支持 C,它能实现 Source Insight的一些 功能,比如查找某个函数调用了哪些函数,某个函数被哪些函数调用。VIM对这两个工具 集成的非常好,利用它们就可以在源文件中方便的跳转搜索类和函数了。Reference:http:/ Exubera
20、nt ctags http:/iamphet.nm.ru/cscope/cscope for Win32 :help ctags :help cscope(2)multi window,multi buffer,multi tab page 5/10名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 10 页 -一个buffer 对应一个文件,它可以对应多个window,这样可以方便的对照编辑一个文件 的不同部分,tab page 跟现在许多编辑器上常见的标签页意义并不一样,可以将 tab page 理解为一个 windows的容器,这样如果想新建一个窗口编辑文件但又不想 打乱现在的
21、多窗口布局,那么就可以新开一个tab page,把新窗口放到这个新的tab page 里头。tab page 是VIM 7.0 不久前新增的特性,目前VIM 7.0 还未正式发布。Reference:help windows :help buffers :help tabpage(3)语法高亮 VIM发行版里带了 450多种语言的语法高亮,在其主页 vim.org 上还可以找到更多。Reference:help syntax(4)自动缩进 在打开自动缩进选项后,VIM会自动的控制缩进,比如输入自动向右缩进一个 tab 字符(具体用什么缩进可以配置),输入自动回退缩进.使用=命令可以对选择的程序
22、块排版 缩进,这对于整理代码非常有帮助.另外对选择的块用 和命令可以很方便的控制一个 程序块的缩进.Reference:help cindent :help autoindent :help smartindent(5)类和函数列表 taglist等插件可以提供很方便的类和函数列表功能。(6)自动完成 VIM在Insert mode 下输入一个单词的前几个字符,然后用Ctrl-p 或者Ctrl-n 就可以 列出以这些字符开头的单词,特别在配置了 ctags 后也能列出头文件中的符号,特别 方便,除此外 VIM还有行自动完成、文件名自动完成等,这点即使是现在强大的IDE 也未免不足。如果设置了如
23、下选项:set wildmode=list:full:set wildmenu 则在命令行打开文件或者输入命令时按Tab(以输入字符为前缀补全)或者Ctrl-d(列出 包含输入字符的所有匹配项目)自动补全,这一功能大大降低了 VIM的使用难度。另外有许多插件可以实现许多IDE中的自动完成类成员的功能,当然,这个功能 还比不上 Eclispe、Visual Studio等IDE中的强大,这一点是 VIM比较可惜的地方。Reference:help complete(7)fold VIM支持折叠代码,还可以根据文件中特殊的标记对文件中的行折叠,可以实现Outline 视图,6/10名师资料总结-精
24、品资料欢迎下载-名师精心整理-第 6 页,共 10 页 -这可以极大的方便编辑很大的文件。Reference :help fold(8)quickfix 许多人对于 UNIX 开发的印象都是“编辑代码,退出编辑器,编译,发现错误,记录出错信 息,遍辑代码,退出编辑器,编译,用gdb调试,再编辑代码”,这是古老的VI时代的 事情了,有了 VIM的quickfix特性,我们可以在 VIM里编译然后直接跳到编译出错的行,这 个反复的过程无需退出编辑器,而且VIM的quickfix特性可以经配置后支持不同的编译器 以及不同的语言:只要编译器在出错信息里包含文件名和行号。不过比较遗憾的是 VIM对于集成
25、调试支持还不好,有些项目尝试集成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 四、强大方便的帮助系统 使用了那么多软件,只有VIM和Emacs 的帮助系统给我方便快捷的感觉,大部分 软件
26、的帮助往往是摆设而已,而VIM的帮助的确是考虑到了自己help的身份,利用它 能很方便容易的找到想要的东西。VIM的帮助是超链接形式的,它使用的就是tags,所以可以跟 ctags 功能 一样按 Ctrl-跳转到链接所指处,按 Ctrl-o 返回。: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 tabsto
27、p(这些信息都在:help 打开的帮助首页上)如果你记不清命令或者选项的全称,那么可以利用 Tab或者Ctrl-d 的自动补全功能。:help options 可以找到所有的选项说明 查看某一个选项的值(实际上选项是 VIM中的一种变量,类似 SHELL 的变量以$符号引用,VIM的选项以&引用,另外 VIM的寄存器以 引用):echo&tabstop 五、其它高级功能(1)寄存器 VIM里面的寄存器可以用来保存拷贝的文本、记录的宏、设置的书签等等,一般的编辑器 都只有一个剪切板(MS Office 加入了多个剪切板),而VIM和Emacs 编辑器中的多寄存器 可以实现多个剪切板的功能。VIM
28、中有九类寄存器:无名寄存器 最近一次删除/修改/替换操作的文本都会放入这个寄存器 10个数字寄存器 0-9 拷贝或者删除的文本存入这些寄存器,这些寄存器是循环使用 的,在每次存入内容到寄存器1时,原有的内容会依次存入到 后一个寄存器中。小删除寄存器 -删除内容少于一行时放入这个寄存器 7/10名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 10 页 -26个命名寄存器 a-zA-Z 大小写无关。这些寄存器可以在拷贝或者删除等操作中指定使用。四个只读寄存器 :.%#特殊用途。表达式寄存器 =特殊用途。选择和拖放寄存器 *+用于与系统剪切板交互,以及接收拖放操作的内容。黑洞寄存器 _
29、 放到这里面的内容都被丢弃,这样可以删除或拷贝时不影响其它寄存器。最后一次搜索模式寄存器/保存最后一次搜索的正则表达式。使用:reg 命令可以看到所有寄存器中的内容,使用+y 或者*y 可以将 visual mode 下 选择的内容拷贝到系统剪切板,使用+p 或者*p 可以将剪切板中的内容粘贴到VIM中,如果打开了 mswin特性的话则在 insert mode 下使用 Ctrl-x,Ctrl-v,Ctrl-c了。Reference:help registers(2)宏 Normal mode下按q,指a-zA-Z0-937个寄存器中的一个,然后可以进行任何操作,包 括在模式间切换,最后在No
30、rmal模式下按 q可以结束宏录制,用 命令可以应用这个 宏,命令前可以带数字前缀表示执行多少次这个宏。Reference:help q(3)书签 Normal mode下按m 作书签,指26个命名寄存器中的一个,然后可以用 或者 跳到书签处。Reference:help m(4)映射 VI/VIM可以将某个按键序列映射到一个命令序列上,比如在配置文件.vimrc(Windows 下是 _vimrc)中写入 map i=strftime(%Y-%m-%d)即可以在 Normal mode下插入当前日期。Reference:help:map(5)缩写 VI/VIM支持用一个缩写字符串代替一个长的
31、字符串,比如:ab hw hello world 然后在 Insert mode 下输入 hw(不包括引号)后VIM就自动替换成了 hello world。这里展示一个 Emacs 下abbrev功能的动画(没错,是 Emacs 的:-):http:/www.bloomington.in.us/brutt/msf-abbrev.htmlhttp:/www.bloomington.in.us/brutt/msf-abbrev-demo.gifReference:help:ab(6):s/和:g/,:!g/这两个命名加上正则表达式,常常能完成非常复杂的编辑任务,可以毫不夸张地说 8/10名师资料总
32、结-精品资料欢迎下载-名师精心整理-第 8 页,共 10 页 -是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编写插件,这些插件 极大的丰富了 VIM的功能。(8)color scheme VIM有许多配色方案,下面这个链接有许多配色方案效果的图样:http:/w
33、ww.cs.cmu.edu/maverick/VimColorSchemeTest/(9)二进制编辑 VIM可以利用 xxd实现二进制编辑,不过这项功能还是不够好用。(10)sign sign 指在编辑窗口的最左列显示一个标记,利用这个功能能实现很多IDE 中的书签标记或者断点标记。Reference:help sign 六、常用 VIM插件 BufExplorer.vim(http:/xxxxxTaglist.vim TabBar.vim minibufexpl.vim c.vim latex-suite cppcomplete.vim word_complete.vim winmanage
34、r sketch.vim DrawIt.vim MultipleSearch Mark.vim SearchComplete.vim http:/9/10名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 10 页 -自动完成的插件?七、VIM资源 http:/www.vim.org VIM 主页,有许多 scripts和tips,查找插件的第一去处。http:/ 新水木 BBS 的VIM版,有很多 VIM爱好者可以讨论 http:/ VIM 文档工程 http:/vcd.gro.clinux.org/VIM 中文文档(强烈赞一个!)http:/tnerual.eriogerg.fr
35、ee.fr/vim.html VIM Quick Reference Card http:/edyfox.codecarver.org/newsmth VIM 版版主的 wiki 王垠的页面?学习 vi 编辑器(第六版)机械工业出版社译,OReilly 两个学习正则表达式的工具(from happyvim at newsmth)http:/weitz.de/regex-coach/Regex Coach http:/ http:/www.yzis.org/yzis是一个新的 VI变种,它支持变宽字体,目前功能还不够丰富。http:/ex- 八、编译安装最新 CVS 版的VIM 九、一份 vimrc 配置文件 十、VIM的不足 前面已经提到,VIM在自动完成和集成调试方面还比不上现代的许多IDE,另外 VIM对二进制编辑还没有 UltraEdit强大,对于现在流行的重构,VIM也支持不力,但是作为一个文本编辑器而言,堪比的只有Emacs,另外 Visual SlickEdit也很 强大,不过它是商业软件。VIM也可以嵌入到 Visual Studio中作为编辑器,另外 Code Forge,Eclipse等也提供了一定的 VI支持或者键绑定。10/10名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 10 页 -
限制150内