分类:
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) ? '' : c
endfunc
iabbr
if 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 the
Last 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 参考手册 **