linux VIM使用

来源:互联网 发布:精子检查中优化处理 编辑:程序博客网 时间:2024/05/16 09:31

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 带有完整的帮助文档。在当前的 Vim 6.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 用户升级到 Vim 6.4,最好是自己编译升级所有的补丁包。相关信息网站上都有,此处不再赘述。


1. 实用技巧

1.1 安装

如果从 Linux 发布版直接安装 Vim,需要注意的一点是,缺省情况下系统并不一定为你安装了一个完整的 Vim。比如,在 Red Hat(以及后来的 Fedora Core)的发布版中,Vim 被拆成了四个包:vim-common(公用部分),vim-minimal(最小安装),vim-enhanced(除 X Window 支持外的完整安装),和 vim-X11(X Window 图形界面支持)。最小安装不能完整展示 Vim 的优点,通常只是作为 vi 的替代品出现,缺少很多重要的特性如多字节语言支持、鼠标支持和脚本支持。如果装了 X Window 的话,图形界面的 gvim 也比文本模式的 vim 具有更多的特性。建议大家尽可能安装完全的 Vim。

如果愿意稍稍费一点功夫,自己编译 Vim 的话,可以更好地定制 Vim。——附带的另一个好处是,你如果发现什么错误的话,你就可以自己动手来修复这个错误,或至少找到错误所在的位置,让 Bram(Vim 的作者)可以更快地解决问题。图 1 是在 Vim 中执行“:version”的结果的一部分,可以看到 Vim 有很多不同的特性(feature)可在编译时打开或关闭。如果自己编译的话,就可以选择打开需要的功能,关闭不需要的功能,来获得一个既功能强大、又小巧快速的 Vim 定制版本。


图 1
图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(对“不明宽度”字符的处理方式;Vim 6.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
图2
  • encoding=utf-8:不管文件的编码如何,不管如何显示和输入,Vim 内部使用的编码是 UTF-8;这是国际化支持的基础。
  • termencoding:取决于实际的终端或 X Window 的设定。举例来说,如果选择语言简体中文登录到 X Window,或者正在使用 CXTERM [10] 的话,那么该选项应被设为 GB2312;如果使用缺省的语言(LANG=en_US.UTF-8)登录到 X Window,或者使用 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 作为文件编码时,那么,你可能需要手工设定该选项,如“:set fileencoding=gb2312”。需要注意的一点是,使用“set”来设定该选项的话会改变以后新建文件的缺省编码,而使用“setlocal”的话则只影响当前文件(参考“:help setlocal”)。
  • fileencodings=ucs-bom,utf-8,chinese:Vim 会首先判断文件的开头是否是一个 Unicode [7] 的 BOM(byte order mark)字符 [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”来启动使用双宽度显示这些字符的 Unicode X 终端;使用 PuTTY 远程连接的话则应在配置的 Window-Translation 中选中“Treat CJK ambiguous characters as wide”(参见图 3)。

    图 3
    图3

需要设定的选项通常放在用户的 Vim 资源配置文件中,即在 ~/.vimrc 文件中加入:


set encoding=utf-8set fileencoding=chineseset fileencodings=ucs-bom,utf-8,chineseset ambiwidth=double

如果想进一步了解这些选项的话,可以使用“:help '选项'”查看帮助文档中的相关(英文)信息。帮助中也可以查到这些选项(以及命令)的缩写:本文中为方便理解,除一些极少有人使用完整拼写的命令如“:e(dit)”、“:s(ubstitute)”等之外,一般使用完整拼写而不说明或使用缩写。关于配置文件 .vimrc,可以使用“:help .vimrc”查看相关信息。

在使用内部编码 UTF-8 的情况下,如需编辑 fileencodings 之外(其不能自动识别)的文件,则可以使用以下命令:“:e ++enc=编码 文件名”。详情可参考“:help ++enc”。

1.3. 鼠标支持

不管是文本界面还是图形界面的 Vim,都支持鼠标。不过,在文本界面中,鼠标支持缺省没有被激活;这就意味着,在终端上使用鼠标,所有的功能仍和没有使用 Vim 时相同,并不受 Vim 影响。要激活文本界面中的鼠标支持也很容易,只需要执行一句“:set mouse=a”即可。

启用了鼠标支持之后,Vim 主要支持的鼠标操作有:

  • 单击移动光标到点击的位置;
  • 在帮助的关键字上双击显示该关键字相关的帮助信息;
  • 在普通文本上双击选中点击位置的单词;
  • 拖动鼠标选中文本;
  • 使用鼠标滚轮滚动当前缓冲区中的文本;
  • 多窗口编辑时可以拖动窗口分栏的位置。

进一步的信息可参看“:help 'mouse'”、“:help mouse-using”和“:help scroll-mouse-wheel”。

特别需要值得一提的是,在远程访问 Linux 系统时也是可以使用鼠标的。如果使用 X Window 系统,自然不必说;而使用 SSH 远程连接时,大部分 Linux 下的终端客户程序,如 XTERM、GNOME-Terminal [13]、较新版本的 Konsole [14],以及 Windows 下的 PuTTY,支持鼠标的使用:你只需简单地启动 Vim、执行一句“:set mouse=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 语言缩进的具体方式,请参考“:help cinoptions-values”);
  • paste(粘贴模式,会取消所有上述选项的影响来保证后面的操作——通常是从剪贴板粘贴代码——保持原有代码的风格;使用 nopaste 取消设置)。

下面给出一些常用的组合:

  • shiftwidth=4 tabstop=4:很多 Windows 出身的程序员会习惯这样的设置,让缩进等于制表符宽度。
  • shiftwidth=4 tabstop=8:很多 Unix 程序员的设置,仍使用较常用的 4 格缩进,但制表符宽度为标准的 8。
  • cinoptions=>4,n-2,{2,^-2,:2,=2,g0,h2,p5,t0,+2,(0,u0,w1,m1 shiftwidth=2 tabstop=8:标准的 GNU 编码风格的设置,对 Vim 缺省的 C 缩进风格作了很多微调,比如,if 语句下的“{”、“}”要在“if”后缩进两格,但函数定义部分“{”、“}”仍和函数名一行对齐。开源软件经常使用该种缩进风格。

在编辑代码时一个很有用的命令是调整代码缩进,可以很方便地增加(或减少)若干级缩进,并自动根据选项设定使用正确的空格或制表符。只需要使用“V”选中你要调整的代码行,然后键入“<”(或“>”)即可增加(或减少)一级缩进;在键入“<”(或“>”)之前键入数字则可以指定增加(或减少)的缩进级数。

我们要讨论的最后一个相关的命令是“:retab”。在设定了 expandtab 选项时,该选项会把所有的制表符转换成空格。在没有设定 expandtab 选项时,使用“:retab!”可把空白字符转换成制表符(可能误转换,慎用),使用“:retab n”可以把 tabstop 重置为 n,并转换含制表符的连续空白字符为适当的制表符和空格的组合以保证含制表符的行看起来没有任何变化。详细信息请参看“:help :retab”。

1.5. 模式行(modeline)

没人愿意每次都手工输入一大堆的 Tab 和缩进设定。可是,放在 .vimrc 文件中似乎也不是个好主意:如果我编辑的代码不止一种风格呢?——考虑一下,如果你参加开源软件项目,你能保证你参加的所有项目,还有你公司里的软件项目,代码风格都一样吗?——Vim 是我用过的第一个支持在文件中记录代码风格设定的编辑器。这个特性在 Vim 中叫做模式行,实际上,它所做的是在打开文件时根据文件中的 Vim 指令设定相关的 Vim 选项。下面就是一个嵌在 C 源代码中的模式行:


/* vim: set tabstop=4 shiftwidth=4 expandtab: */

模式行有好几种形式。本文只介绍上面的这种形式(其它形式类似,请自行参考“:help modeline”):行首的“/*”和尾部的“*/”告诉 C 编译器这是一行注释,不是代码的一部分;而 Vim 可通过后面的“vim:”识别出模式行的开始(必须出现在行首或前面有一个空白字符);后面则是“set”和空格间隔开的一串 Vim 选项;“:”表示模式行结束。

这种方式非常简单,功能也非常强大。另外请注意,出于安全的考虑,模式行中的选项只影响当前文件(“:help modeline-local”),也不能做任何设置选项以外的工作。

1.6. 寄存器

通常的编辑器有一个剪贴板,以存储复制和剪切的内容。Vim 中的类似概念叫做寄存器(register)。除了有一个无名寄存器外,Vim 还有一大堆有名的寄存器,可以通过“"”(参见“:help "”)或“Ctrl-R”(参见“:help i_CTRL-R”和“:help c_CTRL-R”)加寄存器名(字母、数字和某些特殊字符,参见“:help registers”;“无名”寄存器的名字是“"”)来访问。比如,你先使用“"ayy”复制了一行,然后使用“dd”删掉了一行,然后移动光标到要复制到的位置,就可以使用“"aP”把先前复制的内容粘贴上去了。手工编辑是有名寄存器的作用还不是很大,但当你想让 Vim 通过类似于宏的方式自动完成工作时,有名寄存器就变成不可缺少的重要功能了。下面我们还会用到。

在使用 X Window 系统时,有两个特殊的寄存器是需要注意一下的:“"*”访问的寄存器是 X 的主选择区域(primary selection),“"+”访问的寄存器是 X 的剪贴板(clipboard)。如果你要在 Vim 和其它的 X 应用程序之间复制文本内容,你可以试一下这两个寄存器。

还有一个很特殊的“寄存器”:“=”。在插入模式或命令模式中,键入“Ctrl-R=”,Vim 会提示你输入一个表达式,普通的整数运算在此完全有效。如果想要进行浮点运算,请参见第 3.2 节中的技巧。

1.7. 搜索、替换和正则表达式

大家应该都已经知道 Vim 里使用“/模式”(或“?模式”)进行搜索,使用“:s/模式/字符串/标志”进行替换,其中的“模式”是一个正则表达式。关于正则表达式,不熟悉的话可以边用边学,本节也不打算对 Vim 的正则表达式作完整的阐述(那可能可以专门写一本小册子了),而只抛砖引玉式地给出一些有用的例子加以说明,以及一些实用技巧。

先说一点点搜索。搜索里最最有用的一个快捷方式是“*”(向下完整匹配光标下的单词)。把光标移动到你要搜索的词(变量名、函数名等)上,比如“test”,然后按“*”,Vim 将自动产生一个对“\<test\>”(参见“:help /\<”和“:help /\>”)的搜索,也就是说,搜索完整的单词“test”。不要小看这个技巧,它经常可以大幅度地提高搜索的速度。事实上,这是 Vim 网站上公布的第 1 号技巧,也是被评价最高的技巧。相似的技巧还有“#”(向上完整匹配光标下的单词)、“g*”(向下部分匹配光标下的单词)等,请自行查看(“:help #”等)。

Vim 在搜索和替换时会对匹配成功的文本进行加亮,在已经完成搜索和替换任务后,这种加亮有时反而会妨碍显示。Vim 专门提供一个命令取消这种加亮(直到用户再一次使用搜索或替换命令):“:nohlsearch”。建议用户创建一个键盘映射(key mapping)加入到 .vimrc 中,如:


nmap <F2> :nohlsearch<CR>

以上命令表示,在正常模式下按 F2 键相当于输入“:nohlsearch”后面跟一个回车,即取消搜索加亮显示。

再看几个搜索替换的实用例子。

  • 去掉所有的行尾空格:“:%s/\s\+$//”。“%”表示在整个文件范围内进行替换,“\s”表示空白字符(空格和制表符),“\+”对前面的字符匹配一次或多次(越多越好),“$”匹配行尾(使用“\$”表示单纯的“$”字符);被替换的内容为空;由于一行最多只需替换一次,不需要特殊标志。这个还是比较简单的。
  • 去掉所有的空白行:“:%s/\(\s*\n\)\+/\r/”。这回多了“\(”、“\)”、“\n”、“\r”和“*”。“*”代表对前面的字符(此处为“\s”)匹配零次或多次(越多越好;使用“\*”表示单纯的“*”字符),“\n”代表换行符,“\r”代表回车符,“\(”和“\)”对表达式进行分组,使其被视作一个不可分割的整体。因此,这个表达式的完整意义是,把连续的换行符(包含换行符前面可能有的连续空白字符)替换成为一个单个的换行符。唯一很特殊的地方是,在模式中使用的是“\n”,而被替换的内容中却不能使用“\n”,而只能使用“\r”。原因是历史造成的,详情如果有兴趣的话可以查看“:help NL-used-for-Nul”。
  • 去掉所有的“//”注释:“:%s!\s*//.*!!”。首先可以注意到,这儿分隔符改用了“!”,原因是在模式或字符串部分使用了“/”字符,不换用其他分隔符的话就得在每次使用“/”字符本身时写成“\/”,上面的命令得写成“:%s/\s*\/\/.*//”,可读性较低。命令本身倒是相当简单,用过正则表达式的人估计都知道“.”匹配表示除换行符之外的任何字符吧。
  • 去掉所有的“/* */”注释:“:%s!\s*/\*\_.\{-}\*/\s*! !g”。这个略有点复杂了,用到了几个不太常用的 Vim 正则表达式特性。“\_.”匹配包含换行在内的所有字符;“\{-}”表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好;标志“g”表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像“int/* space not necessary around comments */main()”这样的表达式在替换之后仍然是合法的。

希望上面的这些简单的例子能够引起你使用 Vim 的正则表达式高效完成任务的兴趣。进一步的信息可参考“:help regexp”。

1.8. 自动完成和路径设定

Vim 支持单词的自动完成。比如,你前面使用了一个很长的变量名,叫 aLongVariable,下面你在输入时,就不用完整键入了。很可能,你只需要键入“aL”,然后按下“Ctrl-P”(向前搜索可匹配的单词并完成)就可以得到完整的变量名(没有得到想要的结果的话,多按几下“Ctrl-P”;或者前面多输入几个字符,如“aLongV”)。类似的命令还有“Ctrl-N”(向后搜索可匹配的单词并完成)、“Ctrl-X Ctrl-L”(搜索可匹配的行并完成)、“Ctrl-X Ctrl-F”(搜索可匹配的文件名并完成)等,具体可参看“:help ins-completion”。

如果你并不熟悉这些功能,但也并不觉得这有什么稀奇的话,下面这个例子可能会让你觉得吃惊。请尝试打开一个空白的 C 文件(vim test.c),并输入:


#include <stdio.h>int main(){    pri

最后一行不要回车,直接在“pri”后面输入“Ctrl-P”,你将看到“printf”出现。是的,虽然文件里没有“printf”,但 Vim 知道到哪里去寻找它!在作关键字匹配完成时,如果当前文件和其它打开的文件中没有想要的结果,Vim 会自动到“#include”的文件中进行进一步的搜索(为什么是“#include”呢?请查阅“:help 'include'”),搜寻的目录则由选项 path 决定,其缺省值在 Unix(含 Linux)下为“.,/usr/include,,”,代表搜索的目录依次是文件所在目录、/usr/include 和当前目录。根据实际情况,你可能需要在 .vimrc 文件中设置该选项,加入项目相关的包含目录,注意一般要保留最后的“,,”,除非你不需要在当前目录下搜索。

设置了合适的 path 后,另外带来的一个便利就是可以使用“gf”命令方便地跳转到光标下的文件名所代表的文件中。在上面的例子中,把光标移到“stdio.h”的任一字符上,键入“gf”,则 Vim 会自动打开 /usr/include/stdio.h 文件。使用“Ctrl-O”(参见“:help CTRL-O”)可返回到原先的文件中。

1.9. 文件跳转和 Tags

大家一般都知道,在 Vim 的帮助窗口中的关键字上双击鼠标或者键入“Ctrl-]”即可跳转至该关键字相关的帮助主题。不过,“跳转至匹配的关键字”这一功能并不仅仅局限于帮助文件。只要有合适的 tags 文件(参见“:help tags-file-format”),我们同样可以在源代码中使用这个方便的功能,跳转到与关键字匹配的“标记”处(通常是源代码中某一函数、类型、变量或宏的定义位置)。

要产生 tags 文件,通常我们使用 Exuberant Ctags [15]。一般的 Linux 发布版中均带有这一工具。Ctags 带有的选项数量极多,此处我们仅简单介绍如何在一个典型的多文件、多层目录的项目中使用其基本功能:我们只需在项目的根目录处键入“ctags -R .”,Ctags 即可自动在文件中查找、识别支持的文件格式、生成 tags 文件。目前 Exuberant Ctags 支持多达 33 种编程语言 [16],包括了 Linux 下常用的 C、C++、Java、Perl、PHP 等。有了 tags 文件,以下的 Vim 命令就可以方便使用了(进一步的信息可参考“:help tags-and-searches”):

  • :tag 关键字(跳转到与“关键字”匹配的标记处)
  • :tselect [关键字](显示与“关键字”匹配的标记列表,输入数字跳转到指定的标记)
  • :tjump [关键字](类似于“:tselect”,但当匹配项只有一个时直接跳转至标记处而不再显示列表)
  • :tn(跳转到下一个匹配的标记处)
  • :tp(跳转到上一个匹配的标记处)
  • Ctrl-](跳转到与光标下的关键字匹配的标记处;除“关键字”直接从光标位置自动获得外,功能与“:tags”相同)
  • g](与“Ctrl-]”功能类似,但使用的命令是“:tselect”)
  • g Ctrl-](与“Ctrl-]”功能类似,但使用的命令是“:tjump”)
  • Ctrl-T(跳转回上次使用以上命令跳转前的位置)

当我们在项目的根目录下工作时,上面这些命令工作得很好。但如果我们进到多层目录的里层再运行 Vim 打开文件时,这些命令的执行结果通常就变成了错误信息“E433: No tags file”。这是因为缺省 Vim 只在文件所在目录和当前目录下寻找 tags 文件,而我们前面只在项目的根目录下生成了 tags 文件,Vim 无法找到该文件。解决方法有好几种,我认为一般较简单的做法是对每个项目都在 .vimrc 文件中增加一个路径相关设定。假设我们有两个项目,位置分别是 /home/my/proj1 和 /home/my/proj2,那我们可以使用:


au BufEnter /home/my/proj1/* setlocal tags+=/home/my/proj1/tagsau BufEnter /home/my/proj2/* setlocal tags+=/home/my/proj2/tags

Vim 选项 tags 用于控制检查的 tags 文件,缺省值为“./tags,tags”,即前面所说的文件所在目录下和当前目录下的 tags 文件。上面两行自动命令告诉 Vim,在打开项目目录下的文件时,tags 选项中的内容要增加项目的 tags 文件的路径。进一步信息可参看“:help 'tags'”。

1.10. Make 和 grep

Make [17] 和grep [18] 应当算是 Unix 世界里无人不晓的基本工具了吧。很自然的,Vim 对它们有着特殊的支持。该支持主要通过访问一个特殊的快速修订窗口(quickfix window)来实现。直接在 Vim 的命令模式里输入相应的 make 或 grep 命令(如“:grep foo *.c”)即可将命令的执行结果放入该窗口,同时根据返回的结果跳转到第一个错误(make 的情况;在使用 grep 时是匹配成功之处)。以下是常用的“快速修订”命令:

  • :cn(显示下一个错误)
  • :cp(显示上一个错误)
  • :cl(列出所有的错误及其编号)
  • :cc(跳转到指定编号的错误)
  • :copen(打开快速修订窗口,在其中显示所有错误,可在错误上双击鼠标或按回车键跳转至该错误;示例参见图 4)

    图 4
    图4
  • :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

 

VIM总结第二部分:

Vi IMproved (VIM) 是 Bram Moolenaar 开发的与 UNIX 下的通用文本编辑器 vi 兼容并
且更加强大的文本编辑器。它支持语法变色、正规表达式匹配与替换、插入补全、自定义键
等等功能,为编辑文本尤其是编写程序提供了极大方便。VIM 可以运行在“任何”操作系统
上,包括我们常用的 Windows 和 UNIX/Linux。一旦掌握了 VIM,你就掌握了一项跨平台的
利器。

尽管 VIM 功能十分强大,但对于刚接触它的人尤其是用惯类似 Windows 的 notepad 的人
来说,VIM 并不十分易于掌握,毕竟它兼容的是 vi 而不是 notepad。本文旨在介绍 VIM
中我所了解的用法,希望有更多的人喜欢 VIM。应该指出的是,VIM 中有太多的功能和命令
,有许多你并不用的着,因此没有记的必要,有些我也不知道,这要靠你来发现,关键是多
看 :help ,多试。另外,取决于你的 VIM 的版本以及编译安装时的设置,文中讲述的某些
功能或命令在你的 VIM 中也许并不存在,如有需要请升级。
1. vi 的基本用法

vi 的屏幕区域分为两个部分:最下面一行是命令行,一般用于提示信息或命令行输入;除
此之外为正文显示区域。跟 notepad 不同的是,vi 中存在两种模式:普通(Normal)模式和
插入(Insert)模式。

进入 vi 后默认即为普通模式。新手一般初次进入 vi 后就想输入一串字符,结果发现 vi
一连串莫名其妙的反应。其实,在 vi 的普通模式下,任何按键包括普通字符都表示某个
命令,并不表示在当前光标处插入字符。常用的命令有:(注意区分大小写)
: 进入命令行
i 或 a 进入插入模式。区别是:i 进入插入模式后,光标在当前字符前面; a 进入插入
模式后,光标在当前字符后面
h j k l 分别是光标左移、下移、上移、右移(一般来说你不会用到它们来移动光标,按方
向键就可以了)
x 删除一个字符
dd 删除一行
J 删除本行的回车符,把下一行并入本行末尾
r字符 替换光标所在字符为新字符
^ $ 分别是光标移到行首和行末
数字G 移动光标到第若干行,如果直接按 G 则移动到最后一行

在普通模式中,命令以按键形式输入。而在命令行中,命令以字符串形式输入。下面是常用
的命令行:
:q 退出! (更确切的说应该是关闭当前文件)
:w 文件名 存盘。如果还是保存为当前文件,不必写文件名
:wq 存盘退出
:new 文件名 打开或新建文件(同时关闭当前文件)。如果不指定文件名或者文件名不存
在则是新建文件
:help 帮助! 看完后用 :q 关掉窗口。可以在 help 后面加某个帮助主题的名称,如 :he
lp dd 或 :help help

还有一点是,如果某个命令得到警告(拒绝执行),则要在命令的命令词后加叹号表示强制执
行。比如你修改过文件,但又想放弃存盘并退出,如果输入 :q,vi 会告诉你文件已修改,
这时,你只能输入 :q! 退出。又如用 :w! a.txt 表示把当前文件存为 a.txt 而不管 a.tx
t 是否已经存在。

插入模式就不用多说了,添加你的新内容吧。不过,你也许会发现 BackSpace 键和 Delete
键的运用很受限制,也不能像 notepad 那样选择、复制和粘贴。这些都是由于这是 vi 的
标准,后面我们将看到 VIM 扩展的功能可以解决这些问题。记住按 ESC 退出插入模式,回
到普通模式。
2. 复制和粘贴

为了便于选取文本,VIM 引入了可视(Visual)模式。要选取一段文本,首先将光标移到段首
,在普通模式下按 v 进入可视模式,然后把光标移到段末。需要注意,光标所在字符是包
含在选区中的。这时可以对所选的文本进行一些操作,常用的(可视模式)命令有:
x 或 d 剪切(即删除,同时所选的文本进入剪贴板)
y 复制
r字符 所有字符替换为新字符
u U ~ 分别是所有字母变小写、变大写、反转大小写
> < 分别是缩进和反缩进

当输入了命令以后,VIM 将回到普通模式,这时可以按 p 或 P 进行粘贴。普通模式下有关
复制和粘贴的命令:
v 进入可视模式
p 或 P 在当前位置粘贴剪贴板的内容,p 粘在光标所在字符后面,P 粘在前面

不得不承认,虽然引入了可视模式,复制和粘贴在 VIM 中仍然是比较麻烦的操作,这也许
是 VIM 唯一的缺点。:-) 此外,VIM 还引入了选择(Select)模式,跟可视模式类似。结合
一些键的定义和选项设置,可以实现跟 notepad 相同的复制和粘贴的使用习惯。限于篇幅
和水平,在此不提。
3. VIM 的定制

VIM 在 vi 的基础上扩展了许多功能和命令,提供了许多选项。但是有些功能默认是关闭的
,有些选项可能也不符合个人的使用习惯。为此,我们需要编写一个 vimrc 文件。在 DOS/
Windows 版本的 VIM 中,这个文件应放在 VIM 的目录下,文件名为“_vimrc”。在 UNIX
版本 的 VIM 中,这个文件一般可以放在用户的个人主目录下,文件名为“.vimrc”。VIM
启动时将会把 vimrc 文件中的每一行作为命令行依次执行,我们可以在该文件中加入若干

下面是一个 vimrc 文件的示例:(请注意区分浏览器的换行与实际的换行。)
" 设置 Backspace 和 Delete 的灵活程度,backspace=2 则没有任何限制
set backspace=2
" 设置在哪些模式下使用鼠标功能,mouse=a 表示所有模式
set mouse=a
" 设置路径,在 f 等命令中涉及此参数
" 对于 Windows 编程,path 可设为如
" set path=.,"C:/Program Files/Microsoft Visual Studio/vc98/Include",,
" 对于 UNIX 编程,path 可设为如下
set path=.,/usr/include,/usr/include/qt,,
" 打开光标的行列位置显示功能
set ruler
" 设置跳格距离
set tabstop=4
" 设置自动缩进格数
set shiftwidth=4
" 打开自动缩进功能
set autoindent
" 设置哪些键可以行间绕转,如下设置则 Backspace 和方向键等均可行间绕转
set whichwrap=b,s,h,l,,[,]
" 根据当前文件语法自动变色。VIM 识别上百种文本文件的语法,如 html、c++、java 等
syntax on
" 以下是个人习惯,定义 等键,便于插入模式和可视模式之间的切换
" (1) 使 x d y 自动返回插入模式
vnoremap y "ryi
vnoremap x "rxi
vnoremap d di
" (2) 普通模式和插入模式下均可按 粘贴
imap :if col(".")!=1 exe 'normal "rp'elseexe 'normal "r
P'endif`[i
nmap "rP
" (3) 普通模式和插入模式下均可按 进入可视模式
imap :if col(".")!=1 exe 'normal lv'elseexe 'normal v'<
Bar>endif
nmap v

下面给出我常用的 vimrc 文件。另外,你的 VIM 安装目录下很可能也带有一个默认的 vim
rc 文件,你都可以参考。如果遇到没有见过的命令或者参数,可以自己看看 :help 。

* vimrc

4. VIM 的其它命令

要真正使用 VIM,光靠 vi 的基本命令当然不行,下面就来介绍更多的命令。以下的命令,
有些是 VIM 特有的,有些在 vi 中也存在,我就不加区分了。其中,以“:”开头表示该命
令在命令行输入,以“i”开头表示这是插入模式下的命令,其它则是普通模式下的命令。<
C-X> 表示按 Ctrl+X。
4.1 使用帮助

在 :help 中,遇到超连接可以按 Ctrl+] 跳转
在 :help 中,按 Ctrl+T 往回跳转

4.2 打开多个文件

:split 文件名 切分出一个新窗口,打开指定文件。如果省略文件名,则仍显示当前文件
,可用于同时观察文件的不同部分。(注意跟 :new 的区别)
f 切分显示光标所指的文件名,VIM 会在 path 中搜索该文件名,比如常用它打开 #
include 语句中的文件
当同时打开几个文件时,按 在各窗口之间切换
_ 当同时打开几个文件时,按 _ 使当前窗口最大化
:set scrollbind 设置卷动绑定属性。所有设置了卷动绑定属性的窗口将一起卷动。可以用
:set noscrollbind 解除绑定

4.3 撤销和恢复

编辑过程中出现错误在所难免,不过没有关系,VIM 允许无限次的撤销。只要你没有关闭文
件,你甚至可以一直撤销下去,回到几个小时以前刚打开这个文件开始工作时的状态。
u 撤销(Undo)上次所做的修改
恢复(Redo)上次撤销的内容

4.4 字符串搜索替换

/字符串 向下搜索字符串
?字符串 向上搜索字符串
* # 分别是向下和向上搜索光标所指的词
n 重复上一次搜索
:起始行,结束行s/搜索串/替换串/g 从起始行到结束行,把所有的搜索串替换为替换串
:set ignorecase 设置忽略字母大小写。可以用 :set noignorecase 取消忽略字母大小写

例如 /hello 从当前光标位置开始向下搜索 hello,不带字符串的命令 / 可重复上一次搜
索,相当于 n。又如 :1,$s/hello/hi/g 把全文中的 hello 改为 hi,其中 $ 表示最后一
行。另外,你还可以先进入可视模式选择一段文本,按 :进入命令行并输入 s/hello/hi/g
,VIM 将在选区中进行替换操作。

搜索字符串用的是正规表达式(Regular expression),其中许多字符都有特殊含义:
/ 取消后面所跟字符的特殊含义。比如 /[vim/] 匹配字符串“[vim]”
[] 匹配其中之一。比如 [vim] 匹配字母“v”、“i”或者“m”,[a-zA-Z] 匹配任
意字母
[^] 匹配非其中之一。比如 [^vim] 匹配除字母“v”、“i”和“m”之外的所有字符
. 匹配任意字符
* 匹配前一字符大于等于零遍。比如 vi*m 匹配“vm”、“vim”、“viim”……
/+ 匹配前一字符大于等于一遍。比如 vi/+m 匹配“vim”、“viim”、“viiim”…

/? 匹配前一字符零遍或者一遍。比如 vi/?m 匹配“vm”或者“vim”
^ 匹配行首。例如 /^hello 查找出现在行首的单词 hello
$ 匹配行末。例如 /hello$ 查找出现在行末的单词 hello
/(/) 括住某段正规表达式
/数字 重复匹配前面某段括住的表达式。例如 /(hello/).*/1 匹配一个开始和末尾都是
“hello”,中间是任意字符串的字符串

对于替换字符串,可以用“&”代表整个搜索字符串,或者用“/数字”代表搜索字符串中的
某段括住的表达式。

举一个复杂的例子,把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列
写法:
:%s/abc/(.*/)xyz/xyz/1abc/g
:%s//(abc/)/(.*/)/(xyz/)//3/2/1/g
其它关于正规表达式搜索替换的更详细准确的说明请看 :help pattern 。

在插入模式下,为了减少重复的击键输入,VIM 提供了若干快捷键,当你要输入某个上下文
曾经输入过的字符串时,你只要输入开头若干字符,使用快捷键,VIM 将搜索上下文,找到
匹配字符串,把剩下的字符补全,你就不必敲了。这样,编程序时你起多长的变量名都没关
系了,:-) 而且还可以减少输入错误。我认为,插入补全是 VIM 最为突出的一项功能。
i 向上搜索,补全一个词。例如,上文中出现过 filename 这个词,当你想再输入 f
ilename 时,只要按 f 即可。假如 VIM 向上搜索,找到以 f 开头的第一个匹配不是
filename,你可以继续按 搜索下一个匹配进行补全。当然,如果你想一次
就成功,你可以多输入几个字符比如 filen 再按 补全
i 向下搜索,补全一个词
i 补全一行。比如你写过一行 for (int i = 0; i < 100; i++),你想再写
一模一样的一行,只要输入 for 即可。如果补全出来的不是你想要的那一行,
你可以按 或 选择上一个或下一个匹配行
i 在文件系统中搜索,补全一个文件名

如果按 或 补全一个词,在当前文件中没有找到匹配,VIM 将搜索 #include
语句中的文件,而文件的位置将在 path 中搜索。
4.6 键的定义

在 VIM 中你可以定义一个键,按了这个键等于按了某一串预定的键。比如
:map! ddi
表示如果你在插入模式下按 就相当于连续按了 ddi,这将会使 VIM 退回到普
通模式,删除一行,再进入插入模式。

map 命令有许多变化形式,每种变化形式所定义的键只在某些模式下有效,而在其它模式下
无效。你需要根据情况使用正确的变化形式:
:nmap 键只对普通模式有效
:imap 键只对插入模式有效
:vmap 键只对可视模式有效
:cmap 键只在命令行下有效
:map 键在普通模式和可视模式都有效
:map! 键在插入模式和命令行下都有效

还要注意,如果你定义 :map d di 这将引起循环定义错误。这时,你需要使用 :noremap d
di 来定义。同样,noremap 也有对不同模式的变化形式。

比如,你想在文件的每一行的倒数第二个字符处插入字符串“abc”,你可以定义
:nmap $hiabcj
在普通模式下按一次 将会:光标移到行末,光标左移一格,进入插入模式,输入“a
bc”,退回到普通模式,光标下移一行。不停地按 将解决问题。这是我临时处理多
行重复操作的常用手段,当然,这是一种笨办法。:-) 而上文写到的对 的定义
则是 map 更复杂的用法。你还可以定义
:map :w:!gcc -o %< -I/usr/include/qt -lqt %
:map :!./%<
实现按 编译当前文件,按 执行。

在插入补全当中提到的补全一行需要按 ,如果你觉得麻烦,你可以定义
:inoremap
减少击键次数。同样,对 也可以作类似定义。
4.7 其它命令

:!命令行 执行一条外部命令
. 在光标当前位置处重复上一次操作
i后续字符 输入特殊的 ASCII 字符或键。除了插入模式外,也适用于命令行。后续
字符可以是键盘上的任意键,也可以是三位的十进制数字表示字符的 ASCII 码
i命令 执行一个普通模式的命令,执行完毕后回到插入模式
i 跳转到光标所指标识符的定义行。比如你在编程时遇到一个函数 CreateWindow,
想看它的定义语句,你就可以在它上面按 i,VIM 将打开新窗口,把光标移到它定义
的地方。当然,前提是在当前文件或它的 #include 文件中存在 CreateWindow 的定义。这
也牵涉到 path 的设置。不过,VIM 找得不一定很准
K 看光标所指标识符的 man 帮助页
i 把上一行对应列的字符抄下来
i 把下一行对应列的字符抄上来(写这一行时我就用了 )
光标所指整数加一
光标所指整数减一
光标返回到以前的位置。相当于光标移动的“撤销”
光标返回到后来的位置。相当于光标移动的“恢复”
进入可视模式,选取一个矩形区域。该命令通常用于对多行进行列操作。接着按 I
可以在块前的每一行同时插入字符;按 A 可以在块后的每一行同时插入字符;按 x、d 或
y 可以剪切或复制;等等
:X 对当前文件加密

5. VIM 6.0 的一些新特性

2001 年 9 月 26 日发布的 VIM 6.0 增加了一些以往没有的新特性。下面仅仅是一些简单
的介绍,更详细的描述请自己看 :help 。

* 打开目录

在 VIM 6.0 中,:new 和 :split 等命令不但可以打开普通文件,还可以打开目录。
一个目录打开以后将列出里面的文件信息,可以按回车继续打开相应的文件或者子目录,也
可以按 ? 得到其它目录操作(修改文件名,删除文件等)的帮助。
* 折叠

当一个文本太长而你又对其中很长一大段内容不关心的话,可以把你不关心的那些行
折叠起来,让它们从你的视线中消失。被折叠的行将以一行显示代替,例如:
+--217 行:2. VIM 的定制---------------------
折叠可以有多种方式控制,可以通过设置 foldmethod 选项的值来改变。默认情况下
foldmethod=manual 为手工折叠。下面介绍几个使用折叠的最简单的命令:
(可视模式下) zf 手工创建折叠。在可视模式下选择一段文本,然后按 zf 可以手
工创建一个折叠
方向键左或右 打开折叠。普通或插入模式下,在折叠行上横向移动光标将打开
被折叠的行
zc 关闭折叠

* 垂直切分窗口

:vsplit 文件名 垂直切分窗口。跟 :split 命令相似,但新窗口与原窗口左右并
列。

* 更多的正规表达式

VIM 6.0 比以前增加了许多新的正规表达式,其中我认为最有用的是换行匹配符 /n
。以前的版本中,正规表达式只能在同一行上匹配。现在,只要显式地给出 /n,正规表达
式可以跨多行。
* diff 模式

专门用于比较编辑两个或多个内容相近的文件的模式。一般来说,比如你要比较编辑
A 跟 B 两个文件,你可以命令行启动 vim -d A B 或者这样:先打开文件 A,然后 :vspl
it 打开文件 B,对文件 A 和 B 都输入命令 :diffthis。这时 VIM 将非常清晰的对比显示
出两个文件的不同之处,编辑起来十分方便。

仔细一看,这个 diff 模式动用了 VIM 许许多多的特性,包括卷动绑定,折叠和语
法变色等等。好高级啊!

我所熟悉的 VIM 的功能已经介绍得差不多,剩下的要靠你自己来学习了。其实,VIM 的功
能还有很多很多。还是那句话,多看 :help ,多试。VIM 的帮助还是挺容易看的,相信你
看了以后会有更多的惊喜。另外,VIM 的主页上有不少有用的技巧提示,也是一个很好的去

 

VIM总结第三部分:



原创粉丝点击