分类:
2007-06-14 08:23:53
1. 单词替换
替换命令可以在全文中用一个单词替换另一个单词::%s/four/4/g"%" 范围前缀表示在所有行中执行替换。最后的 "g" 标记表示替换行中的所有匹配点。 如果你有一个象 "thirtyfour" 这样的单词,上面的命令会出错。这种情况下,这个单词会被替换成 "thirty4"。要解决这个问题,用 "\<" 来指定匹配单词开头::%s/\显然,这样在处理 "fourty" 的时候还是会出错。用 "\>" 来解决这个问题::%s/\/4/g如果你在编码,你可能只想替换注释中的 "four",而保留代码中的。由于这很难指定,可以在替换命令中加一个 "c" 标记,这样,Vim 会在每次替换前提示你::%s/\/4/gc在多个文件中替换 假设你需要替换多个文件中的单词。你的一个选择是打开每一个文件并手工修改。另外,如果使用 "记录-回放" 命令会更快。 假设你有一个包括有 C++ 文件的目录,所有的文件都以 ".cpp" 结尾。有一个叫"GetResp" 的函数,你需要把它改名为 "GetAnswer"。 vim *.cpp 启动 Vim,用当前目录的所有 C++ 文件作为文件参数。启动后你会停在第一个文件上。 qq 用 q 作为寄存器启动一次记录。 :%s/\/GetAnswer/g 在第一个文件中执行替换。 :wnext 保存文件并移到下一个文件。 q 中止记录。 @q 回放 q 中的记录。这会执行又一次替换和":wnext"。你现在可以检查一下记录有没有错。 999@q 对剩下的文件执行 q 中的命令 Vim 会在最后一个文件上报错,因为 ":wnext" 无法移到下一个文件上。这时所有的文件中的操作都完成了。备注: 在回放记录的时候,任何错误都会中止回放的过程。所以,要注意保证记录中的命令不会产生错误。 这里有一个陷阱:如果有一个文件不包含 "GetResp",Vim 会报错,而整个过程会中止,要避免这个问题,可以在替换命令后面加一个标记::%s/\/GetAnswer/ge"e" 标记通知 ":substitute" 命令找不到不是错误。
2.多文档编辑
:hide e filename
:n filename
隐藏当前文件,打开另一个文件进行编辑
:bn 切换到下一个文件
:bp 切换到上一个文件
:bw 关闭当前文件
:n 切换到下一个文件
:N 切换到上一个文件
CTRL + ^ 在当前文件和上一个文件间切换
3.缩写 ** **
:iab ms MicroSoft
:iab tihs this
有三种类型的缩写:
full-id "full-id" 类型完全由关键字字符组成 (字母 和 'iskeyword' 选项的字符)。
这是最普通的缩写。
例如: "foo","g3","-1"
end-id "end-id" 类型以一个关键字字符结尾,但所有其它字符都不是关 键字字符。
例如: "#i","..f","$/7"
non-id "non-id" 类型以一个非关键字字符结尾,其它字符可以是任意类 型,除了空格和 Tab。{Vi 不支持这种类型}
例如: "def#","4/7$"
不能被缩写的字串例子: "a.b","#def","a b","_$r"
仅当你输入一个非关键字字符时缩写才会被识别,这也包括用 退出插入模式或用结束一个命令的情形。结束缩写的非关键字字符被插入到缩写的扩展后面。一个例外是字符,它用来扩展一个缩写,但不插入任何附加字符。 例如::ab hh hello"hh" 被扩展为 "hello" "hh" 被扩展为 "hello" 光标前的字符必需和缩写匹配。每种类型还有附加规则: full-id 匹配的前面是一个非关键字字符,或者是在行或插入的开始。例
外: 当缩写仅有一个字符时,如果它前面有一个非关键字字符则不会 被识别,除非那是空格和。 end-id 匹配的前面是一个关键字字符,或者空格或,或者行或插入 的开始。 non-id 匹配的前面是一个空格、或者行或插入的开始。 例如: ({CURSOR}是你输入一个非关键字字符的地方):ab foo four old otters" foo{CURSOR}" 被扩展为 " four old otters" " foobar{CURSOR}" 不被扩展 "barfoo{CURSOR}" 不被扩展:ab #i #include"#i{CURSOR}" 被扩展为 "#include" ">#i{CURSOR}" 不被扩展:ab ;;"test;;" 不被扩展 "test ;;" 被扩展为 "test" 要在插入模式中避免缩写: 输入缩写的一部分,以退出插入模式,再用 'a' 重新进入插入模式并输入剩下的部分。
或者在缩写之后的字符前面输入 CTRL-V。
要在命令行模式中避免缩写: 在缩写的某处输入CTRL-V两次来避免它被替换。不然,一个普通字符前面的CTRL-V通常会被忽略。 缩写进行之后移动光标是可能的::iab if if ()如果 'cpoptions' 里面包含 '<' 标志位时,这不能正常工作。|| 你甚至可以做更复杂的事情。例如,要消灭一个缩写后面输入的空格:func Eatchar(pat)let c = nr2char(getchar(0))return (c =~ a:pat) ? '' : cendfunciabbrif if ()=Eatchar('\s')没有缺省的缩写。 缩写永远不会递归。你可以设置 ":ab f f-o-o" 而不会有任何问题。但是缩写能被映射。{一些版本的 Vi 支持递归缩写,
这毫无道理}'paste' 选项打开时,缩写被禁止。 ** ** 和映射一样,缩写可以被局部于一个缓冲区之内。这经常用于 || 文 件。一个 C 插件文件的例子::abb** ** :ab[breviate] 列出所有的缩写。第一栏中的字符表示该缩写作 用的模式: 'i' 指插入模式,'c' 指命令行模式,'!' 指两种模式都有。 这和映射的相同,参看 || 。 ** 如果 'verbose' 非零,缩写列出的同时显示它最近定义的位置。例如:FF for (i = 0; i < ; ++i):verbose abbreviate! teh theLast set from /home/abcd/vim/abbr.vim|| 说明详情。 :ab[breviate]{lhs}列出以{lhs}开头的缩写 :ab[breviate] []{lhs}{rhs}增加一个从{lhs}到{rhs}的缩写。如果{lhs}已经存在 则它会被替换成新的{rhs}。{rhs}可包含空格。 || 说明可选的参数。 ** ** :una[bbreviate]{lhs}从列表中删除{lhs}的缩写。如果找不到,删 除{rhs}匹配 这里的{lhs}参数的缩写。这是为了方便你删除扩展 后的缩写。要避免扩展,
插入CTRL-V(记住输入两次)。 ** ** :norea[bbrev] [] [lhs] [rhs] 与 ":ab" 一样,但{rhs}不进行重映射。{Vi 无此功能}** ** :ca[bbrev] [] [lhs] [rhs] 与 ":ab" 一样,但仅在命令行模式中使用。{Vi 无此功能}*:cuna* *:cunabbrev* :cuna[bbrev]{lhs}与 ":una" 一样,但仅在命令行模式中
使用。{Vi 无此功能}** ** :cnorea[bbrev] [] [lhs] [rhs] 与 ":ab" 一样,但仅在命令行模式中使用
并且{rhs}不进行重映射。{Vi 中无此功能}** ** :ia[bbrev] [] [lhs] [rhs] 与 ":ab" 一样,但仅在插入模式中使用。
{Vi 无此功能}** ** :iuna[bbrev]{lhs}与 ":una" 一样,但仅在插入模式中使用。
{Vi 无此功能}** ** :inorea[bbrev] [] [lhs] [rhs] 与 ":ab" 一样,但仅在插入模式中使用并且{rhs}不进行重映射。{Vi 无此功能}** ** :abc[lear] 删除所有的缩写。{Vi 无此功能}** ** :iabc[lear] 为插入模式删除所有的缩写。{Vi 无此功能}** ** :cabc[lear] 为命令行模式删除所有的缩写。{Vi 无此功能}** 在一个缩写的{rhs}中使用特殊字符是可能的。CTRL-V可以用来避免多数不可显示字符的特殊含义。需要输入多少个CTRL-V取决于你如何输入缩写。此处讨论同样适用于映射。这里使用一个例子说明。 假设你需要把 "esc" 缩写为输入一个字符。当你在 Vim 中输入 ":ab" 命令,你必需这样输入: (这里 ^V 是一个CTRL-V并且 ^[ is) 你输入: ab esc ^V^V^V^V^V^[ 所有的键盘输入都经过 ^V 引用解释,所以第一个,第三个,和第五个 ^V 字符只是为了把第二个、第四个 ^V 和 ^[ 输入到命令行里。 你看到: ab esc ^V^V^[ 命令行里在 ^[ 之前包含两个实际的 ^V。如果你采用这种方法,这是该行在你的 .exrc 文件应该出现的样子。第一个 ^V 作为引用第二个 ^V 的字符: 这是因为 :ab 命令使用 ^V 作为它自己的引用字符,以便你能在缩写中包含被引用的空白字符或 | 字符。:ab 命令对 ^[ 字符并不做特殊的事情,所以它不需要被引用。(尽管引用也没有害处;因而输入 7 个 [8 个不行!] ^V 也会工作。) 被保存为: esc ^V^[ 解析后,该缩写的简短形式 ("esc") 和扩展形式 (两字符 "^V^[") 被保存在缩写表中。如果输入不带参数的 :ab 命令,这是该缩写被显示的形式。 然后当用户输入单词 "esc" 而扩展该缩写时,扩展形式服从和一般键盘输入同样形式的 ^V 解释。所以 ^V 保护 ^[ 字符不被解释为 "退出插入模式" 的字符,而把 ^[ 插入到文本里。 扩展为: ^[ [Steve Kirkendall 提供示例]
参考资料:
1. VIM 参考手册 **
3. Ericzhao vim多文档编辑
4.VIM 参考手册 **