愛了!Intellij IDEA 自帶的 Vim 插件真心不錯(cuò)。。。

來源:hsujee.com/2016/01/13/
1. 切換Vim模擬器狀態(tài) 2. ScrollOff 參數(shù) 3. 行號(hào)定位 4. 進(jìn)入修改 5. 范圍操作 6. 選擇文本 7. 復(fù)制粘貼 8.一些插入模式下的常用快捷鍵 9. 退出插入模式 10. 重復(fù)操作 11. 跳轉(zhuǎn) 12 書簽 13 文本替換 11 代碼折疊 14 宏定義 15. 一些常用組合技 16. 一些在目前版本已知沒有實(shí)現(xiàn)的一些常用Vim功能
在 IDEA Intellij小技巧和插件 一文中簡單介紹了一下IdeaVim插件。在這里詳細(xì)總結(jié)一下這個(gè)插件在日常編程中的一些常用小技巧。
供有興趣使用這個(gè)插件,但對(duì)Vim還不十分熟悉的朋友參考。當(dāng)然基本的hjkl移動(dòng)光標(biāo)和幾種常見模式等等基本概念就略過不提了。
為了確保只包含常用操作,這里提到的技巧都沒有從現(xiàn)成文檔里抄,而是憑記憶列出(不常用自然就不記得了)。
估計(jì)會(huì)有所遺漏,慢慢再補(bǔ)充。
1. 切換Vim模擬器狀態(tài)
這個(gè)插件允許設(shè)置一個(gè)快捷鍵一鍵開啟或關(guān)閉,在切換模式時(shí)會(huì)同時(shí)自動(dòng)切換keymap,十分方便。默認(rèn)鍵位是Ctrl+Alt+V,但這個(gè)鍵位覆蓋了很常用的“抽取局部變量”功能,建議重設(shè),在setting->keymap中查找VIM Emulator即可。
由于開啟和關(guān)閉狀態(tài)分別使用兩套keymap,因此兩套都需要設(shè)定??梢园褍商譳eymap下的都設(shè)為一樣的鍵,也就是用同一個(gè)鍵切換。但個(gè)人建議設(shè)為不同的鍵,這樣能清楚知道當(dāng)前處于那種模式中。并且,如果在開啟Vim的插入模式下關(guān)閉Vim模擬器,下次進(jìn)入時(shí)仍然是插入模式,比較混亂(因?yàn)槟汴P(guān)閉模擬器就是為了使用默認(rèn)keymap輸入大段代碼,重新開啟Vim模擬器就是為了使用普通模式下的命令)。
因此建議把Vim keymap中的Exit Insert Mode設(shè)為與另一個(gè)keymap的Vim Emulator相同的鍵(也就是進(jìn)入Vim模擬器的快捷鍵)。
例如,我使用的設(shè)定是:
Default?keymap?->?Vim?Emulator?:?Ctrl+;?????(用Ctrl+分號(hào)開啟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í))非常方便??上H在Vim模擬器開啟時(shí)有效。
3. 行號(hào)定位
普通模式下輸入 行號(hào)G 或 :行號(hào)<回車> 都能快速定位到某一行。
區(qū)別在于前者在輸入行號(hào)時(shí)屏幕上沒有任何提示,后者則在Vim命令輸入框中可以看到輸入過程。
(題外話:Sublime Text 2也是用 :行號(hào) 來快速定位到某行,應(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)?(普通模式下的大寫字母命令用?shift+字母鍵?輸入,下同)
i?-?在當(dāng)前字符左方開始插入字符
a?-?在當(dāng)前字符右方開始插入字符
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è)單詞包括它后面的空格并開始插入;ciw -?刪除一個(gè)單詞并開始插入;ci"?-?刪除一個(gè)字符串內(nèi)部文本并開始插入;c$?-?從光標(biāo)位置刪除到行尾并開始插入;ct字符?-?從光標(biāo)位置刪除本行某個(gè)字符之前(保留該字符)并開始插入。等等。
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)換為大寫
gu<范圍>?-?將范圍內(nèi)的字符轉(zhuǎn)換為小寫
><范圍>?-?將范圍中的內(nèi)容縮進(jìn)一格
<<范圍>?-?將范圍中的內(nèi)容取消縮進(jìn)一格
常用的范圍指令有:
空格?-?光標(biāo)所在位置字符。(例如 gU空格?-?將光標(biāo)位置字符轉(zhuǎn)為大寫)
重復(fù)某些動(dòng)作命令?-?光標(biāo)所在行。?(例如dd刪除一行,yy復(fù)制一行,cc刪除一行文本并開始插入,>>?當(dāng)前行縮進(jìn)一格,==自動(dòng)縮進(jìn)當(dāng)前行)
$?-?從光標(biāo)位置到行尾
^?-?從光標(biāo)位置到行首,不包含縮進(jìn)空白
0?-?從光標(biāo)位置到行首,包含縮進(jìn)空白
gg?-?從光標(biāo)位置到文件開頭
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)大小寫敏感,如果需要不敏感,可以在正則表達(dá)式開始處加上\c標(biāo)志。
例如 /\cabc 可以匹配到 ABC。下面提到的:s命令同樣適用。
6. 選擇文本
在Vim中,選擇文本需要進(jìn)入“可視模式”(Visual Mode),這個(gè)名稱比較奇怪,它的來由據(jù)說是因?yàn)樵赩im的前身Vi中,選擇區(qū)域是不可見的。
在Vim中選擇區(qū)域會(huì)高亮顯示,因此稱為“可視模式”。
v -?進(jìn)入字符選擇模式, V -?進(jìn)入行選擇模式, Ctrl+v -?進(jìn)入塊選擇模式。
進(jìn)入相應(yīng)模式后移動(dòng)光標(biāo)即可選中文本。過程中可按o鍵令光標(biāo)在選區(qū)兩端切換。
在塊選擇模式中選中多行,然后按I或A后輸入文本,再退出插入模式,所輸入的文本將自動(dòng)加入到每一行的開頭或結(jié)尾。
7. 復(fù)制粘貼
在Vim模式下,復(fù)制粘貼并不直接使用系統(tǒng)的剪貼板,而是使用Vim提供的多個(gè)“寄存器”,每個(gè)寄存器都以一個(gè)字符來表示。
關(guān)于寄存器的詳細(xì)說明可以看這里 http://blah.blogsome.com/2006/04/27/vim_tut_register/ (隨便google的一個(gè)網(wǎng)頁),這里簡單列一些常用的操作技巧
(注意,vim使用雙引號(hào)”來作為選擇寄存器的命令,因此下文中的雙引號(hào)均指在普通模式下按雙引號(hào)鍵):
a)用y命令將文本存入寄存器后,如果想在別處替換原有內(nèi)容,可以先用v命令選中原有內(nèi)容,然后用p命令粘貼。
但第一次粘貼后,默認(rèn)的寄存器”將被替換為剛剛刪除的內(nèi)容。如果要再次粘貼之前復(fù)制的內(nèi)容,需要使用 “0p 命令組合來復(fù)制。
也可以進(jìn)入插入模式后用 Ctrl+r 0 來復(fù)制,例如 ciw
b)在Windows下,寄存器 + 和 * 都代表系統(tǒng)剪貼板,可以互換使用,選一個(gè)順手的即可。
例如 “+yy 命令組合可將當(dāng)前行復(fù)制到系統(tǒng)剪貼板。ci”
c) 寄存器1至9記錄之前九次的刪除大段文本,每次超過一行的刪除操作都會(huì)導(dǎo)致這9個(gè)寄存器的內(nèi)容發(fā)生位移,最近刪除的文本會(huì)存入寄存器1。
但只有刪除超過1行時(shí)才會(huì)影響寄存器1至9,行內(nèi)的刪除內(nèi)容則會(huì)被存入寄存器-(減號(hào))。
如果用q命令錄制宏時(shí)不涉及跨行刪除,可以在宏中直接使用這9個(gè)寄存器來暫存文本。
(在Vim中,復(fù)制內(nèi)容與錄制宏共享同一套寄存器,因此我習(xí)慣把字母寄存器留給宏使用)
d) 普通模式下小寫p把寄存器內(nèi)容復(fù)制到當(dāng)前位置之后,大寫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鍵
9. 退出插入模式
退出插入模式可以用 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)到文件開頭
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è)字符,小寫f向右查找,大寫F向左查找。用;或,在匹配間切換
t 或 T 跳轉(zhuǎn)到本行某個(gè)字符之前,小寫t向右查找,大寫T向左查找。用;或,在匹配間切換
/正則表達(dá)式??跳轉(zhuǎn)到下一個(gè)匹配。用n或N在匹配間切換。
?正則表達(dá)式??跳轉(zhuǎn)到上一個(gè)匹配。用n或N在匹配間切換。
(結(jié)合前面第5點(diǎn),你也許注意到了,在指定范圍時(shí),使用跳轉(zhuǎn)命令將指定一個(gè)從光標(biāo)位置到跳轉(zhuǎn)目標(biāo)的區(qū)域)
12 書簽
在普通模式下按 m<小寫字母> 即可定義書簽,按 `<字母> 則可跳轉(zhuǎn)到某個(gè)書簽的精確位置,按 ‘<字母>可跳轉(zhuǎn)到某個(gè)書簽所在行的行首(用來錄制宏時(shí)比較有用)。
最常用的自然是mm, mn, mj, mk, ml這幾個(gè)順手的鍵位。
真正的vim中的全局書簽 m<大寫字母> 在目前IdeaVim版本中不生效。需要定義全局書簽可以使用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?-?打開折疊
zc?-?關(guān)閉折疊
14 宏定義
在IdeaVim中定義宏比Idea自帶的宏功能要輕量許多。
按在普通模式下 q<寄存器名稱> 即可開始把后續(xù)按鍵序列錄制到指定寄存器中(寄存器參考前面第7條)。錄制完畢進(jìn)入普通模式再按q鍵即可停止錄制。
之后用 @<寄存器名稱> 即可重放。需要注意的是宏和復(fù)制粘貼共用一套寄存器,因此在錄制宏時(shí)就注意不要把當(dāng)前宏正在使用的寄存器用來復(fù)制了。
寄存器內(nèi)容是自動(dòng)保存的,重啟Idea仍然生效。但I(xiàn)deaVim沒有導(dǎo)出宏獨(dú)立保存的功能。因此最好把用來保存宏的寄存器和用來復(fù)制粘貼的寄存器分開,不要同一個(gè)寄存器有時(shí)用來記錄宏,有時(shí)用來復(fù)制粘貼。我的習(xí)慣是鍵盤左手區(qū)用來保存一些長期使用的宏(比如說我有一個(gè)宏專門用來把pom.xml中的版本號(hào)抽取到property區(qū)域,原來的位置則改用${property}引用)。
右手區(qū)的hjklnm鍵用來保存一些臨時(shí)宏。yuiop五個(gè)寄存器保留用來復(fù)制粘貼。如果錄制的宏不涉及刪除大段代碼,寄存器1至9也可以用來進(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)掉。在錄制宏的過程中避免觸發(fā)代碼自動(dòng)完成功能。
錄制一些長期有效的宏時(shí),開始錄制后,最好先用0,^,T, F, $等命令把光標(biāo)對(duì)齊到行首行末或某個(gè)特定起始位置(比如說用 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回車
16. 一些在目前版本已知沒有實(shí)現(xiàn)的一些常用Vim功能
(如果對(duì)Vim不熟悉可以跳過這節(jié))
a)let命令?(沒有l(wèi)et命令就無法導(dǎo)出/導(dǎo)入寄存器內(nèi)容,也就是無法導(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)換為大寫,在IdeaVim中無效,實(shí)現(xiàn)同樣功能可以先用V命令選中當(dāng)前行,再用gU轉(zhuǎn)換為大寫。
f)關(guān)于窗口操作的大部分命令?(Ctrl+w系列命令,?:split等)
g)所有Vim腳本插件?(不過大部分可以用Idea自身的功能和插件來補(bǔ)償)
嗯,差點(diǎn)忘了,在普通模式下按u撤銷上一個(gè)修改(相當(dāng)于其他IDE的Ctrl+z),按Ctrl+r重做被撤銷的修改。
?--END--
長按關(guān)注,學(xué)習(xí)更多
推薦閱讀
SQL 已死,但 SQL 將永存!
歷史上最簡單的一道Java面試題,但無人能通過
為什么 IDEA 比 Eclipse 更好?
值得收藏的 Intellij IDEA 的小技巧
如何寫出無法維護(hù)的代碼2.0版本?
面試 Spring Boot 再也不怕,答案都在這里!
SQL性能優(yōu)化,太太太太太太太有用了!
面試必問之JVM原理
