Vimscript 模式映射

2018-02-24 16:02 更新

上一章中我們談?wù)摿巳绾卧赩im中映射按鍵。我們使用的命令map在normal模式下工作。 如果閱讀本章之前你自己已經(jīng)折騰了,可能會注意到這個映射在visual模式一樣工作。

你可以使用nmap、vmapimap命令分別指定映射僅在normal、visual、insert模式有效。

執(zhí)行如下命令:

:nmap \ dd

在normal模式下,按下\。Vim會刪除當(dāng)前行。

現(xiàn)在進入Visual模式,再次按下\。什么都不會發(fā)生,因為我們告訴了Vim這個映射僅在normal 模式下工作(同時\的默認行為是什么都不做)。

運行如下命令:

:vmap \ U

進入visual模式并選中一些文字,按下\。Vim將把選中文本轉(zhuǎn)換成大寫格式。

分別在normal模式和visual模式測試\按鍵,注意不同模式下的效應(yīng)。

增強記憶

起初,將同樣的按鍵根據(jù)當(dāng)前模式的不同映射到不同的功能聽起來很可怕。為什么每次按下 那個鍵之前都要停下想想我們現(xiàn)在是在什么模式?那樣是不是更浪費時間?

實踐中我們發(fā)現(xiàn)那真不是個問題。一旦你經(jīng)常使用Vim,你就不會在意你按下的鍵了。 你會想“刪除一行”,而不是“按`dd·”。你的手指和大腦都會記住你的映射,潛意識中你就會 按下那些映射按鍵。

insert模式

現(xiàn)在我們已經(jīng)知道如何在normal模式和visual模式下映射按鍵。現(xiàn)在我們談?wù)刬nsert模式下的 映射方法。運行如下命令:

:imap <c-d> dd

你可能猜想這個命令的作用是在insert模式下通過按鍵Ctrl+d刪除整行。這個映射很實用, 因為你不必每次都要為了刪除某些行而切回到normal模式。

好的我們試一下。它并不如我們想象那般工作,而僅僅是在文件中添加了兩個d字符! 它壓根就沒用。

問題就在于Vim只按我們說的做。這個例子中,我們說:“當(dāng)我按下<c-d>時,相當(dāng)于我 按了兩次d”。而當(dāng)你在insert模式下,按下兩次d的作用就是輸入兩個字符d。

要想讓這個映射按我們的期望執(zhí)行,我們需要更加明確的指令。修改映射并運行如下命令:

:imap <c-d> <esc>dd

<esc>告訴Vim按下ESC按鍵,即退出insert模式。

現(xiàn)在再試試這個映射。它能夠正常工作,但是注意你是如何回到normal模式的。這是因為我們 告訴Vim<c-d>要退出insert模式并刪除一行,但是我們沒有告訴它再回到insert模式。

運行如下命令,修復(fù)映射問題:

:imap <c-d> <esc>ddi

結(jié)尾的i告訴Vim進入insert模式,至此我們的映射才最終完成。

練習(xí)

設(shè)置一個映射,當(dāng)你在insert模式時,可以通過按下<c-u>將當(dāng)前光標所在的單詞轉(zhuǎn)換成 大寫格式。每次我寫一個類似MAX_CONNECTIONS_ALLOWED這樣很長的常量時都能感覺到這個 映射的實用性。因為這樣我就可以以小寫的格式敲寫常量,然后用這個映射將其轉(zhuǎn)成大寫, 不必一直需要按著shift鍵。

將那個映射添加上到你的~/.vimrc文件中。

設(shè)置一個映射,當(dāng)你在?normal?模式時,可以通過按下<c-u>將當(dāng)前光標所在的單詞轉(zhuǎn)換成 大寫格式。這個映射和上面那個有點區(qū)別,因為你必須要進入normal模式,也不需要結(jié)束時 切到insert模式。

將那個映射添加上到你的~/.vimrc文件中。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號