Vimscript Normal命令

2018-02-24 16:02 更新

目前為止我們已經(jīng)介紹了幾個最為常用的Vimscript命令,但都跟日常中在normal模式下處理文本的方式無關(guān)。 有沒有一種辦法能把我們的腳本跟日常的文本編輯命令結(jié)合起來呢?

答案顯然是肯定的。之前我們已經(jīng)見過normal命令,是時候更詳細(xì)地介紹它了。 執(zhí)行下面的命令:

:normal G

Vim將把你的光標(biāo)移到當(dāng)前文件的最后一行,就像是在normal模式里按下G?,F(xiàn)在執(zhí)行下面命令:

:normal ggdd

Vim將移動到文件的第一行(gg)并刪除它(dd)。

normal命令簡單地接受一串鍵值并當(dāng)作是在normal模式下輸入的。就是那么簡單!

避免映射

執(zhí)行下面的命令來映射G鍵到別的東西:

:nnoremap G dd

現(xiàn)在在normal模式按下G將刪除一整行。試試這個命令:

:normal G

Vim將刪除當(dāng)前行。normal命令將顧及當(dāng)前的所有映射。

這意味著我們需要給normal提供類似于nnoremap之于nmap的版本, 否則我們沒法使用它——考慮到我們猜測不了用戶的映射方式。

幸好Vim真的有這樣的命令叫normal!。執(zhí)行這個命令:

:normal! G

這次Vim將移動光標(biāo)到文件底部,即使G已經(jīng)被映射了。

在寫Vim腳本時,你應(yīng)該_總是_使用normal!,_永不_使用normal。不要信任用戶在~/.vimrc中的映射。

特殊字符

如果你使用normal!一段時間了,就很可能注意到一個問題。試試下面的命令:

:normal! /foo<cr>

第一眼看上去它應(yīng)該會開始搜索foo,但你將看到它不會正常工作。 問題在于normal!不會解析像<cr>那樣的特殊字符序列。

于是,Vim認(rèn)為你想要搜索字符串序列"foo",沒有意識到你甚至按下了回車來進(jìn)行搜索! (譯注:原文為you even pressed return to perform the search! 按后文的意思應(yīng)該是沒有按下return,待問作者) 我們將在下一章討論如何應(yīng)對這個問題。

練習(xí)

閱讀:help normal。在最后部分,你將獲得關(guān)于下一章主題的提示。

附加題

如果你還沒準(zhǔn)備好面對挑戰(zhàn),跳過這一節(jié)。如果你夠膽,祝你好運(yùn)!

重溫:help normal關(guān)于undo的部分。嘗試設(shè)計(jì)一個刪除兩行卻能單獨(dú)撤銷每次刪除的映射。 建議從nnoremap <leader>d dddd開始吧。

這次你并不真的需要normal!(nnoremap就夠了), 但是它揭示了一點(diǎn):有時閱讀一個Vim命令的文檔可以激發(fā)關(guān)于別的內(nèi)容的奇思妙想。

如果你未嘗使用過helpgrep命令,那就是時候用上它了。閱讀:help helpgrep。 留心關(guān)于怎樣在匹配內(nèi)容中瀏覽的部分。

暫時先別糾結(jié)模式(patterns),我們很快就要談到它們。 現(xiàn)在只需了解你可以用類似foo.*bar來查找文檔中包括該正則模式的行。

不幸的是,helpgrep會不時給你帶來挫折感,因?yàn)闉榱苏业侥承┰~,你需要懂得去搜索某些詞。 我會幫你省下些無用功,這次你得查找到一種手工修改Vim的撤銷序列的方法, 這樣你映射的兩個刪除才能獨(dú)立地撤銷。

在以后你要靈活變通(pragmatic)。有時在你迷惘徘徊的時候,Google一下,你就知道。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號