Vimscript 精確映射

2018-02-24 16:02 更新

準(zhǔn)備好,下面的內(nèi)容會比較難以理解。

目前為止,我們已經(jīng)使用mapnmap、vmap以及imap創(chuàng)建了實用的按鍵映射。 他們很方便,但是有個缺點。運行下面的命令:

:nmap - dd
:nmap \ -

試試按下\(在normal模式)。有什么現(xiàn)象?

當(dāng)你按下\時,Vim會解釋其為-。但是我們又映射了-!Vim會繼續(xù)解析-dd, 即它會刪除整行。

你使用那些命令創(chuàng)建的映射可能會被Vim解釋成?其它?的映射。乍一聽這像是一個優(yōu)點, 但實際上這很變態(tài)。解釋原因之前,我們先用如下命令刪除那些映射:

:nunmap -
:nunmap \

遞歸

運行命令:

:nmap dd O<esc>jddk

上面的命令看上去像是要映射dd為:

  • 在當(dāng)前行之前添加新行
  • 退出insert模式
  • 向下移動一行
  • 刪除當(dāng)前行
  • 向上移動到新加的行

貌似這個映射的作用是“清除當(dāng)前行”。但你可以試試。

當(dāng)你按下dd后,Vim就不動了。按下<c-c>才可以繼續(xù),但是你的文件中會多出許多 空行!想想發(fā)生了什么?

這個映射實際上是?遞歸?的!當(dāng)你按下dd后,Vim解釋為:

  • dd存在映射,執(zhí)行映射的內(nèi)容。
    • 新建一行。
    • 退出insert模式。
    • 向下移動一行。
    • dd存在映射,執(zhí)行映射的內(nèi)容。
      • 新建一行。
      • 退出insert模式。
      • 向下移動一行。
      • dd存在映射,執(zhí)行映射的內(nèi)容。然后一直這樣。

這個映射永遠(yuǎn)不會結(jié)束!刪除這個可怕的映射再繼續(xù):

:nunmap dd

負(fù)面影響

*map系列命令的一個缺點就是存在遞歸的危險。另外一個是如果你安裝一個插件,插件 映射了同一個按鍵為不同的行為,兩者沖突,有一個映射就無效了。

當(dāng)安裝一個新的插件時,可能你不會使用或記住每一個其創(chuàng)建的映射。即使你記住了,你還得 回看下你的~/.vimrc文件以確保你自定義的映射與插件創(chuàng)建的沒有沖突。

這導(dǎo)致插件安裝變得乏味,易于出錯??隙ㄓ袀€解決辦法。

非遞歸映射

Vim提供另一組映射命令,這些命令創(chuàng)建的映射在運行時?不會?進(jìn)行遞歸。運行命令:

:nmap x dd
:nnoremap \ x

按下\看看有什么現(xiàn)象。

當(dāng)你按下\時,Vim忽略了x的映射,僅按照x的默認(rèn)操作執(zhí)行。即刪除當(dāng)前光標(biāo)下的字符 而不是刪除整行。

每一個*map系列的命令都有個對應(yīng)的*noremap命令,包括:noremap/nnoremap、?vnoremapinoremap。這些命令將不遞歸解釋映射的內(nèi)容。

該何時使用這些非遞歸的映射命令呢?

答案是:?任何時候?。

是的,沒開玩笑,?任何時候?。

在安裝插件或添加新的自定義映射時使用*map系列命令純屬是給自己??麻煩。 多敲幾個字符以確保這個問題不會發(fā)生,救自己于火海。

練習(xí)

將之前章節(jié)中添加到~/.vimrc文件中的映射命令全部換成非遞歸版本。

讀幫助文檔:help unmap。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號