W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
準(zhǔn)備好,下面的內(nèi)容會(huì)比較難以理解。
目前為止,我們已經(jīng)使用map
、nmap
、vmap
以及imap
創(chuàng)建了實(shí)用的按鍵映射。 他們很方便,但是有個(gè)缺點(diǎn)。運(yùn)行下面的命令:
:nmap - dd
:nmap \ -
試試按下\
(在normal模式)。有什么現(xiàn)象?
當(dāng)你按下\
時(shí),Vim會(huì)解釋其為-
。但是我們又映射了-
!Vim會(huì)繼續(xù)解析-
為dd
, 即它會(huì)刪除整行。
你使用那些命令創(chuàng)建的映射可能會(huì)被Vim解釋成?其它?的映射。乍一聽(tīng)這像是一個(gè)優(yōu)點(diǎn), 但實(shí)際上這很變態(tài)。解釋原因之前,我們先用如下命令刪除那些映射:
:nunmap -
:nunmap \
運(yùn)行命令:
:nmap dd O<esc>jddk
上面的命令看上去像是要映射dd
為:
貌似這個(gè)映射的作用是“清除當(dāng)前行”。但你可以試試。
當(dāng)你按下dd
后,Vim就不動(dòng)了。按下<c-c>
才可以繼續(xù),但是你的文件中會(huì)多出許多 空行!想想發(fā)生了什么?
這個(gè)映射實(shí)際上是?遞歸?的!當(dāng)你按下dd
后,Vim解釋為:
dd
存在映射,執(zhí)行映射的內(nèi)容。
dd
存在映射,執(zhí)行映射的內(nèi)容。
dd
存在映射,執(zhí)行映射的內(nèi)容。然后一直這樣。這個(gè)映射永遠(yuǎn)不會(huì)結(jié)束!刪除這個(gè)可怕的映射再繼續(xù):
:nunmap dd
*map
系列命令的一個(gè)缺點(diǎn)就是存在遞歸的危險(xiǎn)。另外一個(gè)是如果你安裝一個(gè)插件,插件 映射了同一個(gè)按鍵為不同的行為,兩者沖突,有一個(gè)映射就無(wú)效了。
當(dāng)安裝一個(gè)新的插件時(shí),可能你不會(huì)使用或記住每一個(gè)其創(chuàng)建的映射。即使你記住了,你還得 回看下你的~/.vimrc
文件以確保你自定義的映射與插件創(chuàng)建的沒(méi)有沖突。
這導(dǎo)致插件安裝變得乏味,易于出錯(cuò)??隙ㄓ袀€(gè)解決辦法。
Vim提供另一組映射命令,這些命令創(chuàng)建的映射在運(yùn)行時(shí)?不會(huì)?進(jìn)行遞歸。運(yùn)行命令:
:nmap x dd
:nnoremap \ x
按下\
看看有什么現(xiàn)象。
當(dāng)你按下\
時(shí),Vim忽略了x
的映射,僅按照x
的默認(rèn)操作執(zhí)行。即刪除當(dāng)前光標(biāo)下的字符 而不是刪除整行。
每一個(gè)*map
系列的命令都有個(gè)對(duì)應(yīng)的*noremap
命令,包括:noremap
/nnoremap
、?vnoremap
和inoremap
。這些命令將不遞歸解釋映射的內(nèi)容。
該何時(shí)使用這些非遞歸的映射命令呢?
答案是:?任何時(shí)候?。
是的,沒(méi)開(kāi)玩笑,?任何時(shí)候?。
在安裝插件或添加新的自定義映射時(shí)使用*map
系列命令純屬是給自己?找?麻煩。 多敲幾個(gè)字符以確保這個(gè)問(wèn)題不會(huì)發(fā)生,救自己于火海。
將之前章節(jié)中添加到~/.vimrc
文件中的映射命令全部換成非遞歸版本。
讀幫助文檔:help unmap
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: