說實話,Intellij IDEA 自帶的 Vim 插件真心不錯!
程序員的成長之路互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?關(guān)注
閱讀本文大概需要 11 分鐘。
作者:kidneyball鏈接:iteye.com/blog/kidneyball-1828427在 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+分號退出插入模式,進入普通模式)
set?so=5
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?-?進入覆蓋模式
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)為大寫)
重復(fù)某些動作命令?-?光標所在行。?(例如dd刪除一行,yy復(fù)制一行,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中不生效。
v -?進入字符選擇模式, V -?進入行選擇模式, Ctrl+v -?進入塊選擇模式。
Ctrl+h?-?刪除光標左邊字符
Ctrl+w?-?刪除光標左邊的單詞
Ctrl+y?-?復(fù)制上方的一個字符
Ctrl+e?-?復(fù)制下方的一個字符
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鍵
&?-?重復(fù)上一次的:s替換命令
@@?-?重復(fù)上一次執(zhí)行的宏
Ctrl+]?跳轉(zhuǎn)到當前標識符的定義位置?(相當于在當前光標位置的單詞上按住ctrl用鼠標點擊)(結(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 代碼折疊
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在匹配間切換。
zo?-?打開折疊
zc?-?關(guān)閉折疊
全選:ggvG
調(diào)換兩個字符位置:xp
復(fù)制一行:yyp
調(diào)換兩行位置:ddp
插入模式下到行尾繼續(xù)輸入(相當于End鍵):Ctrl+o A 或 Ctrl+[ A
插入模式下到行首繼續(xù)輸入(相當于Home鍵):Ctrl+o I 或 Ctrl+[ I
到類定義位置(適用于正確縮進的public,protected類)?:?^p回車
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自身的功能和插件來補償)
推薦閱讀:
微信掃描二維碼,關(guān)注我的公眾號
寫留言朕已閱?![]()
