Vim 实用技术第一部分.docx
- 文档编号:9015079
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:16
- 大小:102.84KB
Vim 实用技术第一部分.docx
《Vim 实用技术第一部分.docx》由会员分享,可在线阅读,更多相关《Vim 实用技术第一部分.docx(16页珍藏版)》请在冰豆网上搜索。
Vim实用技术第一部分
Vim实用技术,第1部分:
实用技巧
吴咏炜(wuyongwei@),软件架构师
吴咏炜,目前从事与开源相关的软件架构工作,可通过wuyongwei@和他联系。
简介:
本系列文章分三部分详细阐述了Vim的使用技巧、插件、定制。
第一部分主要是深入分析了Vim的使用。
查看本系列更多内容
标记本文!
发布日期:
2006年3月22日
级别:
初级
访问情况 947次浏览
建议:
0 (添加评论)
您的评分
0.Vim简介
作为开源世界最重要的编辑器之一(另一个是Emacs),Vim以其强大的功能和可定制能力被众多开发者所喜爱。
不过,也许就是因为Vim的功能太强大了,要真正用好Vim并不容易。
本文作者在多年的实际使用中逐渐掌握了一些实用技术,在此介绍给大家。
——本文并不企图对Vim作全面而系统的介绍,但也绝非零星地点到即止;而是希望通过介绍一些重要特性和提供相关参考信息,引起大家的兴趣,去深入挖掘其能力,真正把这一强大的工具用好。
下面首先对Vim做一下最基本的介绍,并给出一些参考信息,以方便对Vim不熟悉的读者也能够理解并自己查阅进一步信息。
与大部分其它编辑器不同,进入Vim后,缺省状态下键入的字符并不会插入到所编辑的文件之中。
Vim的模式(mode,可以简单地理解为“状态”)概念非常重要。
需要知道,Vim有以下几个模式:
∙正常(normal)模式,缺省的编辑模式;下面如果不加特殊说明,提到的命令都直接在正常模式下输入;任何其它模式中都可以通过键盘上的Esc键回到正常模式。
∙命令(command)模式,用于执行较长、较复杂的命令;在正常模式下输入“:
”(一般命令)、“/”(正向搜索)或“?
”(反向搜索)即可进入该模式;命令模式下的命令要输入回车键(Enter)才算完成。
∙插入(insert)模式,输入文本时使用;在正常模式下键入“i”(insert)或“a”(append)即可进入插入模式(也有另外一些命令,如“c”,也可以进入插入模式,但这些命令有其它的作用)。
∙可视(visual)模式,用于选定文本块;可以在正常模式下输入“v”(小写)来按字符选定,输入“V”(大写)来按行选定,或输入“Ctrl-V”来按方块选定。
∙选择(select)模式,与普通的Windows编辑器较为接近的选择文本块的方式;在以可视模式和选择模式之一选定文本块之后,可以使用“Ctrl-G”切换到另一模式——该模式很少在Linux上使用,本文中就不再介绍了。
Vim带有完整的帮助文档。
在当前的Vim6.4的标准发布中,有一百多章、近六十万英文词的帮助文件,进入Vim后输入“:
help”(命令模式中输入的命令要敲回车键才结束输入,下面不再说明这一点)即可访问。
本文在介绍特性时,对文档中已经说明得很详细的内容只会提纲挈领地加以简短说明和提供应用范例,并提供访问相应的Vim文档的命令。
一般的发布版中还常常带有一个简单的30分钟的Vim教程,新手在操作系统的命令行上输入“vimtutor”命令即可开始学习。
除上面的简单说明外,本文并不介绍最基本的Vim命令,Vim的新手应该先通过教程熟悉一下Vim,再继续往下阅读。
建议所有的Vim用户经常访问Vim的主站点[1]。
上面除了基本的发布、安装、下载等信息外,最有用的内容是用户可以上传自己写的Vim脚本(script)和撰写自己认为有用的提示(tip),供其他Vim用户使用。
在写这一段的时候,Vim站点上已有一千三百多个脚本,提示数刚好超过了一千。
对于序号为nn的脚本,直接访问的URL是http:
//www.vim.org/scripts/script.php?
script_id=nn;对于序号为nn的提示,直接访问的URL是http:
//www.vim.org/tips/tip.php?
tip_id=nn。
不另加说明的话,本文讨论的内容适用于Vim版本6(即从6.0到6.4)。
建议认真的Vim用户升级到Vim6.4,最好是自己编译升级所有的补丁包。
相关信息网站上都有,此处不再赘述。
回页首
1.实用技巧
1.1安装
如果从Linux发布版直接安装Vim,需要注意的一点是,缺省情况下系统并不一定为你安装了一个完整的Vim。
比如,在RedHat(以及后来的FedoraCore)的发布版中,Vim被拆成了四个包:
vim-common(公用部分),vim-minimal(最小安装),vim-enhanced(除XWindow支持外的完整安装),和vim-X11(XWindow图形界面支持)。
最小安装不能完整展示Vim的优点,通常只是作为vi的替代品出现,缺少很多重要的特性如多字节语言支持、鼠标支持和脚本支持。
如果装了XWindow的话,图形界面的gvim也比文本模式的vim具有更多的特性。
建议大家尽可能安装完全的Vim。
如果愿意稍稍费一点功夫,自己编译Vim的话,可以更好地定制Vim。
——附带的另一个好处是,你如果发现什么错误的话,你就可以自己动手来修复这个错误,或至少找到错误所在的位置,让Bram(Vim的作者)可以更快地解决问题。
图1是在Vim中执行“:
version”的结果的一部分,可以看到Vim有很多不同的特性(feature)可在编译时打开或关闭。
如果自己编译的话,就可以选择打开需要的功能,关闭不需要的功能,来获得一个既功能强大、又小巧快速的Vim定制版本。
图1
1.2中文支持
Vim支持世界上的主要语言,当然也包括中文。
如果你用Vim编辑中文,而中文不能正确显示,那有两种可能性:
一是使用的Vim不完整,不含多字节语言支持(multi_byte特性);二是某个配置出了问题。
说到多语言支持,最基本的概念有两个:
一是文件的语言编码,而是环境的内部编码。
在较老的操作系统中,不管Linux还是Windows,这两个编码都是一样的,也就意味着,一次只能处理一种编码的文件:
要么只能处理西文编码(Latin1,即ISO-8859-1[5]),要么只能处理中文编码(GB2312[2])。
而在新的操作系统中,这两者可以是不一样的。
在Linux上,常见的情况是环境的内部编码使用UTF-8[6],而UTF-8可以同任何一种语言编码作无损转换,这就保证了系统的多语言处理能力。
Vim这方面秉承了Unix/Linux的传统,在内部编码使UTF-8的时候,可以同时处理不同意语言编码的文件。
以下列出了和语言编码的相关的设置:
∙环境变量LANG(使用的语言);
∙环境变量LC_CTYPE(使用的内部编码);
∙Vim选项encoding(Vim的内部编码);
∙Vim选项termencoding(Vim在与屏幕/键盘交互时使用的编码);
∙Vim选项fileencoding(Vim当前编辑的文件在存储时的编码);
∙Vim选项fileencodings(Vim打开文件时的尝试使用的编码);
∙Vim选项ambiwidth(对“不明宽度”字符的处理方式;Vim6.1.455后引入)。
如果你的环境只需要处理简体中文的话,那么,最简单的方式就是所有的设定全部使用简体中文。
只需要:
设定LANG=zh_CN.GB2312,不设定LC_CTYPE(默认跟LANG一样),不设定与编码相关的Vim选项(默认由LANG和LC_CTYPE决定),也无需设定Vim选项ambiwidth。
也就是说,我们把语言设定为中国(CN)使用的中文(zh),编码为GB2312(注意:
Vim内部并不识别国标GB18030[3],所以此处只能设GB2312;参看下面关于UTF-8的讨论)。
不过,如果按照目前Linux下的惯例,内部编码一律使用UTF-8的话,会有一些额外的好处,其中之一就是在这种情况下Vim支持同时编辑多种不同编码的文件,如简体中文和繁体中文(参见图2);另外,此时Vim也可以通过编码转换支持GBK[4]和GB18030了。
这样,众多关于语言编码的Vim选项就有了用武之地了。
下面进一步说明一下这些选项和推荐设定(如果适用的话):
图2
∙encoding=utf-8:
不管文件的编码如何,不管如何显示和输入,Vim内部使用的编码是UTF-8;这是国际化支持的基础。
∙termencoding:
取决于实际的终端或XWindow的设定。
举例来说,如果选择语言简体中文登录到XWindow,或者正在使用CXTERM[10]的话,那么该选项应被设为GB2312;如果使用缺省的语言(LANG=en_US.UTF-8)登录到XWindow,或者使用PuTTY[11]远程访问Linux机器、并且设定里的字符编码(配置中Window-Translation)设为UTF-8的话,该选项就应该设为utf-8。
从Windows下使用PuTTY远程连接Linux的请特别注意,测试表明,仅在使用UTF-8的情况下,PuTTY才能可靠地支持中文的显示和输入(显示字体必须设成中文字体)。
∙fileencoding:
文件载入时,该选项被置为Vim认定的文件编码,因此,存储时文件的编码不会改变。
此处和下面fileencodings可使用的编码为libiconv支持的所有几百种编码(如果编译时包含了iconv特性的话),与中文相关的有gb2312、gbk、gb18030、hz-gb-2312、iso-2022-cn、big5、cp936、cp950等。
如果创建新文件,你又不希望使用UTF-8作为文件编码时,那么,你可能需要手工设定该选项,如“:
setfileencoding=gb2312”。
需要注意的一点是,使用“set”来设定该选项的话会改变以后新建文件的缺省编码,而使用“setlocal”的话则只影响当前文件(参考“:
helpsetlocal”)。
∙fileencodings=ucs-bom,utf-8,chinese:
Vim会首先判断文件的开头是否是一个Unicode[7]的BOM(byteordermark)字符[8],是的话则把文件的其余内容解释成相应的Unicode序列;否的话再试图把文件内容解释成UTF-8的序列;再失败的话,则把文件解释为简体中文(chinese是一个跨平台的简体中文字符集的别名,Linux下相当于gb2312和euc-cn;此处也可以根据需要以gb2312、gbk或gb18030等编码替代)。
需要注意的是,该顺序不能颠倒,并且在后面再添加其它编码如big5、latin1也是没有意义的,因为Vim不能识别8比特编码中的错误,因此这些编码后列的编码永远不会被用到。
∙ambiwidth=double:
把所有的“不明宽度”字符[9]——指的是在Unicode字符集中某些同时在东西方语言中使用的字符,如省略号、破折号、书名号和全角引号,在西方文字中通常字符宽度等同于普通ASCII字符,而在东方文字中通常字符宽度等同于两倍的普通ASCII字符,因而其宽度“不明”——的宽度置为双倍字符宽度(中文字符宽度)。
此数值只在encoding设为utf-8或某一Unicode编码时才有效。
需要额外注意的是,如果你通过终端使用Vim的话,需要令终端也将这些字符显示为双宽度。
比如,XTERM[12]的情况下应该使用选项“-cjk”,即使用命令“uxterm-cjk”来启动使用双宽度显示这些字符的UnicodeX终端;使用PuTTY远程连接的话则应在配置的Window-Translation中选中“TreatCJKambiguouscharactersaswide”(参见图3)。
图3
需要设定的选项通常放在用户的Vim资源配置文件中,即在~/.vimrc文件中加入:
setencoding=utf-8
setfileencoding=chinese
setfileencodings=ucs-bom,utf-8,chinese
setambiwidth=double
如果想进一步了解这些选项的话,可以使用“:
help'选项'”查看帮助文档中的相关(英文)信息。
帮助中也可以查到这些选项(以及命令)的缩写:
本文中为方便理解,除一些极少有人使用完整拼写的命令如“:
e(dit)”、“:
s(ubstitute)”等之外,一般使用完整拼写而不说明或使用缩写。
关于配置文件.vimrc,可以使用“:
help.vimrc”查看相关信息。
在使用内部编码UTF-8的情况下,如需编辑fileencodings之外(其不能自动识别)的文件,则可以使用以下命令:
“:
e++enc=编码文件名”。
详情可参考“:
help++enc”。
1.3.鼠标支持
不管是文本界面还是图形界面的Vim,都支持鼠标。
不过,在文本界面中,鼠标支持缺省没有被激活;这就意味着,在终端上使用鼠标,所有的功能仍和没有使用Vim时相同,并不受Vim影响。
要激活文本界面中的鼠标支持也很容易,只需要执行一句“:
setmouse=a”即可。
启用了鼠标支持之后,Vim主要支持的鼠标操作有:
∙单击移动光标到点击的位置;
∙在帮助的关键字上双击显示该关键字相关的帮助信息;
∙在普通文本上双击选中点击位置的单词;
∙拖动鼠标选中文本;
∙使用鼠标滚轮滚动当前缓冲区中的文本;
∙多窗口编辑时可以拖动窗口分栏的位置。
进一步的信息可参看“:
help'mouse'”、“:
helpmouse-using”和“:
helpscroll-mouse-wheel”。
特别需要值得一提的是,在远程访问Linux系统时也是可以使用鼠标的。
如果使用XWindow系统,自然不必说;而使用SSH远程连接时,大部分Linux下的终端客户程序,如XTERM、GNOME-Terminal[13]、较新版本的Konsole[14],以及Windows下的PuTTY,支持鼠标的使用:
你只需简单地启动Vim、执行一句“:
setmouse=a”就可以了(当然,也可以把上面的语句去掉起始的冒号放到.vimrc文件中)。
1.4.空格、制表符和缩进
对于编写代码,缩进是最基本的概念之一。
至于缩进是使用空格还是制表符(Tab),或者缩进是否正好使用一个制表符来表示,很多程序员,特别是Windows开发出身的程序员,很容易混淆。
幸好,Vim对于这些概念有非常完整的支持,足以应付各种复杂的情况。
以下是相关的主要Vim选项:
∙shiftwidth(缩进的空格数);
∙tabstop(制表符的宽度);
∙expandtab(是否在缩进和遇到Tab键时使用空格替代;使用noexpandtab取消设置);
∙softtabstop(软制表符宽度,设置为非零数值后使用Tab键和Backspace时光标移动的格数等于该数值,但实际插入的字符仍受tabstop和expandtab控制);
∙autoindent(自动缩进,即每行的缩进值与上一行相等;使用noautoindent取消设置);
∙cindent(使用C语言的缩进方式,根据特殊字符如“{”、“}”、“:
”和语句是否结束等信息自动调整缩进;在编辑C/C++等类型文件时会自动设定;使用nocindent取消设置);
∙cinoptions(C语言缩进的具体方式,请参考“:
helpcinoptions-values”);
∙paste(粘贴模式,会取消所有上述选项的影响来保证后面的操作——通常是从剪贴板粘贴代码——保持原有代码的风格;使用nopaste取消设置)。
下面给出一些常用的组合:
∙shiftwidth=4tabstop=4:
很多Windows出身的程序员会习惯这样的设置,让缩进等于制表符宽度。
∙shiftwidth=4tabstop=8:
很多Unix程序员的设置,仍使用较常用的4格缩进,但制表符宽度为标准的8。
∙cinoptions=>4,n-2,{2,^-2,:
2,=2,g0,h2,p5,t0,+2,(0,u0,w1,m1shiftwidth=2tabstop=8:
标准的GNU编码风格的设置,对Vim缺省的C缩进风格作了很多微调,比如,if语句下的“{”、“}”要在“if”后缩进两格,但函数定义部分“{”、“}”仍和函数名一行对齐。
开源软件经常使用该种缩进风格。
在编辑代码时一个很有用的命令是调整代码缩进,可以很方便地增加(或减少)若干级缩进,并自动根据选项设定使用正确的空格或制表符。
只需要使用“V”选中你要调整的代码行,然后键入“<”(或“>”)即可增加(或减少)一级缩进;在键入“<”(或“>”)之前键入数字则可以指定增加(或减少)的缩进级数。
我们要讨论的最后一个相关的命令是“:
retab”。
在设定了expandtab选项时,该选项会把所有的制表符转换成空格。
在没有设定expandtab选项时,使用“:
retab!
”可把空白字符转换成制表符(可能误转换,慎用),使用“:
retabn”可以把tabstop重置为n,并转换含制表符的连续空白字符为适当的制表符和空格的组合以保证含制表符的行看起来没有任何变化。
详细信息请参看“:
help:
retab”。
1.5.模式行(modeline)
没人愿意每次都手工输入一大堆的Tab和缩进设定。
可是,放在.vimrc文件中似乎也不是个好主意:
如果我编辑的代码不止一种风格呢?
——考虑一下,如果你参加开源软件项目,你能保证你参加的所有项目,还有你公司里的软件项目,代码风格都一样吗?
——Vim是我用过的第一个支持在文件中记录代码风格设定的编辑器。
这个特性在Vim中叫做模式行,实际上,它所做的是在打开文件时根据文件中的Vim指令设定相关的Vim选项。
下面就是一个嵌在C源代码中的模式行:
/*vim:
settabstop=4shiftwidth=4expandtab:
*/
模式行有好几种形式。
本文只介绍上面的这种形式(其它形式类似,请自行参考“:
helpmodeline”):
行首的“/*”和尾部的“*/”告诉C编译器这是一行注释,不是代码的一部分;而Vim可通过后面的“vim:
”识别出模式行的开始(必须出现在行首或前面有一个空白字符);后面则是“set”和空格间隔开的一串Vim选项;“:
”表示模式行结束。
这种方式非常简单,功能也非常强大。
另外请注意,出于安全的考虑,模式行中的选项只影响当前文件(“:
helpmodeline-local”),也不能做任何设置选项以外的工作。
1.6.寄存器
通常的编辑器有一个剪贴板,以存储复制和剪切的内容。
Vim中的类似概念叫做寄存器(register)。
除了有一个无名寄存器外,Vim还有一大堆有名的寄存器,可以通过“"”(参见“:
help"”)或“Ctrl-R”(参见“:
helpi_CTRL-R”和“:
helpc_CTRL-R”)加寄存器名(字母、数字和某些特殊字符,参见“:
helpregisters”;“无名”寄存器的名字是“"”)来访问。
比如,你先使用“"ayy”复制了一行,然后使用“dd”删掉了一行,然后移动光标到要复制到的位置,就可以使用“"aP”把先前复制的内容粘贴上去了。
手工编辑是有名寄存器的作用还不是很大,但当你想让Vim通过类似于宏的方式自动完成工作时,有名寄存器就变成不可缺少的重要功能了。
下面我们还会用到。
在使用XWindow系统时,有两个特殊的寄存器是需要注意一下的:
“"*”访问的寄存器是X的主选择区域(primaryselection),“"+”访问的寄存器是X的剪贴板(clipboard)。
如果你要在Vim和其它的X应用程序之间复制文本内容,你可以试一下这两个寄存器。
还有一个很特殊的“寄存器”:
“=”。
在插入模式或命令模式中,键入“Ctrl-R=”,Vim会提示你输入一个表达式,普通的整数运算在此完全有效。
如果想要进行浮点运算,请参见第3.2节中的技巧。
1.7.搜索、替换和正则表达式
大家应该都已经知道Vim里使用“/模式”(或“?
模式”)进行搜索,使用“:
s/模式/字符串/标志”进行替换,其中的“模式”是一个正则表达式。
关于正则表达式,不熟悉的话可以边用边学,本节也不打算对Vim的正则表达式作完整的阐述(那可能可以专门写一本小册子了),而只抛砖引玉式地给出一些有用的例子加以说明,以及一些实用技巧。
先说一点点搜索。
搜索里最最有用的一个快捷方式是“*”(向下完整匹配光标下的单词)。
把光标移动到你要搜索的词(变量名、函数名等)上,比如“test”,然后按“*”,Vim将自动产生一个对“\
help/\<”和“:
help/\>”)的搜索,也就是说,搜索完整的单词“test”。
不要小看这个技巧,它经常可以大幅度地提高搜索的速度。
事实上,这是Vim网站上公布的第1号技巧,也是被评价最高的技巧。
相似的技巧还有“#”(向上完整匹配光标下的单词)、“g*”(向下部分匹配光标下的单词)等,请自行查看(“:
help#”等)。
Vim在搜索和替换时会对匹配成功的文本进行加亮,在已经完成搜索和替换任务后,这种加亮有时反而会妨碍显示。
Vim专门提供一个命令取消这种加亮(直到用户再一次使用搜索或替换命令):
“:
nohlsearch”。
建议用户创建一个键盘映射(keymapping)加入到.vimrc中,如:
nmap
nohlsearch
以上命令表示,在正常模式下按F2键相当于输入“:
nohlsearch”后面跟一个回车,即取消搜索加亮显示。
再看几个搜索替换的实用例子。
∙去掉所有的行尾空格:
“:
%s/\s\+$//”。
“%”表示在整个文件范围内进行替换,“\s”表示空白字符(空格和制表符),“\+”对前面的字符匹配一次或多次(越多越好),“$”匹配行尾(使用“\$”表示单纯的“$”字符);被替换的内容为空;由于一行最多只需替换一次,不需要特殊标志。
这个还是比较简单的。
∙去掉所有的空白行:
“:
%s/\(\s*\n\)\+/\r/”。
这回多了“\(”、“\)”、“\n”、“\r”和“*”。
“*”代表对前面的字符(此处为“\s”)匹配零次或多次(越多越好;使用“\*”表示单纯的“*”字符),“\n”代表换行符,“\r”代表回车符,“\(”和“\)”对表达式进行分组,使其被视作一个不可分割的整体。
因此,这个表达式的完整意义是,把连续的换行符(包含换行符前面可能有的连续空白字符)替换成为一个单个的换行符。
唯一很特殊的地方是,在模式中使用的是“\n”,而被替换的内容中却不能使用“\n”,而只能使用“\r”。
原因是历史造成的,详情如果有兴趣的话可以查看“:
helpNL-used-fo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Vim 实用技术第一部分 实用技术 第一 部分