分类: LINUX
2011-08-26 17:41:34
* * 键映射
简单的映射已经在 |
|
介绍过了。基本的概念是将一系列的键输入转换成为另外一个
键输入序列。这是一个很简单,但是很有效的机制。
最简单的形式是将一个键输入序列映射到一个键上。由于那些除了
都没有预先定义的功能,选择它们作为映射对象是很有效的。例如:
:map
个新行并开始插入模式。然后文本 "Date: "
被输入并用
注意在 <>
内使用的特殊键。这叫尖括号记法。你要分别地输入这些字符,而不是键
入要表示的键本身。这使得映射更具可读性,而且你也可以方便地拷贝,粘贴文本。
":"
使得 Vim
回到命令行。":read !date"
命令读取 "date"
命令的输出并添加到当
前行之下。
到此为止,文本看起来像:
Date:
Fri Jun 15 12:54:34 CEST 2001
然后 "kJ"
将光标上移并将两行连接起来。
参阅 |
|
可以帮助你决定应该使用哪些键来作映射。
映 射 与 运 行 模 式
":map"
命令定义普通模式的键映射。你也可以为其它运行模式定义映射。例如,":imap"
用来定义插入模式的映射。你可以用它来定义一个插入日期的映射:
:imap
应该注意的是,虽然这个映射以插入模式开始,但它却以普通模式结束。如果你希望
继续插入模式,可以在最后加上 "a"
。
下面是一个映射命令及其生效模式的总览:
:map
普通,可视模式及操作符等待模式
:vmap
可视模式
:nmap
普通模式
:omap
操作符等待模式
:map!
插入和命令行模式
:imap
插入模式
:cmap
命令行模式
操作符等待模式是当你键入一个操作符 (
比如
"d"
或 "y")
之后,Vim
期待你键入一个
动作命令或者文本对象时的状态。比如,当你键入命令 "dw"
, 那个 "w"
就是在操作符
等待模式下键入的。
假定你想定义映射
y
语法块。你可以用下面的命令做到:
:omap
你不容易键入 {
时比较有用。
映 射 列 表
要查看当前定义的映射,使用不带参数的 ":map"
命令。或者其它运行模式的变体。输出
应该类似于:
_g
:call MyGrep(1)
v
n
表示用 ":map"
命令定义的映射,也就是对普通和可视模式有效。
列出映射的一个比较实用的目的是检查 <>
表示的特殊键是否被识别了 (
仅当支持多
色彩是有效)
。例如,当
同的字符。
重 映 射
映射的结果会检查其中包括的其他映射。例如,上面对
:map
:imap
:map
假设你几乎不使用 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.1"
然后再次键入 ",,"
。或者 ":wnext"
因为遇到最后一个
文件而失败。
当映射在中途遇到错误时,映射的剩余部分会被放弃。你可用 CTRL-C
中断映射。(
在
MS-Windows
上用 CTRL-Break)
。
删 除 映 射
要删除一个映射,使用 ":unmap"
命令。同样,删除映射的命令也和运行模式相关:
:unmap
普通,可视和操作符等待模式
:vunmap
可视模式
:nunmap
普通模式
:ounmap
操作符等待模式
:unmap!
插入和命令行模式
:iunmap
插入模式
:cunmap
命令行模式
这里有个小技巧可以定义一个对普通模式和操作符等待模式有效而对可视模式无效的映
射:先对三个模式都定义映射,然后将可视模式的那个删除:
:map
:vunmap
要清除所有的映射,使用 |
|
命令。现在你应该可以猜到各种模式下的变体了
吧。要当心使用这个命令,它不可能被撤销。
特 殊 字 符
在 ":map"
命令后面可以追加另一个命令。需要用 |
字符来将两个命令分开。这也就意
味着一个映射中不能直接使用该字符。需要时,可以用
:map
":unmap"
:unmap a | unmap b
:unmap a| unmap b
第一个命令试图删除映射 "a "
,后面带有一个空格。
当要在一个映射内使用空格时,应该用
:map
在一个映射后不能直接加注释,因为 "
字符也被当作是映射的一部分。你可以用 |"
绕
过这一限制。这实际上是开始一个新的空命令。例如:
:map
缩写和插入模式的映射很象。对参数的处理它们是一样的。它们主要的不同在于触发的方
式。缩写是由单词之后的非单词字符触发的。而映射由其最后一个字符触发。
另一个区别是你键入的缩写的字符会在你键入的同时被插入到文本内。当缩写被触发
时,这些字符会被删除并替换成缩写所对应的字符。当你键入一个映射时,直到你完成所
有的映射键而映射被触发时,映射所对应的内容才会被插入。如果你置位 'showcmd'
选
项,键入的字符会显示在 Vim
窗口的最后一行。
有一个例外是当映射有歧义的时候。假定你有两个映射:
:imap aa foo
:imap aaa bar
现在,当你键入 "aa"
时,Vim
不知道是否要使用第一个映射。它会等待另一个键输入。
如果是 "a"
,第二个映射被执行,结果是
"bar"
。如果是其它字符,例如空格,第一个映
射被执行,结果是 "foo"
, 而且空格字符也会被插入。
另 外 ...