分享我的 Android Studio Emacs 風格快捷鍵

[圖片上傳失敗...(image-99d8ae-1533279659132)]

Emacs 風格的快捷鍵通過前綴鍵來擴展更多打字區的快捷鍵,盡量把快捷鍵控制在打字鍵區,顯著減少編碼過程手腕的移動,是個經得起考驗的快捷鍵方案(非 emacs 用戶可能深痛惡覺)。

這套快捷鍵在 Emacs keymaps 的基礎上進行自定義,首先減少對功能鍵區的使用,一來容易與系統快捷鍵沖突,二來手指移動的幅度過大難定位不容形成肌肉記憶,所以只保留編譯運行相關的快捷鍵。至于編輯鍵區則更次,手腕必須得移動,眼睛也得跟著輔助定位,只保留少部分不常用的默認快捷鍵。數字鍵區最糟,手腕移動幅度最大,再說我的 87 鍵盤都沒有小鍵盤-_-,直接棄用。至于鼠標,那更是萬惡之源,整個手臂都得移動,還要眼睛配合才能用鼠標完成一次操作,寫代碼的過程大多是用鼠標輔助點擊幾次,然后又回到打字區繼續敲,這樣來回一次切換成本太高。何況程序員經常用鼠標點點點?多沒 B 格啊。雖說如此,不過想要完全不用鼠標還是不太容易,只能說一個命令通過鼠標打開層層菜單來執行超過一次,第二次就應該用 Find Action 來執行,如果一天超過三次那就應該給它設個快捷鍵并記住。

Android Studio 相比 Eclipse 內置的 Emacs keymaps 強大了許多,不過 Eclipse 有 Emacs+, Android Studio 卻沒有這方面的插件。所有 Android Studio 相比 Emacs 多了一些不足,比如:

  1. Android Studio 只支持一個前綴鍵(prefix key),所以 spacemacs 那樣的助記法快捷鍵 Android Studio 難以實現
  2. Android Studio 中 Esc 不能作為修飾鍵使用
  3. IntelliJ 可以為 Escape 命令配置快捷鍵,但不少 UI 還是硬編碼為鍵盤的 Esc 鍵。所以為了退出浮窗,經常要 C-gEsc 交替使用
  4. 不過窗口的操作邏輯不一致,有些 UI 可以用移動光標快捷鍵,有些只能用方向鍵

一些約定先說明,特別是非 Emacs 黨:

最終使用的前綴鍵有下面三個:

  1. C-x
  2. Esc
  3. M-g

首先,最基本又最重要的鍵肯定就是 Find Action,簡直就是 Emacs 中的 Run Command,必須綁定為 M-x。別的快捷鍵記不住不要緊,只要記住這個還是能做到無鼠標操作,特別是還附帶快捷鍵提示,如果有的話。不過還是得對命令的關鍵字有點概念,表格中的關鍵字項就是表示通過該關鍵字在 Find Action 或者 Keymaps 設置搜索到相應功能;自定義有 * 表示快捷鍵是我自定義的,非 Emacs Keymaps 的默認配置。

快捷鍵 功能 關鍵字 自定義
M-x 執行命令 find Action *
C-g 取消 escape
C-M-s 打開設置 settings

光標移動(Move cursor)

光標移動類的快捷鍵,這里指的是在單一文本的內的光標移動,又包括語法無關的移動和語法相關的移動,語法無關的移動指的就是光標的上下左右移動等等,這一塊與 Emacs 基本一致。另外 C-l雖然不是移動光標,但也是放在這里。

快捷鍵 功能 關鍵字 自定義
C-f 向前移動一個字符 right
C-b 向后移動一個字符 left
C-n 向上移動一行 up
C-p 向下移動一行 down
M-f 向前移動一個單詞 next word
M-b 向后移動一個單詞 previous word
C-a 移動到行頭 line start
C-e 移動到行尾 line end
C-v 下一頁 page down
M-v 上一頁 page up
M-< 移動到文本頭 text start
M-> 移動到文本尾 text end
C-l 將光標位置滾動到屏幕中央 scroll to center
C-Pgup 移動到當前頁的起始處 Page Top
C-PgDn 移動到當前頁的結束處 page end

語法相關的移動:

快捷鍵 功能 關鍵字 自定義
C-[ 移動到當前 Block 起始大括號處 Code block start
C-] 移動到當前 BLock 結束大括號處 Code Block End
C-M-a 移動到前一個方法 previous method
C-M-e 移動到后一個方法 next method

Android Studio 將 M-g 作為跳轉到行數,我改其作為前置鍵,同時作為跳轉高亮錯誤的前置鍵。

快捷鍵 功能 關鍵字 自定義
M-g g 作為跳轉到行數 line *
M-g n 下一個高亮問題 next highlighted error *
M-g p 上一個高亮問題 next highlighted error *

與光標相關的還有文本選擇,我保留 C-space 來加入選擇模式,但這個快捷鍵也常被操作系統用來切換輸入法,
在 Linux 下我把輸入切換配置為 Win-space,其他系統我也建議想辦法把 C-space 留給 Android Studio。

快捷鍵 功能 關鍵字 自定義
C-space 切換選擇模式 sticky selection
C-x, h 全選 select all

特別是 Android Studio 不像 emacs 可以用 C-F 等進行選擇。只能用傳統的 S-→。所以保留 C-space 還是有必要的,下面是例外:

快捷鍵 功能 關鍵字 自定義
C-{ 選擇到當前 Block 起始大括號處 Code block start
C-} 選擇到當前 Block 結束大括號處 Code block end
C-S-PgUp 選擇到當前頁的起始處 page start
C-S-PgDn 選擇到當前頁的結束處 page end
C-S-Home 選擇到當前文本的起始處 text start
C-S-End 選擇到當前文本的結束處 text end

導航(Navigate)

導航,在不同文件中切換。常用的導航我用一段式快捷鍵。一定要善用前三個,對編碼效率絕對是很大的提高,起碼不會讓切換文件的速度脫慢你的思路。

C-M-GC-M-g 的高級版,直接從實例名跳轉到其類中。

快捷鍵 功能 關鍵字 自定義
C-M-f 上一個位置 forward *
C-M-b 下一個位置 back *
C-M-g 跳轉到定義處 declaration
C-M-G 跳轉到類型 type declaration *
C-M-u 跳轉到父類方法 super method *
M-←/→ 左右切換標簽 select tab

如果對簡潔有要求或者屏幕太小(比如我),可以將 Android Studio 的標簽關掉,具體參考:Configuring Behavior of the Editor Tabs,那么這時 M-←/→ 就不會起作用了。

另外 M-num 都被 Android Studio 綁定到切換功能窗體,很實用但不一一羅列了,比較常用的是 M-6 打開 Android Monitor、M-7 打開 Structure,至于 Project 有更好的快捷鍵打開。

C-num 用于跳轉書簽。C-M-num 則用于設置書簽,書簽是全局的。

Select in... 可謂的鼠標殺手中的 MVP,多少鼠標操作就是為了在其他窗體中操作當前文件。大部分情況下它都是比 M-num 更好的選擇。默認的 Alt+F1 與系統沖突,我修改為 Esc,S-i,好記,不過需要前綴鍵確實難為了這個命令。

快捷鍵 功能 關鍵字 自定義
Esc,S-i 在其它窗體中選擇,比如在項目窗體定位當前文件 select in.. *
S-Esc 隱藏工具窗口,配合上個命令使用更佳。 Hide Active ToolWindow
C-S-Esc 隱藏所有工具窗口 Hide All ToolWindow *

編輯(Edit)

看快捷鍵說明, Android Studio 有 kill ring 的概念,比如 M-wC-wM-dM-backspace 都是操作 kill ring,但是居然沒有 yank pop,所以 M-y 只能綁定為不太實用 paste from history...,話說你把 kill ring 藏到哪了?

快捷鍵 功能 關鍵字 自定義
C-x,C-f 打開文件 file
C-x,b 切換 Buffer switcher
C-x,k 關閉當前文件 close
C-_ 撤銷 undo
M-_ 重做 redo
C-w 剪切 kill selected
M-w 復制 save to kill ring
C-y 粘帖 paste
M-y 粘帖歷史選擇 paste from history
M-S-↑/↓ 移動當前行 move line up/down
C-S-↑/↓ 移動當前語句/代碼塊 move statement up/down
M-; 注釋當前行 line comment
M-: 注釋塊 block comment *
C-= 展開 expand
C-M-= 全部展開 expand all *
C-- 收縮 collapse
C-M--) 全部收縮 collapse all *

Android Studio 對分割窗格的支持,基本可以做到和 Emacs 一致,除了 C-x, 0,在 Android Studio 中它的行為與 C-x, k 一致。

快捷鍵 功能 關鍵字 自定義
C-x, 1 關閉其他窗格 unsplit
C-x, 2 平行分割當前窗格 split
C-x, 3 豎直分割當前窗格 split
C-x, 0 關閉當前窗格 unsplit
C-x, o 切換不同窗格 goto next spliteer

查找(Find)

C-D 是 Dash 插件的默認快捷鍵,用于在 Dash/Velocity/Zeal 中搜索

快捷鍵 功能 關鍵字 自定義
C-s 文本內搜索/下一個匹配 find next
C-r 下一個匹配 find previous
M-% 替換 replace
C-S 全局搜索 find in path *
C-R 全局替換 replace in path
M-S 查找使用 find usage
C-D Dash 中搜索 Search in Dash *

Android Studio 支持宏功能,默認的宏操作都沒有配置快捷鍵,不過沒有 C-u 宏的實用性大打折扣

快捷鍵 功能 關鍵字 自定義
C-x, ( 開始宏錄制 start macro
C-x, ) 停止宏錄制 stop macro
C-x, e 運行宏 play last macro

編碼(Code)

重構的 Extract 都被綁定為 C-M-key,本來也是不錯的選擇,可惜太多沖突,我改為 Esc,key,取首字母相同來助記。前綴鍵我在 EscC-c 間猶豫了下,顯然 C-c 效率更好,但我覺得重構的話,在操作前有個停頓思考下也不是壞事。所以最終選擇了 Esc

C-M 的默認功能與 C-[C-] 重疊了,所以不如綁定為顯示方法的參數信息,畢竟 Android Studio 的代碼補全不支持顯示方法參數,所以這個功能也是很有必要的。

快捷鍵 功能 關鍵字 自定義
M-/ 代碼補全,按兩次能顯示更多選項 completion
C-M-/ 代碼補全,智能類型 completion
M-enter 顯示建議行為,類是 quick fix show intention actions
C-q 快速文檔 quick document
C-I 快速顯示定義 quick definition
C-P 顯示當前表達式返回類型 expression type
C-M 顯示方法參數信息 parameter info *
C-x, f 格式化 reformat code *
C-x, r 重命名 rename *
C-x, i 優化 imports optimize imports *
C-x, j 插入在線模板,代碼補全也支持補全模板 insert live template *
C-x, g 生成代碼 generate *
C-x, s 生成包圍代碼 surround with *
Esc, f 提取為字段 field *
Esc, c 提取為常量 constant *
Esc, m 提取為方法 method *
Esc, p 提取為參數 parameter *
Esc, v 提取為變量 variable *

運行(Make)

快捷鍵 功能 關鍵字 自定義
S-F10 運行當前配置 run
S-F9 調試當前配置 debug
C-S-F9 運行當前 Activity run context configuraton
M-S-F10 彈出運行選擇菜單 run
M-S-F9 彈出調試選擇菜單 debug

Git

大部分 Vcs 相關的快捷鍵默認配置都和上面的配置沖突了,考慮到用于跳轉的 M-g 前綴鍵只用了 3 個,我的 VCS 只用 git
一個,所以把 git 相關操作用 M-g 前綴鍵重新編排下。因為很少用到,可能不太合理,一些 git 的基本操作我都是都是直接在 Shell 里輸入。

快捷鍵 功能 關鍵字 自定義
M-g, + add 當前文件 add to vcs *
M-g, C-c commit commit *
M-g, C-z revert revert *
M-g, C-f fetch fetch *
M-g, C-u push push *
M-g, C-a annotate annotate *
M-g, C-p pull pull *
M-g, C-d 比較文件,在歷史記錄窗體可直接對比 compare file/show diff *
M-g, C-D 彈出比較文件浮窗 compare with *
M-g, C-h 顯示當前文件歷史 show history *
M-g, C-H 顯示當前選擇區域歷史 show history *

鼠標(Mouse)

某些情況鼠標還是比鍵盤更高效

快捷鍵 功能 關鍵字 自定義
Button2 矩形選擇
M-S-Button1 放置多個光標

Live-plugin

live-plugin 是一個強大的插件,能給 Android Studio 提供類似 elisp 的運行環境及解析器,通過 groovy 腳本在運行時更改 IDE 的行為,所謂的 InternalReprogrammability

我將其運行當前插件的快捷鍵更改為 Emacs 中執行 elisp 表達式的快捷鍵。其他的我還沒有深入使用,只是寫了個腳本用來實現單詞首字母大寫功能,并將其綁定到 M-c,見 capitalizeWord。原理主要是registerAction 來增加自定義 action,自定義的 action 能綁定快捷鍵,也能通過 find action 來搜索十分方便。

快捷鍵 功能 關鍵字 自定義
C-x, C-e 運行當前插件 run current plugin *
C-x, C-t 測試當前插件 test current plugin *
M-c 單詞首字母大寫 captilazie word *

總結

這只是我常用的或偶爾用到的快捷鍵的羅列,不是完整的 Android Studio 快捷鍵說明,還有很多 Android Studio 的基本功能沒有涉及到,記下來只是為了備忘和分享。這份快捷鍵會持續變更,可在 douo_keymaps 查看最新的配置。

參考

Customizing IntelliJ for Emacs Compatibility

原文鏈接:https://dourok.info/2016/08/20/share-my-android-studio-emacs-keymaps/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容