[转]Vim 实用技术,第 1 部分: 实用技巧
图 3
![[转]Vim 实用技术,第 一 部分: 实用技巧](http://img.reader8.net/uploadfile/jiaocheng/201401103/2856/2014012815560310820.png)
需要设定的选项通常放在用户的 Vim 资源配置文件中,即在 ~/.vimrc 文件中加入:
?
:cclose(关闭快速修订窗口)
Vim 的这个特性也可以与 make 和 grep 以外的程序一起工作(事实上,在 Windows XP 上,“:grep”命令一般调起的是“findstr /n”)。具体调用那个程序由选项 makeprg(Linux 下缺省为“make”)和 grepprg(Linux 下缺省为“grep -n $* /dev/null”)控制,而如何解析返回的内容则由选项 errorformat 和 grepformat 控制。鉴于在 Unix/Linux 下一般不需更改这些选项的内容,此处不再详述。
1.11. 执行外部命令
在“:make”这样的命令中,Vim 会自动调用外部的程序。用户当然也可以自己执行外部的程序:估计很多的人都已经知道了用“:!命令”可以在 Vim 中执行一个外部命令。不过,估计大部分人都不知道,还有其它一些命令可以执行外部命令,并且,即使“:!”命令里面也有一些技巧可以使用。
最正规的执行外部命令的方法,如前所述,就是“:!”。比如,我们想要显示当前目录下的所有文件,就可以直接执行:“:!ls”。Vim 会在一个终端窗口中进行文件列表,然后提示我们按键返回 Vim 中。事实上,这种方式对于“cp”、“rm”这样基本不需要输出的命令比较实用,而对于“ls”这样关注于输出的命令并不太适用。
如果想把外部命令执行的结果插入到当前编辑的缓冲区中,可以考虑使用“:r!”。比如,我们使用“:r!ls”,就可以把“ls”命令的执行结果插入到缓冲区中光标所在行下面。在使用宏时,这可能会特别有用。
Vim 的“:!”命令还有一个特别强大的技巧可以使用。拿一个实际例子,我们需要对在一个文件的每一行之前插入一个编号,该怎么做呢?——用 Vim 的宏或者脚本可以完成这一工作,但这不是最高效、最灵活的工作方式。Linux 下一般带有的 GNU 的 nl,可以用非常灵活的方式来完成这一任务——要对所有的非空行进行编号,只需要“:%!nl”;要对包含空行的所有行进行编号?OK,“:%!nl -ba”。
稍作一点解释。当使用可视模式选中文本行后然后键入“:!”(命令行上将出现“:'<,'>!”,表示命令的范围是选定的文本),或者使用“:%!”(表示命令的范围是整个缓冲区中的文本),Vim 在执行后面的命令时,将把命令范围里的文本行作为后面执行的命令标准输入,并用命令执行后的标准输出替换当前缓冲区中的这些文本行。这就是上面的命令行的工作原理。
1.12. 定宽文本排版
在传统的 Unix 环境下,文本文件的定义是具有一定长度限制的文本行的组合 [19]。虽然 Vim 本身对行的长度没有任何实际的限制,但有一些工具有这样的限制。为了最大程度的兼容性,也为了在显示、打印等处理上比较方便,一般推荐在邮件和源代码中一般不要超出 72 列(最多不超出 80 列)。Vim 在处理定宽的文本方面具有特殊的支持能力。下面是一个在 Vim 中把行宽(使用选项 textwidth)设为 40 后输入 Harry Potter and the Half-Blood Prince 的第一句话的结果:
?
It was nearing midnight and the PrimeMinister was sitting alone in hisoffice, reading a long memo that wasslipping through his brain withoutleaving the slightest trace of meaningbehind.
?
输入时我只使用了英文字母和空格,换行符都是 Vim 自动插入的。如果在某一行加入或删除了一些字符后行不就不齐了吗,该如何处理?很简单,把光标移到要重新格式化的文本开头,使用“gq”命令后面跟一个光标移动命令确定重新格式化的范围。比如“gq}”(格式化一段),“gq5j”(格式化 5 行),“gqG”(格式化至文件末尾)。
除了选项 textwidth 外,选项 formatoptions 确定了跟文本格式化有关的基本选项,常用的数值有:
t:根据 textwidth 自动折行;c:在(程序源代码中的)注释中自动折行,插入合适的注释起始字符;r:插入模式下在注释中键入回车时,插入合适的注释起始字符;q:允许使用“gq”命令对注释进行格式化;n:识别编号列表,编号行的下一行的缩进由数字后的空白决定(与“2”冲突,需要“autoindent”);2:使用一段的第二行的缩进来格式化文本;l:在当前行长度超过 textwidth 时,不自动重新格式化;m:在多字节字符处可以折行,对中文特别有效(否则只在空白字符处折行);M:在拼接两行时(重新格式化,或者是手工使用“J”命令),如果前一行的结尾或后一行的开头是多字节字符,则不插入空格,非常适合中文上面提到的注释,可以是 C/C++ 中的“//”和“/*”,也可以是邮件中引用原文使用的“>”等字符(具体由 comments 选项控制;参见“:help 'comments'”)。Vim 在遇到这些字符时,能够相当智能地进行处理,足以完成日常编辑源代码和邮件的需要。在使用一些处理纯文本不够强大的邮件客户端时,我通常使用 Vim 编辑邮件(特别是英文邮件),然后把结果贴回到邮件编辑窗口中进行发送。
Vim 中 formatoptions 的缺省值是“tcq”,一般我会在 .vimrc 文件中加入一行“set formatoptions+=mM”来确保 Vim 能在中文字符之间折行而不要求空格的存在,并且在大部分情况下可以正确地处理中文重新格式化。
1.13. 其它小技巧
也许你会觉得这些很有用:
%(跳转到与之匹配的括号处).(重复上次的修改命令)`.(跳转到最近修改过的位置)ZQ(无条件退出)ZZ(存盘退出)ga(显示光标下的字符在当前使用的 encoding 下的内码)guw(光标下的单词变为小写)gUw(光标下的单词变为大写):TOhtml(根据 Vim 的语法加亮的方式生成 HTML 代码;在图形界面中也可以使用菜单“Syntax—Convert to HTML”达到同样效果)无聊的时候,还可以试试(呵呵!):
:help!:help 42:help holy-grail回页首
参考资料
[1]Vim Online: http://www.vim.org/
[2]中国国家标准GB2312-1980;参考网页: http://www.answers.com/GB2312
[3]中国国家标准GB18030-2000;参考网页: http://www.answers.com/GB18030
[4]国标编码扩展;参考网页: http://gollum.easycp.de/gollum/gollum.php?wl=zh&q=gbk
[5]ISO/IEC 8859-1: http://www.answers.com/ISO_8859-1
[6]UTF-8: http://www.answers.com/UTF-8#Wikipedia
[7]Unicode Home Page: http://www.unicode.org/
[8]FAQ-UTF & BOM: http://www.unicode.org/faq/utf_bom.html#22
[9]East Asian Width: http://www.unicode.org/reports/tr11/
[10]CXTERM's Unofficial Homepage: http://cxterm.sourceforge.net/
[11]PuTTY: A Free Telnet/SSH Client: http://www.chiark.greenend.org.uk/~sgtatham/putty/
[12]XTERM-Terminal Emulator for the X Window System: http://dickey.his.com/xterm/
[13]GNOME Terminal: http://www.gnomefiles.org/app.php?soft_id=113
[14]Konsole Homepage: http://konsole.kde.org/
[15]Exuberant Ctags: http://ctags.sourceforge.net/
[16]Languages Supported by Exuberant Ctags: http://ctags.sourceforge.net/languages.html
[17]make: http://www.answers.com/make#Wikipedia
[18]grep: http://www.answers.com/grep
[19]Text File: IEEE Std 1003.1, 2004 Edition, Section 3.392, http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap03.html
?
关于作者
吴咏炜,目前从事与开源相关的软件架构工作,可通过 wuyongwei@gmail.com 和他联系。
?
引用自:http://www.ibm.com/developerworks/cn/linux/l-tip-vim1/index.html