5. 其它 Vim 特色 *other-features*
随机选取的一些其他的优美特色的列表。
Vim 以 "-s scriptfile" 启动时,"scriptfile" 读取的字符就像你输入的那样。如果在
编辑器还没退出时文件结束,多余的字符从控制台读入。
"-w" 选项用来把所有的输入字符记录在脚本文件里。该文件可以用来重做编辑的操作,
甚至可以作用在通过修改脚本文件里的一些命令后作用在别的文件上。
"-o" 选项为每个参数打开一个窗口。"-o4" 则打开四个窗口。
要能在全屏工作,Vi 需要几项 termcap 项目。Vim 只要 "cm" 项目 (光标移动)。
命令模式下:
'showcmd' 选项置位时,命令字符在屏幕末行上显示。命令结束时它们被删除。
如果置位了 'ruler' 选项,当前的光标位置显示在屏幕末行。
"U" 在离开最近修改的行和 "u" 之后都还能工作。
能显示设置了第 8 位的字符。'~' 和 0xa0 之间的字符显示为 "~?"、 "~@"、"~A",等
等。除非它们包含在 'isprint' 选项里。
"][" 跳到 C 函数的下一个结束处 (第一列的 '}')。
"[]" 转到 C 函数的前一个结束处 (第一列的 '}')。
"]f"、"[f" 和 "gf" 开始编辑光标所在的文件名。
CTRL-W f 分割窗口,并开始编辑光标所在的文件名。
"*" 正向搜索光标所在的标识符,"#" 反向搜索之。
"K" 运行 'keywordprg' 选项定义的程序,使用光标所在的标识符作为参数。
"%" 可以在前面加一个计数。光标跳转到文件该百分比所处的行。普通的 "%" 功能则跳
转到匹配的括号上,引号里的括号跳过。
CTRL-] 命令可以在光标位于标识符中间时使用。
记住用过的标签。使用标签栈的命令包括 CTRL-T、"

op" 和 ":tag"。":tags" 列出标
签栈。
'tags' 选项可以设置标签文件名字的列表。可以指定多个标签文件。"./" 开始的文件名
里,"./" 被当前文件所在的路径所代替。这样可以指定编辑中的文件的相同目录下的标
签文件。
以前用过的文件名被记在轮换文件名列表里。
CTRL-^ 接受一个计数,指定列表的一个索引。
":files" 命令显示轮换文件名列表。
"#<N>" 被替换成列表中第 <N> 个轮换文件名。
"#<" 被替换成不带扩展名的当前文件名。
搜索模式可以使用更多特性。<NL> 字符被看成搜索模式和 ":s" 的替换字符串的一部
分。Vi 把它看成命令的结束。
搜索可以把光标放在匹配的结束处,还可以包括一个字符位移。
计数可以应用于 "~"、":next"、":Next"、"n" 和 "N"。
":next!" 命令在置位 'autowrite' 时,不写入文件。过去,vi 写入文件,但这被认为
是一个漏洞,因为用户不期待该行为,而且 ":rewind!" 也不写入文件。
Vi 在替换模式下输入 <CR> 时,只有置位 'ai' 以后才删除一个字符 (但直到你按
<Esc> 时才看到)。Vim 在任何情况下都删除一个字符 (并立即显示)。
增加了 :wnext 命令。和 ":write" 接着 ":next" 相同。
":w!" 命令总是写入,即使文件写保护时也是如此。Vi 里你需要先执行 ":!chmod +w %"
和 ":set noro"。
置位 'tildeop' 以后,"~" 是操作符 (一定要跟在移动命令之后使用)。
"J" (连接) 命令里,你可以复位 'joinspaces' 选项,使得句号之后只有一个空格 (Vi
插入两个空格)。
"cw" 可以用来改变多个字符组成的空白 (Vi 则不明确: "cw" 只改变一个空格,而 "dw"
删除所有的空白)。
"o" 和 "O" 接受计数,以便重复插入的部分 (Vi 清除部分的显示)。
不支持 Ex 命令之后的标志位 (也无实现它的计划)。
非 UNIX 系统上,":cd" 命令显示当前的目录,而不是转到主目录 (因为没有)。"

wd"
在所有的系统上显示当前目录。
":cd" 命令之后,文件名 (参数列表和打开的文件) 仍然指向原来的文件。Vi 里,改动
过的文件里不允许执行 ":cd",否则文件名的含义就改变了。
":source!" 命令从文件里读取 Vi 命令。
":mkexrc" 命令写入当前修改过的选项和映射到 ".exrc" 文件里。":mkvimrc" 写入到
".vimrc" 文件。
映射不检查所谓的 "尾递归"。这样可以允许 ":map! foo ^]foo" 类似的形式。
映射以数字开始时,vi 丢失了之前输入的计数 (例如,如果使用映射 ":map g 4G",命
令 "7g" 转到第 4 行)。这被认为是一个 vi 的漏洞。Vim 连接计数 (这个例子里,它成
为了 "74G"),符合多数人的期待。

ut! 命令把寄存器的内容插到当前行之前。
如果放置的文本少于一行,vi 的 "p" 和 "P" 命令不能用 "." 重复。Vim 它们总是可以
重复的。
":noremap" 命令可以用来输入不会被重映射的映射。这可以用来交换两个键的含义。
":cmap"、":cunmap" 和 ":cnoremap" 可以用来只在命令行编辑时映射。":imap"、
":iunmap" 和 ":inoremap" 则可用作插入模式的映射。类似的命令对缩写也存在:
":noreabbrev"、":iabbrev"、":cabbrev"、":iunabbrev"、":cunabbrev"、
":inoreabbrev"、":cnoreabbrev"。
Vi 里命令 ":map foo bar" 会删除以前定义过的映射 ":map bug foo"。这被认为是一个
漏洞。所以 Vim 没有这一特性。
":unmap! foo" 倒是会删除 ":map! bug foo"。如果不这样,撤销映射很难实现 (这和
vi 兼容)。
':' 寄存器包含最近的命令行。
'%' 寄存器包含当前的文件名。
'.' 寄存器包含最近插入的文本。
":dis" 命令显示抽出的寄存器的内容。
CTRL-O/CTRL-I 可用作跳转到较旧的/较新的位置。这和 '' 命令所用到的位置相同,但
是可以到别的文件里。":jumps" 命令列出较老的所有位置。
如果置位了 'shiftround' 选项,">" 和 "<" 命令的缩进被取整到 'shiftwidth' 的倍
数。
'scrolljump' 选项可以设置为光标离开屏幕时最少滚动的行数。可用在滚动缓慢的场合。
'scrolloff' 选项可以设置光标上面和光标下面最少保留的行数。这样,你在编辑时,总
能看到一些上下文。如果设为了一个大值,光标总保持在窗口的中间。
大写位置标记用来在文件间跳转。":marks" 命令列出当前设置的所有位置标记。"']" 和
"`]" 命令跳转到前一个操作符的最后,或者放置 (put) 命令插入文本的最后。"'[" 和
"`[" 这跳转到相应的开始处。
'shelltype' 选项的设置反映了 Amiga 使用的外壳类型。
'highlight' 选项可以设置若干命令使用的高亮模式。
CTRL-A (加) 和 CTRL-X (减) 命令是新增的。命令的计数 (缺省为 1) 被从光标所在或
其后的数字加上/减去。该数字可以是十进制、八进制 ('0' 开始),或者十六进制 ('0x'
开始)。对宏很有用。
:set 命令可以使用 "inv" 前缀来反转布尔型选项的值。
Vi 和 Vim 上你都可以用 ":substitute" 命令的 CTRL-M 增加换行符。Vi 里,这意味着
你不能在文本里插入一个真正的 CTRL-M。Vim 里,你可以用前导 CTRL-V 的方式在文本
里输入一个真正的 CTRL-M。
插入模式下:
如果打开 'revins' 选项,则进行反方向插入。这可以用来输入希伯来文。插入普通字符
时,光标不会移动,而文字会往右移动。退格、CTRL-W 和 CTRL-U 同样反向工作。
CTRL-B 切换 'revins' 选项。在替换模式下,'revins' 没有效果。必须在编译时打开这
一功能。
退格键和 CTRL-D 一样可以用来删除自动的缩进。
如果 'backspace' (bs) 选项包含 "eol",你可以在换行符上退格、CTRL-U 和 CTRL-W。
如果 'backspace' 选项包含了 "start",你可以在插入的开始处退格。
如果置位了 'paste' 选项,一些选项被复位,而且插入模式和缩写的映射被禁止。这允
许在窗口系统里粘贴文本不会产生以外的效果。如果复位 'paste' 选项,旧的选项值重
新恢复。
CTRL-T/CTRL-D 总是插入/删除当前行的一个缩进,不管光标处于何列。
CTRL-@ (插入上次输入过的文本) 总能工作 (Vi: 只有在作为第一个字符输入时)。
CTRL-A 和 CTRL-@ 类似,但不离开插入模式。
CTRL-R {0-9a-z..} 可以用来插入寄存器的内容。
如果置位了 'smartindent' 选项,C 程序会更好的自动缩进,'cindent' 则做得更多。
CTRL-Y 和 CTRL-E 可以用来从当前光标位置的上/下复制字符。
CTRL-V 之后,你可以输入三个十进制数字。该字节作为单个字符插入在文本里。这可以
用来输入你的键盘上没有的国际字符。
打开 'expandtab' (et) 选项,使得 <Tab> 被扩展为合适数量的空格。
窗口总是反映缓冲区的内容 (Vi 在改变文本和其他一些情况下并不如此)。
如果 Vim 编译时定义了 DIGRAPHS,就能支持二合字母。已经包含了一组常用的二合字
母。它们可以用 ":digraph" 显示。用 ":digraph {char1}{char2} {number}" 可以定义
更多。二合字母本身以 "CTRL-K {char1} {char2}" 或 "{char1} BS {char2}" 输入 (后
者只有在打开 'digraph' 选项时)。
在重复插入时,例如 "10atest <Esc>",vi 只会处理第一个插入的回绕边界
('wrapmargin')。Vim 则对整体处理。
"i" 或 "a" 命令的计数用于所有文本。Vi 只针对第一行。在 Vi 里,
"3iabc<NL>def<Esc>" 会插入 "abcabcabc<NL>def",但 Vim 会给出
"abc<NL>defabc<NL>defabc<NL>def"。
命令行模式下:
<Esc> 退出命令行但不执行之。vi 里,命令行还是会执行,这和大多数人的期待不符
(按 <Esc> 应该总是让你退回到普通模式)。要避免一些古老的宏的问题,宏中的 <Esc>
仍然执行命令行命令。如果期待 <Esc> 的输入像 vi 那样执行命令行命令,你可以如此
修正 ":cmap ^V<Esc> ^V<CR>"
通用:
'ttimeout' 选项和 'timeout' 类似,但只对光标和功能键有效,而不是普通的经过映射
的字符。'timeoutlen' 选项给出等待的毫秒数。如果 'esckeys' 选项没有置位,<Esc>
开始的光标和功能键在插入模式下不会识别。
每个终端字符串有一个选项。这可以用在 termcap 不支持或者要改变单独的字符串的场
合。
'fileformat' 选项可以设置 <EOL> 的选择: "dos" <CR><NL>、"unix" <NL> 或 "mac"
<CR>。如果 'fileformats' 选项非空,Vim 试图自动检测 <EOL> 的类型,并据此设置
'fileformat' 选项。
有的系统没有任务 (job) 控制 (旧 Unix 系统和非 Unix 系统)。CTRL-Z、":stop" 或
":suspend" 命令启动一个新的外壳。
如果 Vim 在 Amiga 上启动时没有交互窗口作为输出,则打开一个窗口 (并且 :sh 仍然
工作)。你可以用 |-d| 参数给出编辑的设备,例如 "-d con:20/20/600/150"。
'columns' 和 'lines' 选项可以用来设置或者取得显示的宽度和高度。
从文件的第一行或者最后数行里读取选项的设置。'modelines' 选项决定尝试的行数 (缺
省为 5)。注意: 这和 Vi 版本不同,后者会执行模式行里的任何 Ex 命令 (严重的安全
问题)。|trojan-horse|
如果置位了 'insertmode' 选项 (例如在 .exec 里),Vim 以插入模式启动。并且在
按了 <Esc> 以后回到这一模式。
撤销的信息保存在内存里。可用的内存限制了可以撤销的改变的数目和大小。这可能对
MS-DOS 是一个问题,但在 Amiga 上很少是,而 Unix 和 Win32 上几乎不会。
如果置位了 'backup' 或 'writebackup' 选项: 在文件覆盖前,备份文件 (.bak) 被创
建。如果使用 "backup" 选项,覆盖后该文件得以保留。
Vim 创建 ".swp" 结尾的文件,用以存储文件的改动部分和内存放不下的内容。该文件用
于 "vim -r file",即从强行终止的编辑会话恢复。交换文件的使用可以用把
updatecount' 选项设为 0,或者以 "-n" 选项启动 Vim 来关闭。使用 'directory' 选
项把 .swp 文件放到其它地方。
Vim 在 8.3 文件名的文件系统下能正常工作。这也包括 Amiga 的 messydos 或者
crossdos 文件系统,或者 Unix 上装载 (mount) 的任何 8.3 文件系统。见
|'shortname'|。
错误信息显示至少一秒钟 (Vi 的错误信息会相互覆盖)。
如果 Vim 给出 |hit-enter| 提示,你可以输入任何键。除了 <CR>、<NL> 和 <Space>
的字符都被认为是命令 (的开始)。(Vi 只接受 ":" 开始的命令)。
计数和无名寄存器的内容在改变文件后仍然记住。
"No lines in buffer" 消息是一个普通的消息,而不是错误信息。因为后者会使得映射
被非正常终止。
Amiga 上支持 AUX: 设备。