Emacs使いのための IntelliJ IDEAキーマップ チートシート

Emacs使いな人向けの [IntelliJ IDEA](https://www.jetbrains.com/idea/) のキーマップカスタマイズとチートシートです。

* **チートシートは、ちょくちょく追記していきます。**

* ~~2018/4/1時点で、[Emacs+ Patchedプラグインが IDEA 2018.1 に対応していない](https://github.com/cursive-ide/emacs-plus/issues/3) ため、IDEA 2018.1 ではいくつかのキーバインドが効かなくなるので注意してください。~~
  * 2018/4/4 IDEA 2018.1 対応版がリリースされました。
* ~~2018/11/30 IDEA 2018.3 から一部のキーバインドが効かなくなりました。
例えば `Alt+Y` は *Yank-pop* アクションに割り当てられているのですが、`¥`が入力されてしまいアクションが発動しません。（他にも `Alt+@`の *Extend Selection* も `€` が入力されてしまって効きませんし、他にも効かなくなっているキーバインドがあると思われます）
回避策としては `Fn` キーを組み合わせて `Fn+Alt+Y` のようにするとアクションが発動します。~~
  * 2018/12/18 IDEA 2018.3.2 で解消されました。

## プラグイン

IDEAはデフォルトでEmacsキーマップが選択可能になっていますが、いくつか不満があるのでプラグインを導入して改善します。

* [Emacs+ Patched](https://plugins.jetbrains.com/plugin/10045-emacs-patched)
  * 開発が止まって、最近のIDEAでは動作しなくなっている [Emacs+](https://plugins.jetbrains.com/plugin/10045-emacs-patched) をフォークしたもののようです。
  * `Alt+F` などのカーソル移動の飛び方が、Emacsと同じになります。
  * `Ctrl+S`、`Ctrl+R` で開く検索キーワード入力欄で、エディタと同様に`Ctrl`と組み合わせた編集操作ができるようになります。
  * ...more

* [Presentation Assistant](https://plugins.jetbrains.com/plugin/7345-presentation-assistant)
何らかの操作を実行したときに、割り当てられているキーバインドをホバー表示してくれるプラグイン。
キーバインドを覚えていくのに便利です。


## キーマップの変更

1. *Preferences* -> *Keymap* で `Emacs+` を選択し、*Duplicate...* でコピーを作成します。

1. *Preferences* -> *Appearance & Behavior* -> *Presentation Assistant* で、*Main keymap* に作成したコピーを指定します。
  * お好みで、*Alternative Keymap* に表示させたいキーバインドをもう１つ指定できます。

1. コピーして作成したキーマップをカスタマイズします。

|変更|キーバインド|アクション|
|----|----|----|----|
|追加|`Ctrl+X`, `Ctrl+B`|Switcher|
|追加|`Ctrl+X`, `5`|Next Project Windows|
|追加|`Ctrl+X`, `D`|Tool Windows / Project|
|追加|`Alt+Shift+=`|Compare Files|

## キーバインドのチートシート

* アクションが `xxxx-xxxxx` のような名前の操作は、`Emacs+ Patched`プラグインによって追加された操作です。

### 基本

#### 移動

|キーバインド|アクション|説明|Emacs相当|
|----|----|----|----|
|`Ctrl+F`|Right|カーソルを右に移動。|同左|
|`Ctrl+B`|Left|カーソルを左に移動。|同左|
|`Ctrl+P`|Up|カーソルを上に移動。|同左|
|`Ctrl+N`|Down|カーソルを下に移動。|同左|
|`Alt+F`|forward-word|カーソルを右の単語に移動。|同左|
|`Alt+B`|backward-word|カーソルを左の単語に移動。|同左|
|`Ctrl+A`|Move Caret to Line Start|カーソルを行の先頭にジャンプ。|同左|
|`Ctrl+E`|Move Caret to Line End|カーソルを行の末尾にジャンプ。|同左|
|`Alt+V`|page Up|ページを上に移動。|同左|
|`Ctrl+V`|Page Down|ページを下に移動。|同左|
|`Ctrl+L`|recenter-top-bottom|カーソル行を、ページの中心／先頭／末尾に移動。|同左|
|`Alt+Shift+<`|Move Caret to Text Start|カーソルをファイルの先頭にジャンプ。|同左|
|`Alt+Shift+>`|Move Caret to Text End|カーソルをファイルの末尾にジャンプ。|同左|
|`Ctrl+Alt+D`|Move Caret to Code Block End|カーソルをコードブロックの `}` にジャンプ。|-|
|`Ctrl+Alt+U`|Move Caret to Code Block Start|カーソルをコードブロックの `{` にジャンプ。|-|

#### 編集

|キーバインド|アクション|説明|Emacs相当|
|----|----|----|----|
|`Ctrl+D`|Delete|1文字削除。|同左|
|`Alt+D`|kill-word|単語削除。|同左|

#### コピー／切り取り／貼り付け

|キーバインド|アクション|説明|Emacs相当|
|----|----|----|----|
|`Ctrl+space`|Toggle Sticky Selection|範囲選択を開始。|同左|
|`Ctrl+X`, `Ctrl+X`|echange-point-and-mark|選択範囲の開始位置／終了位置にカーソル移動。|同左|
|`Alt+W`|Save to Kill Ring|選択範囲をコピー。|同左|
|`Ctrl+W`|kill-region|選択範囲を切り取り。|同左|
|`Ctrl+Y`|yank|直前にコピー／切り取った値をペースト。|同左|
|`Alt+Y`|yank-pop|コピー／切り取った値の履歴を表示してペースト。|同左|

#### その他

|キーバインド|アクション|説明|Emacs相当|
|----|----|----|----|
|`Ctrl+G`|keyboard-quit|操作の中止。|同左|
|`Shift`, `Shift`|Search Everywhere|いろいろなものを検索して開く。|-|
|`F4`|Jump to Source|カーソル位置のソースファイルを開く。|-|

### Edit

|キーバインド|アクション|説明|Emacs相当|
|----|----|----|----|
|`Ctrl+Alt+Shift+C`|Copy Reference|カーソル位置のファイルや型の完全修飾名をコピーする。|-|
|`⌘+D`|Duplicate Line|カーソル位置の行をコピーして、1行下に挿入する。|-|
|`Ctrl+Alt+F7`|Show Usages|カーソル位置の型や関数を使用している箇所を一覧表示する。|-|
|`Ctrl+S`|isearch-forward|前(下)に向かってインクリメンタルサーチ。|同左|
|`Ctrl+R`|isearch-backward|後(上)に向かってインクリメンタルサーチ。|同左|
|`Ctrl+F3`|Find Word at Caret|カーソル位置の単語を検索。（Macの場合は、`Ctrl+F3`がドックを操作するに割り当てられているため、無効化する必要あり）|-|
|`Alt+Shift+5`|query-replace|検索して置換。|-|
|`Ctrl+Alt+S`|isearch-forward-regexp|前(下)に向かって正規表現でインクリメンタルサーチ。|同左|
|`Ctrl+Alt+R`|isearch-backward-regexp|後(上)に向かって正規表現でインクリメンタルサーチ。|同左|
|`Ctrl+X`, `H`|Select All|全体を選択する。|同左|
|`Alt+@`|Extend Selection|選択範囲を広げる。|同左|
|`Ctrl+Shift+W`|選択範囲を狭める。|-|
|`Ctrl+Alt+Shift+5`|query-replace-regexp|正規表現で検索して置換。|-|
|`Ctrl+T`|transpose-chars|カーソル位置の文字を左右で入れ替える。|-|
|`Alt+T`|transpose-words|カーソル位置の単語を左右で入れ替える。|-|


#### 検索して一括編集

1. `Ctrl+S` で検索モードにして、検索キーワードを入力。検索キーワードにHITした部分がハイライトされる。

1. HITした部分のうち、編集箇所を選択して編集したい場合は...
  1. `Ctrl+J` で編集対象としてマーク。（または `Ctrl+Shift+J` でマーク解除）
  1. `Ctrl+G` で編集対象を確定し、編集。
  1. `Ctrl+G` で編集を終了。

1. HITした部分をすべて編集したい場合は...
  1. `Ctrl+Shift+Alt+J` ですべてを編集対象として確定。
  1. そのまま編集。
  1. `Ctrl+G` で編集を終了。

### View

|キーバインド|アクション|説明|Emacs相当|
|----|----|----|----|
|`Ctrl+X`, `D`|Project|Projectツールウィンドウを開く。|Dired|
|`Ctrl+Shift+I`|Quick Definition|カーソル位置の定義を開く。|-|
|`Ctrl+Q`|Quick Documentation|カーソル位置の情報を開く。|-|
|`Alt+Shift+P`|Parameter Info|関数やコンストラクタのパラメタ定義を開く。|-|
|`Ctrl+Shift+E`|Recently Changed Files|最近変更したファイルの履歴を開く。|-|
|`Ctrl+Alt+Shift+=`|Show/Expand Implicit Hints|暗黙的に渡されたimplicitパラメタなどの情報を表示する。（Scalaのみの機能？）|-|
|`Ctrl+Alt+Shift+-`|Show Implicit Hints|暗黙的に渡されたimplicitパラメタなどの情報を非表示にする。（Scalaのみの機能？）|-|
|`Alt+Shift+=`|Compare Files|Projectビューなどで選択しているファイルを比較する。|Diredでdiff|

### Navigate

|キーバインド|アクション|説明|Emacs相当|
|----|----|----|----|
|`Ctrl+X`, `Ctrl+F`|File|ファイル名を入力して開く。|ミニバッファでファイル名を入力して開く。|
|`Alt+Shift+G`|Class|型名を入力して開く。|-|
|`Alt+G`|Line/Column|指定された行（列）にジャンプ。|-|
|`Alt+.`|Go To|カーソル位置の定義（型や関数などの宣言）に飛ぶ。|-|
|`Ctrl+Shift+T`|Test|カーソル位置に対応するユニットテストを開く。|-|
|`Ctrl+F12`|File Structure|開いているファイルのアウトラインを開く。|-|
|`Ctrl+H`|Type Hierarchy|カーソル位置の型の継承階層を開く。|-|
|`Ctrl+Alt+H`|Call Hierarchy|カーソル位置の関数の呼び出し元／呼び出し先階層を開く。|-|
|`F2`|Next Hight lighted Error|1つ後のエラー箇所にジャンプ。|-|
|`Shift+F2`|Previous Hight lighted Error|1つ前のエラー箇所にジャンプ。|-|
|`Alt+↓`|Next Method|1つ後のメソッド定義位置にジャンプ。|-|
|`Alt+↑`|Previous Method|1つ前のメソッド定義位置にジャンプ。|-|
|`Ctrl+X`, `=`|what-cursor-position|ステータスバー左下にカーソル位置の情報(文字種、位置)を表示。|-|

### Code

|キーバインド|アクション|説明|Emacs相当|
|----|----|----|----|
|`Ctrl+I`|Implement Methods|スーパータイプから継承した、実装が必要なメソッドの空実装を挿入する。|-|
|`Ctrl+Alt+T`|Surround With...|選択した範囲を `()` や `{}`、Live Template で囲む。|-|
|`Ctrl+Alt+O`|Optimize Imports|import文を最適化（並べ替え、不要なimportの削除など）する。|-|
|`Ctrl+C`, `Ctrl+C`|Comment with Line comment|行コメントでコメントアウトする。|-|
|`Ctrl+Shift+/`|Comment with Block comment|ブロックコメントでコメントアウトする。|-|
|`Alt+Shift+↑`|Move Line Up|カーソル行を上に移動する。|-|
|`Alt+Shift+↓`|Move Line Down|カーソル行を上に移動する。|-|

### Refactor

|キーバインド|アクション|説明|Emacs相当|
|----|----|----|----|
|`Ctrl+Alt+Shift+T`|Refactor This|カーソル位置に対して実行可能なリファクタリングメニューを開く。|-|
|`Shift+F6`|Rename|カーソル位置をリネームする。|-|
|`Ctrl+Alt+N`|Inline|カーソル位置のコードをインライン展開する。|-|
|`Ctrl+Alt+V`|Extract Variable|選択範囲を変数に切り出す。|-|
|`Ctrl+Alt+M`|Extract Method|選択範囲を関数に切り出す。|-|

### Run

|キーバインド|アクション|説明|Emacs相当|
|----|----|----|----|
|`Shift+F10`|Run|アプリケーションを実行。|-|
|`Shift+F9`|Debug|アプリケーションをデバッグ実行。|-|
|`Ctrl+F2`|Stop|実行中のアプリケーションを停止。|-|
|`Ctrl+F5`|ReRun|実行中のアプリケーションをいったん停止して再起動。|-|
|`Ctrl+X`, `space`|Toggle Line Breakpoint|行ブレークポイントの設定／設定解除。|-|
|`Ctrl+Shift+F8`|View Breakpoints...|ブレークポイントを表示。|-|

### VCS

|キーバインド|アクション|説明|Emacs相当|
|----|----|----|----|
|`Ctrl+X`, `V`|VCS Operations Popup|バージョン管理操作のポップアップを開く。|-|

### Window

|キーバインド|アクション|説明|Emacs相当|
|----|----|----|----|
|`Ctrl+X`, `K`|Close|アクティブなエディタを閉じる。|バッファを閉じる。|
|`Ctrl+X`, `Ctrl+C`|Close All|すべてのエディタを閉じる。|Emacsの終了。|
|`Ctrl+X`, `Ctrl+B`|Switcher|開いているエディタやツールウィンドウを切り替えるダイアログを開く。|バッファリストを開く。|
|`Ctrl+X`, `B`|switch-to-buffer|最近開いたファイルの履歴を開く。|-|
|`Ctrl+X`, `0`|Hide Active Tool Window|アクティブなツールウィンドウを閉じる。|カレントのバッファを非表示にする。|
|`Ctrl+X`, `1`|delete-other-windows|アクティブなツールウィンドウを最大化／戻す。|カレント以外のバッファを非表示にする。|
|`Ctrl+X`, `2`|Split Horizontally|エディタを縦に2分割する。|バッファを縦に2分割する。|
|`Ctrl+X`, `3`|Split Vertically|エディタを横に2分割する。|バッファを横に2分割する。|
|`Ctrl+X`, `5`|Next Project Windows|開いている他のプロジェクトウィンドウに切り替える。|フレームの切り替え。|
|`Ctrl+Shift+F12`|Hide All Windows / Restore Windows|エディタ以外のウィンドウをすべて最小化／復元する。|-|


### Help

|キーバインド|アクション|説明|Emacs相当|
|----|----|----|----|
|`Alt+X`|Find Action|アクションをインクリメンタルサーチして実行。|ミニバッファでコマンドを入力して実行。|