Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1337405
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: LINUX

2011-08-26 17:41:34

* *  键映射

简单的映射已经在 | | 介绍过了。基本的概念是将一系列的键输入转换成为另外一个
键输入序列。这是一个很简单,但是很有效的机制。
  
最简单的形式是将一个键输入序列映射到一个键上。由于那些除了 外的功能键
都没有预先定义的功能,选择它们作为映射对象是很有效的。例如:

        :map GoDate: :read !datekJ
这显示了如何使用三种不同的运行模式。在用 "G" 移动到最后一行后,"o" 命令开始一
个新行并开始插入模式。然后文本 "Date: " 被输入并用 离开插入模式。
  
注意在 <> 内使用的特殊键。这叫尖括号记法。你要分别地输入这些字符,而不是键
入要表示的键本身。这使得映射更具可读性,而且你也可以方便地拷贝,粘贴文本。
   ":"
使得 Vim 回到命令行。":read !date" 命令读取 "date" 命令的输出并添加到当
前行之下。 是用来执行该命令的。
  
到此为止,文本看起来像:
        Date: 
        Fri Jun 15 12:54:34 CEST 2001
然后 "kJ" 将光标上移并将两行连接起来。
  
参阅 | | 可以帮助你决定应该使用哪些键来作映射。


映 射 与 运 行 模 式
":map"
命令定义普通模式的键映射。你也可以为其它运行模式定义映射。例如,":imap"
用来定义插入模式的映射。你可以用它来定义一个插入日期的映射:

        :imap Date: :read !datekJ
看起来很象前面为普通模式定义的 映射。只是开始的地方有所不同。普通模式下的
映射依然有效。这样你就可以在各种模式下为同一映射键定义不同的映射。
  
应该注意的是,虽然这个映射以插入模式开始,但它却以普通模式结束。如果你希望
继续插入模式,可以在最后加上 "a"

下面是一个映射命令及其生效模式的总览:

        :map           
普通,可视模式及操作符等待模式
        :vmap          
可视模式
        :nmap          
普通模式
        :omap          
操作符等待模式
        :map!          
插入和命令行模式
        :imap          
插入模式
        :cmap          
命令行模式

操作符等待模式是当你键入一个操作符 ( 比如 "d" "y") 之后,Vim 期待你键入一个
动作命令或者文本对象时的状态。比如,当你键入命令 "dw" , 那个 "w" 就是在操作符
等待模式下键入的。

假定你想定义映射 使得命令 d 删除一个 C 程序块 ({} 包括的文本) 。类似的
y
会将程序块拷贝到匿名的寄存器。因此,你所要做的就是定义 来选择当前的
语法块。你可以用下面的命令做到:

        :omap a{
这使得 在操作符等待模式下选择一个块,就像是你键入了 "a{" 一样。这个映射在
你不容易键入 { 时比较有用。


映 射 列 表

要查看当前定义的映射,使用不带参数的 ":map" 命令。或者其它运行模式的变体。输出
应该类似于:

           _g             :call MyGrep(1)
        v            :s/^/> /:noh``
        n            :.,$s/^/> /:noh``
                 
                  


第一列显示该映射有效的运行模式。"n" 表示普通模式,"i" 表示插入模式,等等。空白
表示用 ":map" 命令定义的映射,也就是对普通和可视模式有效。
  
列出映射的一个比较实用的目的是检查 <> 表示的特殊键是否被识别了 ( 仅当支持多
色彩是有效) 。例如,当 被用彩色显示时,它表示转义字符。否则,只是 5 个不
同的字符。


重 映 射

映射的结果会检查其中包括的其他映射。例如,上面对 的映射可以减短为:

        :map G
        :imap
        :map   oDate: :read !datekJ
在普通模式下 被映射为:行进至最后一行,然后输入 ;在插入模式下先键入
后也输入 。接下来 也被映射,执行真正的工作。

假设你几乎不使用 Ex 模式,并想用 "Q" 命令来排版文本 ( 就像旧版本的 Vim 那样)
下面的映射就能做到:

        :map Q gq
但是,你总有需要用到 Ex 模式的时候。我们来将 "gQ" 映射为 Q ,这样你仍然可以进入
Ex
模式:

        :map gQ Q
这样一来当你键入 "gQ" 时它被映射为 "Q" 。到现在为止一切顺利。但由于 "Q" 被映射
"gq" , 输入的 "gQ" 被解释成为 "gq" , 你根本就没进入 Ex 模式。
  
要避免键被再次映射,使用 ":noremap" 命令:

        :noremap gQ Q
现在 Vim 就知道了对 "Q" 不需要检查与之相关的映射。对于每个模式都有一个类似的命
:

        :noremap       
普通,可视和操作符等待模式
        :vnoremap      
可视模式
         :nnoremap      
普通模式
        :onoremap      
操作符等待模式
        :noremap!      
插入和命令行模式
        :inoremap      
插入模式
        :cnoremap      
命令行模式


递 归 映 射

当一个映射调用它本身的时候,会无限制的运行下去。这可以被用来无限次重复一个操
作。
  
例如,你有一组文件,每个的第一行都包括一个版本号。你用 "vim *.txt" 来编辑它
们。你现在正在编辑第一个文件。定义下面的映射:

        :map ,, :s/5.1/5.2/:wnext,,
现在当你键入 ",," 时,上面的映射被触发。它把第一行的 "5.1" 替换为 "5.2" 。接着
执行 ":wnext" 来写入文件并开始编辑下一个。映射以 ",," 结束。这又触发了同一个映
射,再次执行替换操作,依此类推。
  
这个映射会一直进行下去,直至遇到错误为止。在这里可能是查找命令无法匹配到
"5.1"
。你可以自行插入 "5.1" 然后再次键入 ",," 。或者 ":wnext" 因为遇到最后一个
文件而失败。
  
当映射在中途遇到错误时,映射的剩余部分会被放弃。你可用 CTRL-C 中断映射。(
MS-Windows
上用 CTRL-Break)


删 除 映 射

要删除一个映射,使用 ":unmap" 命令。同样,删除映射的命令也和运行模式相关:

        :unmap         
普通,可视和操作符等待模式
        :vunmap        
可视模式
        :nunmap        
普通模式
        :ounmap        
操作符等待模式
        :unmap!        
插入和命令行模式
        :iunmap        
插入模式
        :cunmap        
命令行模式

这里有个小技巧可以定义一个对普通模式和操作符等待模式有效而对可视模式无效的映
射:先对三个模式都定义映射,然后将可视模式的那个删除:

        :map /--->
        :vunmap
注意那 5 个字符 "" 表示一个键组合 CTRL-A

要清除所有的映射,使用 | | 命令。现在你应该可以猜到各种模式下的变体了
吧。要当心使用这个命令,它不可能被撤销。


特 殊 字 符

":map" 命令后面可以追加另一个命令。需要用 | 字符来将两个命令分开。这也就意
味着一个映射中不能直接使用该字符。需要时,可以用 ( 五个字符) 。例如:

         :map :write !checkin %
":unmap"
命令有同样的问题,而且你得留意后缀的空白字符。下面两个命令是不同的:

        :unmap a | unmap b
        :unmap a| unmap b
第一个命令试图删除映射 "a " ,后面带有一个空格。

当要在一个映射内使用空格时,应该用 ( 七个字符):

        :map W
这使得空格键移动到下一个空白字符分割的单词。

在一个映射后不能直接加注释,因为 " 字符也被当作是映射的一部分。你可以用 |"
过这一限制。这实际上是开始一个新的空命令。例如:

        :map W|     " Use spacebar to move forward a word

映 射 与 缩 写

缩写和插入模式的映射很象。对参数的处理它们是一样的。它们主要的不同在于触发的方
式。缩写是由单词之后的非单词字符触发的。而映射由其最后一个字符触发。
  
另一个区别是你键入的缩写的字符会在你键入的同时被插入到文本内。当缩写被触发
时,这些字符会被删除并替换成缩写所对应的字符。当你键入一个映射时,直到你完成所
有的映射键而映射被触发时,映射所对应的内容才会被插入。如果你置位 'showcmd'
项,键入的字符会显示在 Vim 窗口的最后一行。
  
有一个例外是当映射有歧义的时候。假定你有两个映射:

        :imap aa foo
        :imap aaa bar
现在,当你键入 "aa" 时,Vim 不知道是否要使用第一个映射。它会等待另一个键输入。
如果是 "a" ,第二个映射被执行,结果是 "bar" 。如果是其它字符,例如空格,第一个映
射被执行,结果是 "foo" , 而且空格字符也会被插入。


另 外 ...

阅读(1218) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~