[圖片上傳失敗...(image-99d8ae-1533279659132)]
Emacs 風格的快捷鍵通過前綴鍵來擴展更多打字區的快捷鍵,盡量把快捷鍵控制在打字鍵區,顯著減少編碼過程手腕的移動,是個經得起考驗的快捷鍵方案(非 emacs 用戶可能深痛惡覺)。
這套快捷鍵在 Emacs keymaps 的基礎上進行自定義,首先減少對功能鍵區的使用,一來容易與系統快捷鍵沖突,二來手指移動的幅度過大難定位不容形成肌肉記憶,所以只保留編譯運行相關的快捷鍵。至于編輯鍵區則更次,手腕必須得移動,眼睛也得跟著輔助定位,只保留少部分不常用的默認快捷鍵。數字鍵區最糟,手腕移動幅度最大,再說我的 87 鍵盤都沒有小鍵盤-_-,直接棄用。至于鼠標,那更是萬惡之源,整個手臂都得移動,還要眼睛配合才能用鼠標完成一次操作,寫代碼的過程大多是用鼠標輔助點擊幾次,然后又回到打字區繼續敲,這樣來回一次切換成本太高。何況程序員經常用鼠標點點點?多沒 B 格啊。雖說如此,不過想要完全不用鼠標還是不太容易,只能說一個命令通過鼠標打開層層菜單來執行超過一次,第二次就應該用 Find Action 來執行,如果一天超過三次那就應該給它設個快捷鍵并記住。
Android Studio 相比 Eclipse 內置的 Emacs keymaps 強大了許多,不過 Eclipse 有 Emacs+, Android Studio 卻沒有這方面的插件。所有 Android Studio 相比 Emacs 多了一些不足,比如:
- Android Studio 只支持一個前綴鍵(prefix key),所以 spacemacs 那樣的助記法快捷鍵 Android Studio 難以實現
- Android Studio 中 Esc 不能作為修飾鍵使用
- IntelliJ 可以為
Escape
命令配置快捷鍵,但不少 UI 還是硬編碼為鍵盤的Esc
鍵。所以為了退出浮窗,經常要C-g
、Esc
交替使用 - 不過窗口的操作邏輯不一致,有些 UI 可以用移動光標快捷鍵,有些只能用方向鍵
一些約定先說明,特別是非 Emacs 黨:
- C = Control/Ctrl,如果小指還想要請將 CapsLock 改成 Ctrl
- M = Meta = Alt != Options
- S = Shift
-
C-F
等同于C-S-f
,無換檔字符仍使用C-S-key
表示 - 方向用圖標表示:
←
、→
、↑
、↓
-
,
用于分隔前綴鍵,表示先按,
前的鍵,松開,再按下一個鍵 - 關于 Mac 的 Options 鍵,參考:osx - How to disable option key to type greek letter in Mac OS? - Stack Overflow
最終使用的前綴鍵有下面三個:
C-x
Esc
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-G
是 C-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-w
、C-w
、M-d
、M-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
,取首字母相同來助記。前綴鍵我在 Esc
和 C-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/