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


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

