*40.1* 键映射

来源:百度文库 编辑:神马文学网 时间:2024/04/30 19:15:52

USR_40

*usr_40.txt*    For Vim version 7.3.  最近更新: 2006年7月VIM USER MANUAL - by Bram Moolenaar译者: lang2 http://vimcdoc.sf.net创建新的命令Vim 是一个可扩展的编辑器。你可以把一系列你常用的命令组合成一个新的命令。或者重新定义一个现存的命令。各种命令的自动执行可以通过自动命令实现。|40.1|  键映射                     > map  GoDate::read !datekJ  :imap  /*****|40.2|  定义命令行命令|40.3|  自动命令下一章: |usr_41.txt|  编写 Vim 脚本前一章: |usr_32.txt|  撤销树目录: |usr_toc.txt|

*40.1* 键映射

简单的映射已经在 |05.3| 介绍过了。基本的概念是将一系列的键输入转换成为另外一个键输入序列。这是一个很简单,但是很有效的机制。最简单的形式是将一个键输入序列映射到一个键上。由于那些除了 外的功能键都没有预先定义的功能,选择它们作为映射对象是很有效的。例如: :map GoDate: :read !datekJ这显示了如何使用三种不同的运行模式。在用 "G" 移动到最后一行后,"o" 命令开始一个新行并开始插入模式。然后文本 "Date: " 被输入并用 离开插入模式。注意<> 内使用的特殊键。这叫尖括号记法。你要分别地输入这些字符,而不是键入要表示的键本身。这使得映射更具可读性,而且你也可以方便地拷贝,粘贴文本。":" 使得 Vim 回到命令行。":read !date" 命令读取 "date" 命令的输出并添加到当前行之下。 是用来执行该命令的。到此为止,文本看起来像: Date: Fri Jun 15 12:54:34 CEST 2001 然后 "kJ" 将光标上移并将两行连接起来。参阅 |map-which-keys| 可以帮助你决定应该使用哪些键来作映射。映 射 与 运 行 模 式":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。要清除所有的映射,使用 |:mapclear| 命令。现在你应该可以猜到各种模式下的变体了吧。要当心使用这个命令,它不可能被撤销。特 殊 字 符在 ":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", 而且空格字符也会被插入。另 外 ...