W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
目前為止我們已經(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)對這個問題。
閱讀: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一下,你就知道。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: