ラベル vim の投稿を表示しています。 すべての投稿を表示
ラベル vim の投稿を表示しています。 すべての投稿を表示

2010年3月28日日曜日

VIM配置初级指南

在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号、语法高亮度显示、智能缩进等功能的。为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc。

在启动vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置甚至脚本,所以,一般情况下把.vimrc文件创建在当前用户的根目录下比较方便,即创建的命令为:

$vi ~/.vimrc

设置完后

$:x 或者 $wq

进行保存退出即可。

VIM 中可供用户定制的选项非常非常多, 作为初学者, 我们没有必要了解这么多东西。 下面, 滇狐简单列出了一些最常用的配置项, 大家可以根据自己的需要将这些内容添加到自己的 .vimrc 中。
1 基本设置

* set nocp
该命令指定让 VIM 工作在不兼容模式下。 在 VIM 之前, 出现过一个非常流行的编辑器叫 vi。 VIM 许多操作与 vi 很相似, 但也有许多操作与 vi 是不一样的。 如果使用“:set cp”命令打开了兼容模式开关的话, VIM 将尽可能地模仿 vi 的操作模式。
也许有许多人喜欢“最正统的 vi”的操作模式, 对于初学者来说, vi 里许多操作是比较不方便的。
举一个例子, VIM 里允许在 Insert 模式下使用方向键移动光标, 而 vi 里在 Insert 模式下是不能移动光标的, 必须使用 ESC 退回到 Normal 模式下才行。
再举一个例子, vi 里使用 u 命令可以撤消一次先前的操作, 再次按下 u 时, 将撤消“撤消”这个动作本身, 也就是我们常说的“重复”(redo)。 而 VIM 里可以使用 u 命令撤消多步操作, “重复”使用的快捷键是 Ctrl + R。
使用兼容模式后, VIM 将放弃这些新的功能, 尽量模仿 vi 的各种操作方式。 只有在不兼容模式下, 才能更好地发挥 VIM 自身的特点。 Bram 爷爷强烈推荐大家使用 VIM 的不兼容模式, 滇狐也是这样推荐的。 请务必在你的 .vimrc 中的第一行写上: “set nocp”。
* set ru
该命令打开 VIM 的状态栏标尺。 默认情况下, VIM 的状态栏标尺在屏幕底部, 它能即时显示当前光标所在位置在文件中的行号、列号, 以及对应的整个文件的百分比。 打开标尺可以给文件的编辑工作带来一定方便。
* set hls
搜索时高亮显示被找到的文本。 该指令的功能在 vimtutor 中已经有过介绍, 这里就不多说了。 其实似乎许多人并不喜欢这个功能。
* set is
搜索时在未完全输入完毕要检索的文本时就开始检索。 vimtutor 对该命令也有过介绍, 滇狐并不喜欢这个功能, 因此滇狐自己的配置文件里是没有这条命令的。 但是周围有朋友很喜欢这个, 因此滇狐还是将它列在这里。
* syntax on
打开关键字上色。 进行程序设计的朋友应该都知道关键字上色是什么东西, 因此这里就不多说了。 不进行程序设计的朋友不妨也打开这个功能, 虽然不一定能够用得着, 但这个功能其实也是很好玩的。
* set backspace=indent,eol,start
设想这样一个情况: 当前光标前面有若干字母, 我们按下 i 键进入了 Insert 模式, 然后输入了 3 个字母, 再按 5 下删除(Backspace)。 默认情况下, VIM 仅能删除我们新输入的 3 个字母, 然后喇叭“嘟嘟”响两声。 如果我们“set backspace=start”, 则可以在删除了新输入的 3 个字母之后, 继续向前删除原有的两个字符。
再设想一个情况: 有若干行文字, 我们把光标移到中间某一行的行首, 按 i 键进入 Insert 模式, 然后按一下 Backspace。 默认情况下, 喇叭会“嘟”一声, 然后没有任何动静。 如果我们“set backspace=eol”, 则可以删除前一行行末的回车, 也就是说将两行拼接起来。
当我们设置了自动缩进后, 如果前一行缩进了一定距离, 按下回车后, 下一行也会保持相同的缩进。 默认情况下, 我们不能在 Insert 模式下直接按 Backspace 删除行首的缩进。 如果我们“set backspace=indent”, 则可以开启这一项功能。
上述三项功能, 你可以根据自己的需要, 选择其中一种或几种, 用逗号分隔各个选项。 建议把这三个选项都选上。
* set whichwrap=b,s,<,>,[,]
默认情况下, 在 VIM 中当光标移到一行最左边的时候, 我们继续按左键, 光标不能回到上一行的最右边。 同样地, 光标到了一行最右边的时候, 我们不能通过继续按右跳到下一行的最左边。 但是, 通过设置 whichwrap 我们可以对一部分按键开启这项功能。 如果想对某一个或几个按键开启到头后自动折向下一行的功能, 可以把需要开启的键的代号写到 whichwrap 的参数列表中, 各个键之间使用逗号分隔。 以下是 whichwrap 支持的按键名称列表:
o b
在 Normal 或 Visual 模式下按删除(Backspace)键。
o s
在 Normal 或 Visual 模式下按空格键。
o h
在 Normal 或 Visual 模式下按 h 键。
o l
在 Normal 或 Visual 模式下按 l 键。
o <
在 Normal 或 Visual 模式下按左方向键。
o >
在 Normal 或 Visual 模式下按右方向键。
o ~
在 Normal 模式下按 ~ 键(翻转当前字母大小写)。
o [
在 Insert 或 Replace 模式下按左方向键。
o ]
在 Insert 或 Replace 模式下按右方向键。
* set encoding=utf-8
设置当前字符编码为 UTF-8。 UTF-8 是支持字符集最多的编码之一, 在 UTF-8 下进行工作, 会带来许多方便之处。 由于 VIM 在运行过程中切换 encoding 会造成许多问题, 如提示信息乱码、 register 丢失等, 因此强烈建议大家在启动 VIM 的时候把 encoding 设置为 UTF-8, 在编辑非 UTF-8 的文件时, 通过 fileencoding 来进行转码。
* set langmenu=zh_CN.UTF-8
使用中文菜单, 并使用 UTF-8 编码。 如果没有这句的话, 在非 UTF-8 的系统, 如 Windows 下, 用了 UTF-8 的 encoding 后菜单会乱码。
* language message zh_CN.UTF-8
使用中文提示信息, 并使用 UTF-8 编码。 如果没有这句的话, 在非 UTF-8 的系统, 如 Windows 下, 用了 UTF-8 的 encoding 后系统提示会乱码。
* set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
设置编码的自动识别。 关于这条设置的详细含义, 请参看这篇文章。
* set ambiwidth=double
防止特殊符号无法正常显示。 在 Unicode 中, 许多来自不同语言的字符, 如果字型足够近似的话, 会把它们放在同一个编码中。 但在不同编码中, 字符的宽度是不一样的。 例如中文汉语拼音中的 ā 就很宽, 而欧洲语言中同样的字符就很窄。 当 VIM 工作在 Unicode 状态时, 遇到这些宽度不明的字符时, 默认使用窄字符, 这会导致中文的破折号“——”非常短, 五角星“★”等符号只能显示一半。 因此, 我们需要设置 ambiwidth=double 来解决这个问题。
* filetype plugin indent on
开启文件类型自动识别, 启用文件类型插件, 启用针对文件类型的自动缩进。

2 文本编辑设置

* set sw=4
自动缩进的时候, 缩进尺寸为 4 个空格。
* set ts=4
Tab 宽度为 4 个字符。
* set et
编辑时将所有 Tab 替换为空格。
该选项只在编辑时将 Tab 替换为空格, 如果打开一个已经存在的文件, 并不会将已有的 Tab 替换为空格。 如果希望进行这样的替换的话, 可以使用这条命令“:retab”。
* set smarttab
当使用 et 将 Tab 替换为空格之后, 按下一个 Tab 键就能插入 4 个空格, 但要想删除这 4 个空格, 就得按 4 下 Backspace, 很不方便。 设置 smarttab 之后, 就可以只按一下 Backspace 就删除 4 个空格了。
* set spell
打开拼写检查。 拼写有错的单词下方会有红色波浪线, 将光标放在单词上, 按 z= 就会出现拼写建议, 按 ]s 可以直接跳到下一个拼写错误处。

3 断行设置

* set tw=78
设置光标超过 78 列的时候折行。
* set lbr
不在单词中间断行。 设置了这个选项后, 如果一行文字非常长, 无法在一行内显示完的话, 它会在单词与单词间的空白处断开, 尽量不会把一个单词分成两截放在两个不同的行里。
* set fo+=mB
打开断行模块对亚洲语言支持。 m 表示允许在两个汉字之间断行, 即使汉字之间没有出现空格。 B 表示将两行合并为一行的时候, 汉字与汉字之间不要补空格。 该命令支持的更多的选项请参看用户手册。

4 C/C++ 编码设置

* set sm
显示括号配对情况。 打开这个选项后, 当输入后括号 (包括小括号、中括号、大括号) 的时候, 光标会跳回前括号片刻, 然后跳回来, 以此显示括号的配对情况。
* set cin
打开 C/C++ 风格的自动缩进。 打开了自动缩进后, 在编码的时候我们可以使用“V”命令选中一段文本后, 按“=”将这段文本重新调整缩进格式, 在一定程度上起到代码美化的作用。
另外, 打开了自动缩进后, 在使用 TERM 下的 vim 的时, 粘贴代码时常常会出现版式混乱的现象。 那是因为 TERM 并不知道你现在正在粘贴代码, 它直接“粘贴”动作向 vim 解释为键入, 因此 vim 便按照设置的自动缩进格式为你的代码调整了缩进。 不幸的是, 粘贴进去的代码中本身已经包含了缩进, 因此便出现了版式混乱的情况。 在 gvim 中就不会出现这个问题, 因为它能够知道你现在正在粘贴。
知道了这个症状的来由, 解决方案也就显而易见了: 在粘贴的时候把所有自动缩进都关闭, 粘贴完毕之后再打开。 一个个手工关闭自动缩进未免过于繁琐, vim 为我们提供了一个很好用的命令, 只要输入“:set paste”, 就可以关闭所有自动缩进。 粘贴完毕后再输入“:set nopaste”就可以重新打开原有的自动缩进设置了。
* set cino=:0g0t0(sus
设定 C/C++ 风格自动缩进的选项, 这里简要介绍一下这段代码里用到的选项的含义, cino 支持的选项还很多, 更多选项请看用户手册。

// :0
//
// switch 语句之下的 case 语句缩进 0 个空格,也就是说不缩进,与 switch 块平
// 齐,使用这样风格:
switch (x)
{
case 1:
a = b;
break;
default:
}

// g0
//
// class、struct 等之下的访问权限控制语句,如 public、protected、private 等,
// 相对 class、struct 等所在的块缩进 0 个空格,与 class 等块平齐,使用这样的
// 风格:
class foo
{
public:
int a;
private:
int b;
};

// t0
//
// 如果函数返回值与函数名不在同一行,则返回值缩进 0 个空格,也就是说不缩进,如
// 下所示:

// set cino=t4
int
func1()
{
}

// set cino=t0
int
func()
{
}

// (sus
//
// 当一对括号跨越多行时,其后的行缩进前面 sw 指定的距离,效果如下:
int a = (1 + 2 + 3
+ 4 + 5 + 6
+ 7 + 8) * 9;

* set ai
打开普通文件类型的自动缩进。 该自动缩进不如 cindent 智能, 但它可以为你编辑非 C/C++ 文件提供一定帮助。

5 其它设置

* set selectmode=
不使用 selectmode。
* set keymodel=
不使用 “Shift + 方向键”选择文本, “Shift + 方向键”代表向指定方向跳一个单词。 如果你喜欢这项功能的话, 可以使用“set keymodel=startsel,stopsel”打开它。
* set selection=inclusive
指定在选择文本时, 光标所在位置也属于被选中的范围。 如果指定 selection=exclusive 的话, 可能会出现某些文本无法被选中的情况。
* set wildmenu
在命令模式下使用 Tab 自动补全的时候, 将补全内容使用一个漂亮的单行菜单形式显示出来。
* colo torte
选择 torte 配色方案。 VIM 里内置了许多关键字上色的配色方案, 另外你还可以到网上下载更多配色方案, 或是自己编写。 点击“编辑”→“调色板”, 就能列出所有支持的配色方案。 你可以把“调色板”子菜单剪下来, 然后慢慢选择, 挑出一个你最喜欢的配色方案来。

6 图形界面设置

* set nowrap
指定不折行。 如果一行太长, 超过屏幕宽度, 则向右边延伸到屏幕外面。 如果使用图形界面的话, 指定不折行视觉效果会好得多。
* set mousemodel=popup
当右键单击窗口的时候, 弹出快捷菜单。
* set guioptions+=b
添加水平滚动条。 如果你指定了不折行, 那为窗口添加一个水平滚动条就非常有必要了。
* set guifont=Bitstream Vera Sans Mono 9
设置图形界面下的字体。 你可以点“编辑”→“选择字体”, 然后在对话框中选出你喜欢的字体与字号, 选择完毕后, 先按几下 ESC 确认处在 Normal 模式下, 然后输入这条命令:“:set guifont?” 回车后 gvim 屏幕最下方会显示出你当前所用的字体的名称与字号。 将获得的结果写到配置文件里面就可以了, 需要注意一点, 如果字体名称里面含有空格的话, 在抄的时候需要在所有空格前面加一个斜杠。

7 条件选择

同一个配色方案, 在 gvim 下和字符界面的 vim 下效果大相径庭, 滇狐个人的习惯是, 在 gvim 下使用 torte 配色方案, 在 vim 下使用 ron 配色方案。 因此我们有必要针对 gvim 和 vim 进行不同的设置。

另外, 前面我们在 gvim 下不使用折行, 开启水平滚动条, 但在 vim 下, 是没有滚动条可用的, 因此还是有必要为 vim 保留自动折行。

条件选择设置的格式如下:
if (has("gui_running"))
" 图形界面下的设置
set nowrap
set guioptions+=b
colo torte
else
" 字符界面下的设置
set wrap
colo ron
endif
8 示例配置文件

下面给出一个滇狐推荐的初学者专用 (G)Vim 配置文件, 里面没有太多个性化的设置, 方便大家进一步扩展:
set nocp

" Tab related
set ts=4
set sw=4
set smarttab
set et
set ambiwidth=double

" Format related
set tw=78
set lbr
set fo+=mB

" Indent related
set cin
set ai
set cino=:0g0t0(susj1

" Editing related
set backspace=indent,eol,start
set whichwrap=b,s,<,>,[,]
set mouse=a
set selectmode=
set mousemodel=popup
set keymodel=
set selection=inclusive

" Misc
set wildmenu
set spell

" Encoding related
set encoding=utf-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1

" File type related
filetype plugin indent on

" Display related
set ru
set sm
set hls
if (has("gui_running"))
set guioptions+=b
colo torte
set nowrap
else
colo ron
set wrap
endif
syntax on

"=============================================================================
" Platform dependent settings
"=============================================================================

if (has("win32"))

"-------------------------------------------------------------------------
" Win32
"-------------------------------------------------------------------------

if (has("gui_running"))
set guifont=Bitstream_Vera_Sans_Mono:h9:cANSI
set guifontwide=NSimSun:h9:cGB2312
endif

else

if (has("gui_running"))
set guifont=Bitstream Vera Sans Mono 9
endif

2007年11月27日火曜日

VIM(GVIM)常用命令

在 文 本 中 查 找 一 个 单 词
假设你在文本中看到一个单词 "TheLongFunctionName" 而你想找到下一个相同的单词。
你可以输入 "/TheLongFunctionName",但这要输入很多东西。而且如果输错了,Vim 是
不可能找到你要找的单词的。
有一个简单的方法:把光标移到那个单词下面使用 "*" 命令。Vim 会取得光标上的
单词并把它作为被查找的字符串。
"#" 命令在反向完成相同的功能。你可以在命令前加一个计数:"3*" 查找光标下单
词第三次出现的地方。

查 找 整 个 单 词
如果你输入 "/the",你也可能找到 "there"。要找到以 "the" 结尾的单词,可以用:
/the\> "\>" 是一个特殊的记号,表示只匹配单词末尾。类似地,"\<" 只匹配单词的开头。 这样,要匹配一个完整的单词 "the",只需: /\ 这不会匹配 "there" 或者 "soothe"。注意 "*" 和 "#" 命令也使用了 "词首" 和
"词尾" 标记来匹配整个单词 (要部分匹配,使用 "g*" 和 "g#")

你可以用如下命令取得所有的标记的列表:
:marks 你会注意到有一些特殊的标记,包括:
' 跳转前的光标位置
" 最后编辑的光标位置
[ 最后修改的开始位置
] 最后修改的结束位置

快 捷 键
有些 "操作符-动作" 命令由于经常被使用,所以被设置为单字符命令:
x 表示 dl (删除当前光标下的字符)
X 表示 dh (删除光标左边的字符)
D 表示 d$ (删除到行尾)
C 表示 c$ (修改到行尾)
s 表示 cl (修改一个字符)
S 表示 cc (修改一整行)

在 什 么 地 方 加 入 计 数 前 缀
命令 "3dw" 和 "d3w" 都是删除 3 个单词。如果你非要寻根问底,那么:"3dw" 表示删
除一个单词 3 次,而 "d3w" 表示删除三个单词一次。这是一个没有分别的分别。实际上
你可以放两个计数前缀,例如,"3d2w" 删除两个单词三次,共计六个单词。

可视模式
你可以用 "v" 命令启动可视模式
如果你想对整行做操作,可以使用 "V" 命令来启动可视模式。
如果你要处理一个矩形块内的文本,可以使用 CTRL-V 启动可视模式。这在处理表格时非
常有用。

移 动 到 另 一 端
如果你在可视模式下选中了一些文字,然后你又发现你需要改变被选择的文字的另一端,
用 "o" 命令即可 (提示:"o" 表示 other end),光标会移动到被选中文字的另一端,现
在你可以移动光标去改变选中文字的开始点了。再按 "o" 光标还会回到另一端。
当使用列块可视模式的时候,你会有四个角,"o" 只是把你移到对角上。而用 "O" 则能
移到同一行的另一个角上。
备注: "o" 和 "O" 在可视模式下与在普通模式下的作用有很大的不同;在普通模式下,
它们的作用是在光标后或前加入新的一行。

拷贝文本
注意:"yw" 命令包括单词后面的空白字符。如果你不想要这个字符,改用 "ye" 命令。
"yy" 命令拷贝一整行,就像 "dd" 删除一整行一样。出乎意料地是,"D" 删除到行尾而
"Y" 却是拷贝一整行。要注意这个区别!"y$" 拷贝到行尾。

使用剪贴板
如果你用的不是 GUI,或者你根本不喜欢用菜单,你只能用其它办法了。你还是可以用普
通的 "y" (yank) 和 "p" (put) 命令,但在前面必须加上 "* (一个双引号加一个星
号)。例如,要拷贝一行到剪贴板中:
"*yy 要粘贴回来:
"*p 这仅在支持剪贴板的 Vim 版本中才能工作。

文本对象
如果你在一个单词的中间而又想删掉这个单词,在你用 "dw" 前,你必须先移到这个单词
的开始处。这里还有一个更简单的方法:"daw"。
"daw" 的 "d" 是删除操作符。"aw" 是一个文本对象。提示:"aw" 表示 "A Word" (一个
单词),这样,"daw" 就是 "Delete A Word" (删除一个单词)。确切地说,该单词后的空
格字符也被删除掉了。

使用文本对象是 Vim 中执行修改的第三种方法。我们已经有 "操作符-动作" 和可视模
式两种方法了。现在我们又有了 "操作符-文本对象"。
这种方法与 "操作符-动作" 很相似,但它不是操作于从当前位置到移动目标间的内
容,而是对光标所在位置的 "文本对象" 进行操作。文本对象是作为一个整体来处理的。
现在光标在对象中的位置无关紧要。

用 "cis" 可以改变一个句子。看下面的句子:

Hello there. This
is an example. Just
some text.

移动到第二行的开始处。现在使用 "cis":

Hello there. Just
some text.

现在你输入新的句子 "Another line.":

Hello there. Another line. Just
some text.

"cis" 包括 "c" (change,修改) 操作符和 "is" 文本对象。这表示 "Inner Sentence"
(内含句子)。还有一个文本对象是 "as",区别是 "as" 包括句子后面的空白字符而 "is"
不包括。如果你要删除一个句子,而且你还想同时删除句子后面空白字符,就用 "das";
如果你想保留空白字符而替换一个句子,则使用 "cis"。

你还可以在可视模式下使用文本对象。这样会选中一个文本对象,而且继续留在可视模
式,你可以继续多次执行文本对象命令。例如,先用 "v" 启动可视模式,再用 "as" 就
可以选中一个句子。现在重复执行 "as",就会继续选中更多的句子。最后你可以使用一
个操作符去处理这些被选中的句子。

你可以在这里找到一个详细的文本对象的列表:|text-objects|。
动作和操作符

动作命令出现在操作符之后,从而使操作符作用于被该动作所跨越的文本之上。也就 是,在动作之前和之后的光标位置之间的文本。一般的,操作符用来删除或者改变文本。 下面列出所有的操作符: |c| c 修改 (change)
|d| d 删除 (delete)
|y| y 抽出 (yank) 到寄存器 (不改变文本)
|~| ~ 变换大小写 (只有当 'tildeop' 置位时有效)
|g~| g~ 变换大小写
|gu| gu 变为小写
|gU| gU 变为大写
|!| ! 通过外部程序过滤
|=| = 通过 'equalprg' (若为空,C-indenting) 过滤
|gq| gq 文本排版
|g?| g? ROT13 编码
|>| > 右移
|<| < 左移 |zf| zf 定义折叠
|g@| g@ 调用 'operatorfunc' 选项定义的函数
预 定 义 标 记
当你跳转到另一个文件后,有两个预定义的标记非常有用:
`" 这个标记使你跳转到你上次离开这个文件时的位置。
另一个标记记住你最后一次修改文件的位置:
`.
假设你在编辑 "one.txt",在文件中间某个地方你用 "x" 删除一个字符,接着用 "G" 命
令移到文件末尾,然后用 "w" 存盘。然后你又编辑了其它几个文件。你现在用 ":edit
one.txt" 回到 "one.txt"。如果现在你用 `",Vim 会跳转到文件的最后一行;而用 `.
则跳转到你删除字符的地方。即使你在文件中移动过,但在你修改或者离开文件前,这两
个标记都不会改变。

文 件 标 记

在第四章,我们介绍过使用 "mx" 命令在文件中增加标记,那只在一个文件中有效。如果
你编辑另一个文件并在那里加了标记,这些标记都是这个文件专用的。这样,每个文件都
有一个自己的标记集,并只能在该文件中使用。
到此为止,我们都用小写字母的标记。实际上还可以使用大写字母标记,这种标记是
全局的,它们可以在任何文件中使用。例如,你在编辑一个文件 "foo.txt"。在文件的中
间 (50%) 并建立一个 J 标记 (J 表示甲):

50%mJ
现在编辑文件 "bar.txt" 并在文件的最后一行放一个标记 Y (Y 表示乙):

GmY
现在你可以使用 "`J" 命令跳回到 foo.txt 的中间。或者在另一个文件中输入 "`Y" 跳
回到 bar.txt 的末尾。

文件标记会被一直记住直到被重新定义。这样,你可以在一个文件中留下一个标记,然后
任意做一段时间的编辑,最后用这个标记跳回去。
让文件标记符和对应的位置建立一些关系常常是很有用的。例如,用 H 表示头文件
(Head File),M 表示 Makefile 而 C 表示 C 的代码文件。

要知道一个标记在什么地方,在 ":marks" 命令中加上标记名作为参数即可:

:marks M
你还可以带多个参数:

:marks MCP
别忘了你还可以 CTRL-OCTRL-I 在整个跳转序列中前后跳转。
用 vimdiff 显示文件差异

有一种特殊的启动 Vim 的方法可以用来显示两个文件的差异。让我们打开一个 "main.c" 并插入一些字符。在设置了 'backup' 选项的情况下保存这个文件,以便产生 "main.c~" 备份文件。 在命令行中输入如下命令:(不是在 Vim 中) vimdiff main.c~ main.c Vim 会用垂直分割的方式打开两个文件。你只能看到你修改过的地方和上下几行的地方。
折 叠 栏

每个窗口在左边都有一个颜色略有不同的显示栏,图中标识为 "VV"。你会发现每个折叠
在那个位置都有一个加号。把鼠标移到那里并按左键可以打开那个折起,从而让你看到里
面的内容。
对于打开的折叠,折叠栏上会出现一个减号。如果你单击那个减号,折叠会被重新关
闭。
当然,这只能在你有鼠标的情况下使用。如果你没有,可以用 "zo" 打开一个折叠。
关闭使用 "zc"。

用 Vim 做 比 较

启动比较模式的另一种方法从 Vim 内部开始:编辑 "main.c" 文件,然后分割窗口显示
区别:

:edit main.c
:vertical diffsplit main.c
":vertical" 命令使窗口用垂直的方式分割。如果你不写这个命令,结果会变成水平分
割。

如果你有一个当前文件的补丁或者 diff 文件,你可以用第三种方法启动比较模式:先编
辑这个文件,然后告诉 Vim 补丁文件的名称:

:edit main.c
:vertical diffpatch main.c diff
警告:补丁文件中必须仅包括为一个目标文件所做的补丁,否则你可能会得到一大堆错误
信息。还可能有些你没打算打补丁的文件也被打了补丁。
补丁功能只改变内存中的文件备份,不会修改你硬盘上的文件 (除非你决定写入改
动)。

滚 动 绑 定

当文件中有很多改动时,你可以用通常的方式滚动屏幕。Vim 会尽可能保持两个文件对
齐,以便你可以并排看到文件的区别。
如果暂时想关闭这个特性,使用如下命令:

:set noscrollbind

跳 转 到 修 改 的 地 方

如果你通过某种方法取消了折叠功能,可能很难找到有改动的地方。使用如下命令可以跳
转到下一个修改点:

]c
反向跳转为:

[c
加上一个计数前缀可以跳得更远。

消 除 差 异

你可以把文本从一个窗口移到另一个,并以此来消除差异,或者为其中一个文件中增加几
行。Vim 有时可能无法及时更新高亮显示。要修正这种问题,使用如下命令:

:diffupdate
要消除差异,你可以把一个高亮显示的块从一个窗口移动到另一个窗口。以上面的
"main.c" 和 "main.c~" 为例,把光标移到左边的窗口,在另一个窗口中被删除的行的位
置,执行如下命令:

:dp
这将把文字从左边拷到右边,从而消除两边的差异。"dp" 代表 "diff put"。
你也可以反过来做:把光标移到右边的窗口,移到被 "改动" 了的行上,然后执行
如下命令:

:do
这把文本从左边拷到右边,从而消除差异。
由于两个文件已经没有区别了,Vim 会把所有文字全部折叠起来。"do" 代表 "diff
obtain"。本来用 "dg" (diff get) 会更好。可是它已经有另外的意思了 ("dgg" 删除从
光标为止到首行的所有文本)。
标签页
假设你正在编辑文件 "thisfile"。下面的命令可以建立新的标签页:

:tabedit thatfile
这会在一个窗口中编辑文件 "thatfile",这个窗口会占满整个 Vim 窗口。你会注意到在
顶部有一个含有两个文件名的横条:
你可以通过单击顶端的标签切换标签页。如果没有鼠标或者不想用它,可以使用 "gt" 命
令。助记符:Goto Tab。

现在,让我们通过下面的命令建立另一个标签页:

:tab split
这会建立一个新的标签页,包含一个窗口,编辑和刚才所在窗口中的缓冲区相同的缓冲
区:
在任何打开窗口的 Ex 命令前面,你都可以放上 ":tab"。这个窗口在新标签页中打开。
另一个例子:

:tab help gt
它将在新的标签页中显示关于 "gt" 的帮助。

使用标签页可以完成更多的工作:

- 在末尾标签后面的空白处单击鼠标
选择下个标签页,同 "gt"。

- 在右上角的 "X" 处单击鼠标
关闭当前标签页,除非当前标签页中的改变没有保存。

- 在标签行上双击鼠标
建立新标签页。

- "tabonly" 命令
关闭除了当前标签页以外的所有标签页,除非其它标签页中的改变没有保存。

关于标签页更多的信息,参见 |tab-page|。
反转行顺序

|:global| 命令可以和 |:move| 命令联用,将所有行移动到文件首部。结果是文件被按 行反转了次序。命令是: :global/^/m 0 缩写: :g/^/m 0 正则表达式 "^" 匹配行首 (即使该行是一个空行)。|:move| 命令将匹配的行移动到那个 神秘的第 0 行之后。这样匹配的行就成了文件中的第一行。由于 |:global| 命令不会被 改变了的行号搞混,该命令继续匹配文件中剩余的行并将它们一一变为首行。 这对一个行范围同样有效。先移动到第一行上方并做标记 't' (mt)。然后移动到范围的 最后一行并键入: :'t+1,.g/^/m 't

单词统计

有时你要写一些有最高字数限制的文字。Vim 可以帮你计算字数。 如果你需要统计的是整个文件的字数,可以用这个命令:

g CTRL-G

不要在 "g" 后面输入一个空格,这里只是方便阅读。 它的输出是:

Col 1 of 0; Line 141 of 157; Word 748 of 774; Byte 4489 of 4976 (译者注:中文是:
第 1/0 列; 第 141/157 行; 第 748/774 个词; 第 4489/4976 个字节 )

你可以看到你在第几个单词 (748) 上以及文件中的单词总数 (774)。
如果你要知道的是全文的一部分的字数,你可以移到该文本的开头,输入 "g CTRL-G",
然后移到该段文字的末尾,再输入 "g CTRL-G",最后心算出结果来。
这是一种很好的心 算练习,不过不是那么容易。比较方便的办法是使用可视模式,选中你要计算字数的文 本,然后输入 "g CTRL-G",结果将是: Selected 5 of 293 Lines; 70 of 1884 Words; 359 of 10928 Bytes (译者注:中文是: 选择了 5/293 行; 70/1884 个词; 359/10928 个字节 ) 要知道其它计算字数,行数和其它东西总数的方法,可以参见 |count-items|。
查阅 man 信息

编辑一个脚本文件或者 C 程序的时候,有时你会需要从 man 手册中查询某个命令或者函
数的用法 (使用 Unix 的情况下)。让我们先用一个简单的方法:把鼠标移到对应的单词
上然后输入:

K
Vim 会在对应的单词上执行外部命令:man。如果能找到相应的手册,那个手册页就会被
显示出来。它常常用 more 一类的程序显示页面。在手册滚动到文件末并回车,控制就会
回到 Vim 中。

这种方法的缺点是你不能同时查看手册和编辑文档。这里有一种办法可以把手册显示到一
个 Vim 的窗口中。首先,加载 man 文件类型的外挂:

:runtime! ftplugin/man.vim
如果你经常用到这种方法,可以把这个命令加到你的 vimrc 文件中。现在你可以用
":Man" 命令打开一个显示 man 手册的窗口了:

:Man csh
你可以在这个新的窗口中上下滚动,而手册的本文会用语法高亮的形式显示。这样,你可
以找到需要的地方,并用 CTRL-W w 跳转到原来的窗口中继续工作。
要指定手册的章节,可以在手册名称前面指定。例如,要找第三章的 "echo":

:Man 3 echo
要跳转到另一个由 "word(1)" 形式定义的手册,只要在上面敲 CTRL-]。无论怎样,
":Man" 命令总使用同一个窗口。

要显示当前光标下的单词的手册,这样:

\K
(如果你重定义了 ,用那个字符代替上面命令的反斜杠)。
例如,你想知道下面语句中的 "strstr()" 函数的返回值:

if ( strstr(input, "aap") == )

可以把光标移到 "strstr" 并输入 "\K"。手册使用的窗口会显示 strstr() 的信息。

使 用 XXD
一个真正的二进制编辑器用两种方式来显示文本: 二进制和十六进制格式。你可以在 Vim
里通过转换程序 "xxd" 来达到这效果。该程序是随 Vim 一起发布的。
首先以二进制方式编辑这个文件:

vim -b datafile
现在用 xxd 把这个文件转换成十六进制:

:%!xxd
文本看起来像这样:

0000000: 1f8b 0808 39d7 173b 0203 7474 002b 4e49 ....9..;..tt.+NI
0000010: 4b2c 8660 eb9c ecac c462 eb94 345e 2e30 K,.`.....b..4^.0
0000020: 373b 2731 0b22 0ca6 c1a2 d669 1035 39d9 7;'1.".....i.59.

现在你可以随心所欲地阅读和编辑这些文本了。 Vim 把这些信息当作普通文本来对待。
修改了十六进制部分并不导致可显示字符部分的改变,反之亦然。
最后,用下面的命令把它转换回来:

:%!xxd -r
只有十六进制部分的修改才会被采用。右边可显示文本部分的修改忽略不计。

欲知更多详情,参见 xxd 手册。

补 全 特 定 文 本

如果你知道你要找什么,那么你可以用这些命令来补全某种类型的文本:

CTRL-X CTRL-F 文件名
CTRL-X CTRL-L 整行
CTRL-X CTRL-D 宏定义 (包括包含文件里的)
CTRL-X CTRL-I 当前文件以及所包含的文件
CTRL-X CTRL-K 字典文件内的单词
CTRL-X CTRL-T 同义词词典文件内的单词
CTRL-X CTRL-] 标签
CTRL-X CTRL-V Vim 命令行
    CTRL-X CTRL-O 全能补全的热键

每个命令之后,CTRL-N 可以用来搜索下一个匹配,而 CTRL-P 则用于搜索前一个匹配。
重复一次插入
如果你按 CTRL-A,编辑器就把你上次在插入模式下输入的文本再输入一次。
比如,假定你有个文件,开头是这样的:

"file.h"
/* Main program begins */

你在第一行开始处插入 "#include ":

#include "file.h"
/* Main program begins */

你再用命令 "j^" 往下来到下一行的开始处。现在你开始插入一个新的 "#include" 行。
所以你键入:

i CTRL-A
结果就像下面这样:

#include "file.h"
#include /* Main program begins */

"#include " 被插入是因为 CTRL-A 会插入上次插入过的文本。现在你键入 "main.h"
以结束这一行:


#include "file.h"
#include "main.h"
/* Main program begins */

CTRL-@ 命令会完成 CTRL-A 的操作后退出插入模式。这是一个快速重复插入一模一样的
文本的一个方法。
从另一行拷贝
CTRL-Y 命令插入光标上方的字符。当你复制前一行文本的时候,这个命令很有用。例
如,你有这么一行 C 代码:

b_array[i]->s_next = a_array[i]->s_next;

现在你需要把这一行再键入一次,并以 "s_prev" 取代 "s_next"。换行以后,按 14 次
CTRL-Y,直到光标位于 "next" 的 "n" 上:

b_array[i]->s_next = a_array[i]->s_next;
b_array[i]->s_

现在你键入 "prev":

b_array[i]->s_next = a_array[i]->s_next;
b_array[i]->s_prev

继续按 CTRL-Y 直到下一个 "next":

b_array[i]->s_next = a_array[i]->s_next;
b_array[i]->s_prev = a_array[i]->s_

现在键入 "prev;" 以结束这一行。

CTRL-E 命令操作起来跟 CTRL-Y 一样,只不过它插入光标下方的字符。
插入一个寄存器内容
命令 CTRL-R {register} 插入寄存器里的内容。它的用处是让你不必键入长词。例如,
你要输入下面这些:

r = VeryLongFunction(a) + VeryLongFunction(b) + VeryLongFunction(c)

这个函数的定义见于另一个文件。编辑那个文件并把光标移到该函数名上,然后把文件名
摄入寄存器 v:

"vyiw
"v 指定寄存器,"yiw" 意思是拷贝一个词,不含空格 (yank-inner-word)。现在编辑那
个要插入一行代码的文件,先键入开头几个字符:

r =

现在用 CTRL-R v 来插入函数名:

r = VeryLongFunction

你接下来在函数名后面键入其它必要字符,然后再用两次 CTRL-R v。
你也可以用补全功能来完成同样的工作。但当你有好几个词,其开头几个字符都一样
的时候,寄存器就有用多了。

如果寄存器存放着诸如 或其它特殊字符,这些字符就被解释成好像它们本来是从键
盘键入的。如果你不要这样解释 (你确实要在文本中插入 ),那么要命令 CTRL-R
CTRL-R {register}