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. 其他

  有時間再補。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM