Chinaunix首页 | 论坛 | 博客
  • 博客访问: 421634
  • 博文数量: 78
  • 博客积分: 1527
  • 博客等级: 上尉
  • 技术积分: 830
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-27 20:57
文章分类

全部博文(78)

文章存档

2011年(1)

2008年(12)

2007年(53)

2006年(12)

我的朋友

分类:

2007-06-14 08:23:53

vim 多文档操作
  这两天一直在用vim进行tex文档修改,需要进行多文档间的切换、字符串替换等操作,因此学习了一些这方面的
内容,总一个总结。
       

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  FF  for (i = 0; i < ; ++i)

                                                ** **
:ab[breviate]           列出所有的缩写。第一栏中的字符表示该缩写作               用的模式:
                        'i' 指插入模式,'c' 指命令行模式,'!'                指两种模式都有。
                           这和映射的相同,参看 || 。

                                                **
如果 'verbose' 非零,缩写列出的同时显示它最近定义的位置。例如:

        :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 参考手册 ** 
阅读(1358) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~