了解一下Idea Vim插件的使用技巧

1. 切換Vim模擬器狀態(tài)
這個(gè)插件允許設(shè)置一個(gè)快捷鍵一鍵開(kāi)啟或關(guān)閉,在切換模式時(shí)會(huì)同時(shí)自動(dòng)切換keymap,十分方便。默認(rèn)鍵位是Ctrl+Alt+V,但這個(gè)鍵位覆蓋了很常用的“抽取局部變量”功能,建議重設(shè),在setting->keymap中查找VIM Emulator即可。
由于開(kāi)啟和關(guān)閉狀態(tài)分別使用兩套keymap,因此兩套都需要設(shè)定。可以把兩套keymap下的都設(shè)為一樣的鍵,也就是用同一個(gè)鍵切換。但個(gè)人建議設(shè)為不同的鍵,這樣能清楚知道當(dāng)前處于那種模式中。并且,如果在開(kāi)啟Vim的插入模式下關(guān)閉Vim模擬器,下次進(jìn)入時(shí)仍然是插入模式,比較混亂(因?yàn)槟汴P(guān)閉模擬器就是為了使用默認(rèn)keymap輸入大段代碼,重新開(kāi)啟Vim模擬器就是為了使用普通模式下的命令)。因此建議把Vim
keymap中的Exit Insert Mode設(shè)為與另一個(gè)keymap的Vim
Emulator相同的鍵(也就是進(jìn)入Vim模擬器的快捷鍵)。例如,我使用的設(shè)定是:
Default keymap -> Vim Emulator : Ctrl+; (用Ctrl+分號(hào)開(kāi)啟Vim模擬器)
Vim keymap -> Vim Emulator : Ctrl+, (用Ctrl+逗號(hào)關(guān)閉Vim模擬器)
Vim keymap -> Vim Emulator : Ctrl+; (用Ctrl+分號(hào)退出插入模式,進(jìn)入普通模式)這樣,在任何時(shí)候只要連按兩下ctrl+分號(hào),就能保證必定在Vim模擬器的普通模式中。
2. ScrollOff 參數(shù)
啟動(dòng)Intellij后在Vim模擬器下輸入命令 :set so=5
可以令屏幕滾動(dòng)時(shí)在光標(biāo)上下方保留5行預(yù)覽代碼(也就是光標(biāo)會(huì)在第5行觸發(fā)向上滾動(dòng),或者在倒數(shù)第5行觸發(fā)向下滾動(dòng))。在代碼窗口比較狹小時(shí)(例如單步跟蹤調(diào)試時(shí))非常方便。可惜僅在Vim模擬器開(kāi)啟時(shí)有效。
3. 行號(hào)定位
普通模式下輸入 行號(hào)G 或 :行號(hào)<回車>
都能快速定位到某一行。區(qū)別在于前者在輸入行號(hào)時(shí)屏幕上沒(méi)有任何提示,后者則在Vim命令輸入框中可以看到輸入過(guò)程。(題外話:Sublime Text
2也是用 :行號(hào) 來(lái)快速定位到某行,應(yīng)該是沿用了Vim的習(xí)慣)
4. 進(jìn)入修改
進(jìn)入插入模式的方式有很多,直接選用合適的方式進(jìn)入插入模式比進(jìn)入后再用箭頭鍵移動(dòng)光標(biāo)要好。常用的有:
o?- 在當(dāng)前行下方插入新行并自動(dòng)縮進(jìn)
O - 在當(dāng)前行上方插入新行并自動(dòng)縮進(jìn) (普通模式下的大寫(xiě)字母命令用 shift+字母鍵 輸入,下同)
i - 在當(dāng)前字符左方開(kāi)始插入字符
a?- 在當(dāng)前字符右方開(kāi)始插入字符
I - 光標(biāo)移動(dòng)到行首并進(jìn)入插入模式
A - 光標(biāo)移動(dòng)到行尾并進(jìn)入插入模式
s - 刪除光標(biāo)所在字符并進(jìn)入插入模式
S - 刪除光標(biāo)所在行并進(jìn)入插入模式
c<范圍> - 刪除光標(biāo)所在位置周圍某個(gè)范圍的文本并進(jìn)入插入模式。關(guān)于范圍請(qǐng)看第5點(diǎn),常用的組合有:caw - 刪除一個(gè)單詞包括它后面的空格并開(kāi)始插入;ciw - 刪除一個(gè)單詞并開(kāi)始插入;ci" - 刪除一個(gè)字符串內(nèi)部文本并開(kāi)始插入;c$ - 從光標(biāo)位置刪除到行尾并開(kāi)始插入;ct字符 - 從光標(biāo)位置刪除本行某個(gè)字符之前(保留該字符)并開(kāi)始插入。等等。
C - 刪除光標(biāo)位置到行尾的內(nèi)容并進(jìn)入插入模式 (相當(dāng)于c$)
r - 修改光標(biāo)所在字符,然后返回普通模式
R - 進(jìn)入覆蓋模式5. 范圍操作?
某些普通模式的動(dòng)作命令后面可以追加一些表示范圍的指令,表示該動(dòng)作將作用在整個(gè)范圍上。這類命令常用的有:
d<范圍> - 刪除一定范圍內(nèi)的文本
c<范圍> - 刪除一定范圍內(nèi)的文本并進(jìn)入插入模式
y<范圍> - 將范圍內(nèi)的文本放入0號(hào)和"號(hào)注冊(cè)欄
v<范圍> - 選擇范圍內(nèi)的文本
=<范圍> - 自動(dòng)縮進(jìn)范圍內(nèi)的文本
gU<范圍> - 將范圍內(nèi)的字符轉(zhuǎn)換為大寫(xiě)
gu<范圍> - 將范圍內(nèi)的字符轉(zhuǎn)換為小寫(xiě)
><范圍> - 將范圍中的內(nèi)容縮進(jìn)一格
<<范圍> - 將范圍中的內(nèi)容取消縮進(jìn)一格常用的范圍指令有:
空格 - 光標(biāo)所在位置字符。(例如 gU空格 - 將光標(biāo)位置字符轉(zhuǎn)為大寫(xiě))
重復(fù)某些動(dòng)作命令 - 光標(biāo)所在行。(例如dd刪除一行,yy復(fù)制一行,cc刪除一行文本并開(kāi)始插入,>> 當(dāng)前行縮進(jìn)一格,==自動(dòng)縮進(jìn)當(dāng)前行)
$ - 從光標(biāo)位置到行尾
^ - 從光標(biāo)位置到行首,不包含縮進(jìn)空白
0?- 從光標(biāo)位置到行首,包含縮進(jìn)空白
gg - 從光標(biāo)位置到文件開(kāi)頭
G - 從光標(biāo)位置到文件結(jié)尾
% - 從光標(biāo)位置到另一邊匹配的括號(hào)
f<字符> - 從光標(biāo)位置到光標(biāo)右邊某個(gè)字符首次出現(xiàn)的位置,包括該字符
F<字符> - 從光標(biāo)位置到光標(biāo)左邊某個(gè)字符首次出現(xiàn)的位置,包括該字符
t<字符> - 從光標(biāo)位置到光標(biāo)右邊某個(gè)字符首次出現(xiàn)的位置,包括該字符
F<字符> - 從光標(biāo)位置到光標(biāo)左邊某個(gè)字符首次出現(xiàn)的位置,包括該字符
/正則表達(dá)式 - 從光標(biāo)位置到下一個(gè)匹配正則表達(dá)式的位置(跨行)
?正則表達(dá)式 - 從光標(biāo)位置到上一個(gè)匹配正則表達(dá)式的位置(跨行)
aw - 一個(gè)單詞加一個(gè)空格 (a可理解為“一個(gè)”,下同)
iw - 一個(gè)單詞 (i可理解為in,下同)
a" - 一個(gè)字符串包括雙引號(hào)
i"?- 一個(gè)字符串內(nèi)部文本
a< - 一組< >包含的文本,包括< >號(hào)本身
同理類推:i<, a[, i[, a(, i(注意:真正vim中的it范圍(一對(duì)xml標(biāo)簽內(nèi)部)在ideaVim中不生效。
用/或?命令查找時(shí),正則表達(dá)式默認(rèn)大小寫(xiě)敏感,如果需要不敏感,可以在正則表達(dá)式開(kāi)始處加上\c標(biāo)志。例如 /\cabc 可以匹配到 ABC。下面提到的:s命令同樣適用。
6. 選擇文本
在Vim中,選擇文本需要進(jìn)入“可視模式”(Visual Mode),這個(gè)名稱比較奇怪,它的來(lái)由據(jù)說(shuō)是因?yàn)樵赩im的前身Vi中,選擇區(qū)域是不可見(jiàn)的。在Vim中選擇區(qū)域會(huì)高亮顯示,因此稱為“可視模式”。
v - 進(jìn)入字符選擇模式, V - 進(jìn)入行選擇模式, Ctrl+v - 進(jìn)入塊選擇模式。
進(jìn)入相應(yīng)模式后移動(dòng)光標(biāo)即可選中文本。過(guò)程中可按o鍵令光標(biāo)在選區(qū)兩端切換。
在塊選擇模式中選中多行,然后按I或A后輸入文本,再退出插入模式,所輸入的文本將自動(dòng)加入到每一行的開(kāi)頭或結(jié)尾。
7. 復(fù)制粘貼
在Vim模式下,復(fù)制粘貼并不直接使用系統(tǒng)的剪貼板,而是使用Vim提供的多個(gè)“寄存器”,每個(gè)寄存器都以一個(gè)字符來(lái)表示。關(guān)于寄存器的詳細(xì)說(shuō)明可以看這里
http://blah.blogsome.com/2006/04/27/vim_tut_register/
(隨便google的一個(gè)網(wǎng)頁(yè)),這里簡(jiǎn)單列一些常用的操作技巧
(注意,vim使用雙引號(hào)"來(lái)作為選擇寄存器的命令,因此下文中的雙引號(hào)均指在普通模式下按雙引號(hào)鍵):
a)用y命令將文本存入寄存器后,如果想在別處替換原有內(nèi)容,可以先用v命令選中原有內(nèi)容,然后用p命令粘貼。但第一次粘貼后,默認(rèn)的寄存器"將被替換為剛剛刪除的內(nèi)容。如果要再次粘貼之前復(fù)制的內(nèi)容,需要使用 "0p 命令組合來(lái)復(fù)制。也可以進(jìn)入插入模式后用 Ctrl+r 0 來(lái)復(fù)制,例如 ciw
b)在Windows下,寄存器 + 和 * 都代表系統(tǒng)剪貼板,可以互換使用,選一個(gè)順手的即可。例如 "+yy 命令組合可將當(dāng)前行復(fù)制到系統(tǒng)剪貼板。ci"
c)
寄存器1至9記錄之前九次的刪除大段文本,每次超過(guò)一行的刪除操作都會(huì)導(dǎo)致這9個(gè)寄存器的內(nèi)容發(fā)生位移,最近刪除的文本會(huì)存入寄存器1。但只有刪除超過(guò)1行時(shí)才會(huì)影響寄存器1至9,行內(nèi)的刪除內(nèi)容則會(huì)被存入寄存器-(減號(hào))。如果用q命令錄制宏時(shí)不涉及跨行刪除,可以在宏中直接使用這9個(gè)寄存器來(lái)暫存文本。(在Vim中,復(fù)制內(nèi)容與錄制宏共享同一套寄存器,因此我習(xí)慣把字母寄存器留給宏使用)
d) 普通模式下小寫(xiě)p把寄存器內(nèi)容復(fù)制到當(dāng)前位置之后,大寫(xiě)P把寄存器內(nèi)容復(fù)制到當(dāng)前位置之前。
e) 使用 :regs 命令可以列出當(dāng)前所有寄存器的內(nèi)容
8.? 一些插入模式下的常用快捷鍵
Ctrl+h - 刪除光標(biāo)左邊字符
Ctrl+w - 刪除光標(biāo)左邊的單詞
Ctrl+y - 復(fù)制上方的一個(gè)字符
Ctrl+e - 復(fù)制下方的一個(gè)字符
Ctrl+r 0 - 插入前一次用y命令寄存的內(nèi)容
Ctrl+r * - 插入系統(tǒng)剪貼板的內(nèi)容
Ctrl+r <寄存器名稱>?- 插入指定寄存器的內(nèi)容
Ctrl+a - 插入前一次插入模式所鍵入的內(nèi)容
Ctrl+o - 執(zhí)行一個(gè)普通模式下的命令然后返回插入模式。例如 Ctrl+o A 相當(dāng)于按 End鍵, Ctrl+o I相當(dāng)于按Home鍵
退出插入模式可以用 ESC 鍵,但鍵位太遠(yuǎn)。其實(shí)也可以用 Ctrl+[ 鍵退出插入模式 。當(dāng)然也可以用第1點(diǎn)自定義的Ctrl+;快捷鍵,但這不是標(biāo)準(zhǔn)vim按鍵,會(huì)養(yǎng)成不良習(xí)慣,不建議使用。
10. 重復(fù)操作
普通模式下按. (小數(shù)點(diǎn))可重復(fù)上一次的修改操作,& - 重復(fù)上一次的:s替換命令,@@ - 重復(fù)上一次執(zhí)行的宏
11. 跳轉(zhuǎn)
Ctrl+] 跳轉(zhuǎn)到當(dāng)前標(biāo)識(shí)符的定義位置 (相當(dāng)于在當(dāng)前光標(biāo)位置的單詞上按住ctrl用鼠標(biāo)點(diǎn)擊)
Ctrl+o 回退一步 (go?back)
Ctrl+i 前進(jìn)一步 (go?forward)
`. 跳轉(zhuǎn)到之前修改位置
`` 在前一次跳轉(zhuǎn)位置與當(dāng)前位置間切換
行號(hào)G 或 :行號(hào)<回車> 跳轉(zhuǎn)到某一行
gg 跳轉(zhuǎn)到文件開(kāi)頭
G 跳轉(zhuǎn)到文件末尾
H 跳轉(zhuǎn)到屏幕頂端(如果設(shè)置了set so=n,則跳轉(zhuǎn)到第n行)
L 跳轉(zhuǎn)到屏幕底端(如果設(shè)置了set so=n,則跳轉(zhuǎn)到倒數(shù)第n行)
M 跳轉(zhuǎn)到屏幕中間
f 或 F 跳轉(zhuǎn)到本行某個(gè)字符,小寫(xiě)f向右查找,大寫(xiě)F向左查找。用;或,在匹配間切換
t 或 T 跳轉(zhuǎn)到本行某個(gè)字符之前,小寫(xiě)t向右查找,大寫(xiě)T向左查找。用;或,在匹配間切換
/正則表達(dá)式 跳轉(zhuǎn)到下一個(gè)匹配。用n或N在匹配間切換。
?正則表達(dá)式 跳轉(zhuǎn)到上一個(gè)匹配。用n或N在匹配間切換。
12 書(shū)簽
在普通模式下按 m<小寫(xiě)字母> 即可定義書(shū)簽,按 `<字母> 則可跳轉(zhuǎn)到某個(gè)書(shū)簽的精確位置,按
'<字母>可跳轉(zhuǎn)到某個(gè)書(shū)簽所在行的行首(用來(lái)錄制宏時(shí)比較有用)。最常用的自然是mm, mn, mj, mk, ml這幾個(gè)順手的鍵位。
真正的vim中的全局書(shū)簽 m<大寫(xiě)字母> 在目前IdeaVim版本中不生效。需要定義全局書(shū)簽可以使用Idea原本的 F11 + 數(shù)字 方式
13 文本替換
使用 :s/正則表達(dá)式/替換文本/ 可在本行內(nèi)替換首次出現(xiàn)的匹配
使用 :s/正則表達(dá)式/替換文本/g 在本行內(nèi)替換所有出現(xiàn)的匹配
使用 :%s/正則表達(dá)式/替換文本/g 在當(dāng)前文件內(nèi)替換所有出現(xiàn)的匹配
在可視模式下選中文本后,使用:'<,'>s/正則表達(dá)式/替換文本/g
命令可在選中區(qū)域中替換文本。其中'<,'>部分在可視模式下,按:冒號(hào)后自動(dòng)加入,直接輸入s命令即可。但有效區(qū)域只能以行為單位。真正Vim中的
\%V 標(biāo)志在IdeaVim中不生效。
11 代碼折疊
zo - 打開(kāi)折疊
zc - 關(guān)閉折疊
14 宏定義
在IdeaVim中定義宏比Idea自帶的宏功能要輕量許多。按在普通模式下 q<寄存器名稱>
即可開(kāi)始把后續(xù)按鍵序列錄制到指定寄存器中(寄存器參考前面第7條)。錄制完畢進(jìn)入普通模式再按q鍵即可停止錄制。之后用 @<寄存器名稱>
即可重放。需要注意的是宏和復(fù)制粘貼共用一套寄存器,因此在錄制宏時(shí)就注意不要把當(dāng)前宏正在使用的寄存器用來(lái)復(fù)制了。寄存器內(nèi)容是自動(dòng)保存的,重啟Idea仍然生效。但I(xiàn)deaVim沒(méi)有導(dǎo)出宏獨(dú)立保存的功能。因此最好把用來(lái)保存宏的寄存器和用來(lái)復(fù)制粘貼的寄存器分開(kāi),不要同一個(gè)寄存器有時(shí)用來(lái)記錄宏,有時(shí)用來(lái)復(fù)制粘貼。我的習(xí)慣是鍵盤(pán)左手區(qū)用來(lái)保存一些長(zhǎng)期使用的宏(比如說(shuō)我有一個(gè)宏專門(mén)用來(lái)把pom.xml中的版本號(hào)抽取到property區(qū)域,原來(lái)的位置則改用${property}引用)。右手區(qū)的hjklnm鍵用來(lái)保存一些臨時(shí)宏。yuiop五個(gè)寄存器保留用來(lái)復(fù)制粘貼。如果錄制的宏不涉及刪除大段代碼,寄存器1至9也可以用來(lái)進(jìn)行復(fù)制粘貼。
執(zhí)行一次宏后,可以用@@命令重復(fù)上一次執(zhí)行的宏。
在Idea中錄制宏時(shí),如果觸發(fā)了代碼自動(dòng)完成,在自動(dòng)完成列表啟動(dòng)的狀態(tài)輸入的字符不會(huì)被記錄。因此最好在Setting ->
Code Completion -> Autopopup code
completion中把延遲設(shè)為500ms以上或干脆關(guān)掉。在錄制宏的過(guò)程中避免觸發(fā)代碼自動(dòng)完成功能。
錄制一些長(zhǎng)期有效的宏時(shí),開(kāi)始錄制后,最好先用0,^,T, F, $等命令把光標(biāo)對(duì)齊到行首行末或某個(gè)特定起始位置(比如說(shuō)用 F" 跳轉(zhuǎn)到字符串的左邊引號(hào)),再用一個(gè)f或/指令跳轉(zhuǎn)到操作位置,這樣的宏就不用必須把光標(biāo)放在某個(gè)特定字符才能使用了。
15. 一些常用組合技巧
全選:ggvG
調(diào)換兩個(gè)字符位置:xp
復(fù)制一行:yyp
調(diào)換兩行位置:ddp
插入模式下到行尾繼續(xù)輸入(相當(dāng)于End鍵):Ctrl+o A 或 Ctrl+[ A
插入模式下到行首繼續(xù)輸入(相當(dāng)于Home鍵):Ctrl+o I 或 Ctrl+[ I
到類定義位置(適用于正確縮進(jìn)的public,protected類) :?^p回車
(如果對(duì)Vim不熟悉可以跳過(guò)這節(jié))
a)let命令 (沒(méi)有l(wèi)et命令就無(wú)法導(dǎo)出/導(dǎo)入寄存器內(nèi)容,也就是無(wú)法導(dǎo)入宏)
b):g命令 (在文本處理中很有用的一個(gè)命令,在編程中倒是不那么常用)
c)!命令 (執(zhí)行shell命令)
d)大部分正則表達(dá)式標(biāo)記 (例如 \%V, \v 等等)
e) 某些多鍵命令雙擊最后一個(gè)字符表示作用于當(dāng)前行。例如在Vim中g(shù)UU可以把當(dāng)前行轉(zhuǎn)換為大寫(xiě),在IdeaVim中無(wú)效,實(shí)現(xiàn)同樣功能可以先用V命令選中當(dāng)前行,再用gU轉(zhuǎn)換為大寫(xiě)。
f)關(guān)于窗口操作的大部分命令 (Ctrl+w系列命令, :split等)
g)所有Vim腳本插件 (不過(guò)大部分可以用Idea自身的功能和插件來(lái)補(bǔ)償)
嗯,差點(diǎn)忘了,在普通模式下按u撤銷上一個(gè)修改(相當(dāng)于其他IDE的Ctrl+z),按Ctrl+r重做被撤銷的修改。?
