關(guān)于vim能快速編輯文本的能力鹏往,我們見識(shí)到了 operator + motion
,見識(shí)到了.
范式和宏蔚携。甚至可以使用命令來加快文本編輯傻粘。在后面我們又介紹了快捷鍵綁定來快速執(zhí)行我們想要的操作。今天我們再來介紹一個(gè)新的能加快我們編輯文本速度的東西——Abbreviations
縮寫簡介
Abbreviations
翻譯成中文的意思大概是縮寫抬纸。但是僅僅以縮寫來描述這個(gè)特性咙俩,似乎是不夠的,但是也找不到準(zhǔn)確的中文來描述,暫時(shí)就采用這個(gè)名稱吧湿故。它的這個(gè)特性允許我們將輸入的一段內(nèi)容自動(dòng)更新為新的內(nèi)容
我們先來體驗(yàn)一下它的基本用法阿趁。
在命令中輸入 :iabbrev mian main
我們輸入 mian(
后它會(huì)自動(dòng)將內(nèi)容替換為 main(
。這樣即使我們手誤將 main
寫成了 mian
坛猪,vim能自動(dòng)幫我們更新脖阵。再也不用怕編輯器報(bào)找不到 main
函數(shù)了
我們發(fā)現(xiàn)了它的第一個(gè)用途——糾正筆誤。但是基于這一特性砚哆,我們還可以使用幾個(gè)簡單的字符來快速展開成常用的長文本独撇。例如
:iabbrev pcr Copyright 2022 Masimaro, all rights reserved
通過輸入 pcr(program copy right)
來快速產(chǎn)生一條程序的版權(quán)信息。
又或者在 python
使用 nmain
展開成 if name== "__main__":
躁锁。快速寫下測試語句卵史。
我們發(fā)現(xiàn) iabbrev
是 i+ abbrev
合成的一條命令战转。看到這相信各位小伙伴應(yīng)該明白了以躯。這個(gè)命令是作用于插入模式下槐秧。該特性還可以作用于 命令模式和替換模式。但是這里就不對它做深入的介紹了忧设。有興趣的小伙伴可以查看vim手冊來了解刁标。
對比鍵盤映射
我們可以使用快捷鍵映射來達(dá)到同樣的效果,例如我們可以定義 :inoremap mian <esc>viwdimain
同樣可以達(dá)到更正 mian
為 main
的效果
但是我們發(fā)現(xiàn)這有幾個(gè)弊端址晕,第一因?yàn)槲覀兌x了一個(gè) mian
的關(guān)鍵字膀懈,這就需要手速要夠快了,在短時(shí)間內(nèi)輸入完成 mian
谨垃。第二我們針對只輸入mian
確實(shí)能達(dá)到更正的效果启搂,但是如果我連著其他的語句一起輸入就不一定有這個(gè)效果了硼控,例如我們想輸入 miantest
但是它會(huì)給我們替換成 maintest
這就有點(diǎn)得不償失了。在這種情況下胳赌,abbreviations
可以正常工作牢撼。而且我們發(fā)現(xiàn)相比于使用映射,abbreviations
顯的更為簡潔疑苫,也更加符合邏輯熏版。
keywords characters
我們發(fā)現(xiàn)在使用 abbreviations
這一特性的時(shí)候,只有在輸入空格或者回車的時(shí)候它才會(huì)啟用自動(dòng)更新捍掺,但是輸入字母的時(shí)候卻不會(huì)纳决。如何定義輸入何種字符的時(shí)候它才會(huì)啟用自動(dòng)更新呢?
abbreviations
這一特性是在我們輸入 non-keyword character
的時(shí)候會(huì)檢查上一個(gè) non-keyword character
到這個(gè)之間的單詞是否符合之前定義的替換規(guī)則乡小,如果符合將會(huì)發(fā)生替換行為阔加,否則不會(huì)發(fā)生。只要定義了 non-keyword character
就可以定義它發(fā)生更新的時(shí)機(jī)满钟。那么我們該如何定義 non-keyword character
字符呢胜榔?
只要不在 iskeyword
中的字符都算是 non-keyword character
。我們執(zhí)行 set iskeyword?
可以看到 iskeyword
的定義如下:
@,48-57,_,192-255
看起來很復(fù)雜是不是湃番?首先 @
代表字母字符夭织,48-57是字符0到字符9的ascii 編碼,_
單純的代表下劃線吠撮,192-255代表ascii碼中一些特殊字符尊惰。你只需要記住它包含一切字母,數(shù)字泥兰,_ 以及一些特殊字符弄屡。或者更簡單的說鞋诗,格式控制字符(像空格膀捷、制表符、回車)都會(huì)觸發(fā)這一行為削彬。如果你想修改 keyword
全庸。可以在vim手冊中詳細(xì)閱讀關(guān)于 iskeyword
部分的說明融痛。這里就不再過多介紹壶笼,我認(rèn)為當(dāng)前定義更符合編碼時(shí)的直覺。
本地緩沖縮寫
結(jié)合上一章學(xué)習(xí)的本地設(shè)置雁刷,我們也可以設(shè)置本地緩沖的縮寫覆劈,例如
:iabbre <buffer> mian main
我們發(fā)現(xiàn)它只在當(dāng)前緩沖區(qū)中啟用了。
到現(xiàn)在我們似乎可以結(jié)合縮寫的這個(gè)特性完成代碼片段的功能呢。但是別著急墩崩,要得到這個(gè)功能氓英,還得接著往下學(xué)習(xí)。
如何形成記憶
跟快捷鍵類似鹦筹,我們一時(shí)興起铝阐,根據(jù)自己的習(xí)慣定義了一堆縮寫,例如 定義 fnc
為 function
铐拐,定義 ret
為 return
結(jié)果自己之前養(yǎng)成了把這些關(guān)鍵字都輸全的習(xí)慣徘键。后面怎么也改不過來,這些都白定義了遍蟋,該如何解決這個(gè)問題呢吹害?
與我們當(dāng)初禁用快捷鍵類似,我們也可以禁用某些內(nèi)容虚青,只是iabbrev
并沒有提供類似 <nop>
的指令已達(dá)到禁用的目的它呀,但是我們我們可以將對應(yīng)的字符串映射成為某些無效的字符。例如我們使用如下兩個(gè)命令
:iabbrev return <space>
:iabbrev ret return
為了養(yǎng)成習(xí)慣我們將 return
映射為空格棒厘,一旦我們習(xí)慣輸入 return
就會(huì)意識(shí)到我們已經(jīng)用簡寫 ret
代替了纵穿。當(dāng)我們養(yǎng)成肌肉記憶之后這條映射的作用也就顯得可有可無了。