vim-map

vim-map

 

软件版本:
  ubuntu10.04
  Linux version 2.6.32-42-generic
  VIM - Vi IMproved 7.2
目录:

  1. 简介
  2. 映射与运行模式的关系
  3. 例子
  4. 其他

1. 简介

  如果想让 vim 成为你手中的利器,vim 的 map 功能就不得不学,它用于键映射、缩写和自定义命令。由于 map 命令有很多,不同的命令作用与不同的模式之下,文章主要是想分析一下各个命令与模式之间的关系。

2. 映射与运行模式的关系

  映射是否起作用的一个关键因数是当前 vim 处于哪种模式之下。map 与六种 vim 模式相关(vim 有多少种工作模式请参考 :help vim-modes):

  - (o) 普通模式: 输入命令时。
  - (x) 可视模式: 可视区域高亮并输入命令时。
  - (s) 选择模式: 类似于可视模式,但键入的字符对选择区进行替换。
  - (o) 操作符等待模式: 操作符等待中 ("d","y","c" 等等之后)。
  - (i) 插入模式: 也用于替换模式。
  - (c) 命令行模式: 输入 ":" 或 "/" 命令时。

  了解到 map 是与 vim 的工作模式相关之后,这时候再看一下支持嵌套和递归的 map 命令命名有什么特别之处(:help map):

  命令           左边         右边             模式                          跳跃点
  :map         {lhs}     {rhs}         |mapmode-nvo|      *:map*
  :nm[ap]    {lhs}      {rhs}        |mapmode-n|           *:nm* *:nmap*
  :vm[ap]    {lhs}      {rhs}        |mapmode-v|           *:vm* *:vmap*
  :xm[ap]    {lhs}      {rhs}        |mapmode-x|           *:xm* *:xmap*
  :smap       {lhs}      {rhs}        |mapmode-s|           *:smap*
  :om[ap]    {lhs}      {rhs}        |mapmode-o|           *:om* *:omap*
  :map!       {lhs}      {rhs}        |mapmode-ic|          *:map!*
  :im[ap]     {lhs}      {rhs}        |mapmode-i|            *:im* *:imap*
  :lm[ap]     {lhs}      {rhs}        |mapmode-l|            *:lm* *:lmap*
  :cm[ap]    {lhs}      {rhs}        |mapmode-c|           *:cm* *:cmap*

  不难发现 map 命令的命名与它所支持的 vim 模式相关。下面再列出具体的关系:

  字 符      模 式 
  <Space>  普通、可视、选择和操作符等待
  n      普通
  v      可视和选择
  s      选择
  x      可视
  o      操作符等待
  !      插入和命令行
  i      插入
  l      插入、命令行和 Lang-Arg 模式的 ":lmap" 映射
  c      命令行

  总结,map 命令的首字母表明它作用于何中 vim 模式之下。

3. 例子

  我以一些简单的命令演示一下 map 命令与 vim 模式之间的关系。

  1) 普通模式

  输入一下命令:

:nmap ;y "+y

  这样,我们就可以使用 ;y 替代 "+y 将内容复制到全局缓冲中。但是如果你首先使用<C-V>选中一块数据,然后按 ;y,结果没有将数据复制到全局缓冲中,只能复制到局部缓冲。这是因为 nmap 只在普通模式下起作用。

  2) 可视模式

  输入下面这条命令之后,上面提到的问题就不复存在了。

:xmap :y "+y

  我们再来看一个好玩的。  

  3) 选择模式

  如果你不知道怎么进入选择模式,请参考 :help select 。我觉得一般情况下使用选择模式都是首先进入可视模式,然后键入 <CTRL-G> 进入选择模式。因为当你处在选择模式下,键盘的输入将替换选中区域。

:smap ;y "+y

  看上面的命令与之前的例子大同小异吧。但效果却截然不同。操作过程:

  按 v,进入可是模式,然后左右上下移动选中一片区域;
  按<CTRL-G>进入选择模式;
  按 ;y 之后我们看到:"+y 。

  为什么他没有帮我们实现复制的功能?因为当前处于选择模式,输入的键值将被直接替换选中区域,而我们输入的 ;y 被映射成 "+y 。

  4) <Space>

  <Space> 支持的的模式包括 nvo,其中 v 包括 x 和 s 。所以用 <Space> ,也就是 :map 命令,就足够了,不需要重复键入那么多吃同样的映射命令。

map ;y "+y
map ;p "+p

  用这个命令的另一个好处就是即使在选择模式下,;y 仍然完成复制操作。

  5) 操作等待模式

  有必要说一下什么叫操作等待模式吗?它其实跟普通模式很接近,但是出现在输入操作符之后。例如你在普通模式下输入 y 则会进入操作等待模式一会儿,它在等待 y 的组合键,例如 w 。所以,我们可以输入一下命令做一下认证:

:omap [ w

  当我们在普通模式下输入 y[ 的作用就等同与 yw 。

  6) 插入模式

  加入下面这几条命令,在输入时,如果需要左右移动光标,我们也不需要把右手移动到方向间上面去了。

:imap <C-G>l <Right>
:imap <C-G>h <Left>
:imap <C-G><C-L> <C-Right>
:imap <C-G><C-H> <C-Left>

  在输入模式下按下 <CTRL-G> 再按 l ,光标右移。<C-G> + <C-L> 光标右移一个字,相当于普通模式下的 w 。

  7) 命令模式

  按葫芦画瓢,在命令模式下也可以这样干。

:cmap <C-G>l <Right>
:cmap <C-G>h <Left>
:cmap <C-G><C-L> <C-Right>
:cmap <C-G><C-H> <C-Left>

  8)!

  既然命令模式和插入模式的映射是一样的,就没有必要敲那么多命令了,用 map! 就好了。

:map! <C-G>l <Right>
:map! <C-G>h <Left>
:map! <C-G><C-L> <C-Right>
:map! <C-G><C-H> <C-Left>

4. 其他

  有时间再补。

posted @ 2012-09-12 17:39  Eddy_He  阅读(4266)  评论(0编辑  收藏  举报