Spacemacsでよく使う操作をまとめる

[Spacemacs](http://spacemacs.org/)いいですね！
慣れ親しんだ便利なEmacsのパッケージを使いつつ、Vimの簡潔なキー操作ができるので、とても気に入っています。

今はまだEmacsの操作感が抜けきっておらず、Vim(Evil)もわからないことが多いです。ちょいちょい操作を忘れてしまう。
Spacemacsに慣れるまではチートシートを育てていこうかなと思います。

## キーバインド

### 起動、停止

|Spacemacs|Emacs|説明|
|:--------|:----|:---|
|`SPC q q` (`spacemacs/prompt-kill-emacs`)|`C-x C-c` (`save-buffers-kill-terminal`)|Emacsを終了する|

### 編集

|Spacemacs|Emacs|説明|
|:--------|:----|:---|
|`S-a`<br>`C-x h`|`C-x h` (`mark-whole-buffer`)|全選択|
|`x` (`evil-delete-char`)|`C-d` (`delete-char`)|一文字削除|
|`d<text-obj>` (`evil-delete`)|(テキストを選択して) `C-w` (`kill-region`)|テキストを削除、キルリングへコピーする|
|`y<text-obj>` (`evil-yank`)|(テキストを選択して) `M-w` (`kill-region-save`)|キルリングへコピーする|
|`P` (`evil-paste-before`)|`C-y` (`yank`)|カーソルより前の位置でペーストする|
|`p` (`evil-paste-after`)|-|カーソルより後の位置でペーストする|
|`u`|`C-x u` (`undo`)|Undo|
|`C-r` (`redo`)|-|Redo|
|`SPC a u` (`undo-tree-visualize`)|-|変更履歴ツリーを辿って、Undo/Redoする|
|`r<char>` (`evil-replace`)|-|カーソル下の文字を`<char>`に置き換える|
|`cs<t1><t2>` (`evil-surround-change`)|-|囲んでいる`<t1>`を`<t2>`に置き換える<br>（`cs<[`など開き括弧を使うと置き換え時にスペースを追加する。`cs>]`など閉じ括弧を使うとスペースは追加しない。）|

テキストオブジェクト(`<text-obj>`)がよくわからない時は、`v`でビジュアルモードにして選択してから`d`や`y`を使う。

### 行操作

|Spacemacs|Emacs|説明|
|:--------|:----|:---|
|`dd`|`kill-whole-line`|現在の行を削除、キルリングへコピーする|
|`D` (`evil-delete-line`)|`C-SPC C-e C-w`|カーソルより後を削除、キルリングへコピーする|
|`yy`|-|現在の行をキルリングへコピーする|
|`Y` (`evil-yank-line`)|`C-SPC C-e M-w`|カーソルより後をキルリングへコピーする|
|`J` (`evil-join`)|-|今いる行と次の行を結合(Join)する。行間にスペースを挟む。|
|`gJ`(`evil-join-whitespace`)|-|今いる行と次の行を結合する。行間にスペースを挟まない。|

### 挿入ステートへ移行

|Spacemacs|Emacs|説明|
|:--------|:----|:---|
|`I` (`evil-insert-line`)|-|`^`の位置で挿入|
|`A` (`evil-append-line`)|-|`$`の位置で挿入|
|`o` (`evil-open-below`)|-|改行文字を追加して、次の行で挿入|
|`O` (`evil-open-above`)|-|改行文字を追加して、前の行で挿入|
|`c<text-obj>` (`evil-change`)|-|テキストを削除して、挿入|
|`ESC` (`evil-escape`)<br>`fd`|-|挿入ステートからエスケープする|

### 領域選択/ビジュアルステート

`v`でビジュアルステートへ移行する。
`SPC v` (`er/expand-region`) で領域を伸長するのも便利。

|Spacemacs|Emacs|説明|
|:--------|:----|:---|
|`s<text>` (`evil-surround-region`)|-|領域を`<text>`で囲む<br>`(`、`[`、`<html>`のような左右で違う文字もよしなに処理する|

### 矩形選択/ビジュアルブロックステート

`C-v`で矩形選択ステートへ移行する。

|Spacemacs|Emacs|説明|
|:--------|:----|:---|
|`I` 文字入力 `Esc`|-|矩形の左端に文字挿入|
|`A` 文字入力 `Esc`|-|矩形の右端に文字挿入|

### 移動

|Spacemacs|Emacs|説明|
|:--------|:----|:---|
|`C-l`|`C-l` (`recenter-top-bottom`)|現在行を画面中央、上、下に移動<br>`zz`、`zt`、`zb`をトグルする|
|`gg` (`evil-goto-first-line`)|`M-<` (`beginning-of-buffer`)|ウィンドウの先頭へ移動|
|`G` (`evil-goto-line`)|`M->` (`end-of-buffer`)|ウィンドウの末尾へ移動|
|`H` (`evil-window-top`)|-|今表示しているスクリーンの先頭に移動|
|`M` (`evil-window-middle`)|-|今表示しているスクリーンの中央に移動|
|`L` (`evil-window-bottom`)|-|今表示しているスクリーンの末尾に移動|
|`SPC j j` (`evil-avy-goto-char`)|-|ヒントで示した位置にカーソルを移動|
|`SPC j l` (`evil-avy-goto-line`)|-|ヒントで示した行にカーソルを移動|

### 検索

|Spacemacs|Emacs|説明|
|:--------|:----|:---|
|`/<keyword>`|-|順方向に検索|
|`?<keyword>`|-|逆方向に検索|
|`*`|-|今カーソルがある位置の単語を検索|
|`#`|-|`*`の逆方向|
|`//`|-|前回の検索を繰り返す|
|`:noh`|-|検索結果のハイライトをリセットする|
|`SPC s s` (`helm-swoop`)|-|grepの要領でバッファ内を検索する|

### 置換

|Spacemacs|Emacs|説明|
|:--------|:----|:---|
|`:%s/pattern/pattern/gc`|`C-M-%` (`query-replace-regexp`)|ファイル全体を確認して、置き換える|

### ファイル (`SPC f`)、バッファ (`SPC b`)

|Spacemacs|Emacs|説明|
|:--------|:----|:---|
|`SPC f f` (`spacemacs/helm-find-files`)|-|Helmインターフェースでファイルを開く|
|`:w`<br>`SPC f s`|`C-x C-s` (`save-buffer`)|ファイルを保存する|
|`SPC b b` (`helm-mini`)|-|バッファ、最近開いたファイルなどを串刺しで検索、開く|
|`SPC b d`|`kill-this-buffer`|バッファを閉じる|
|`SPC f o` (`spacemacs/open-file-or-directory-in-external-app`)|-|Windows、OS X、Linuxで関連付けたアプリでファイルを開く|
|`SPC f j`|`C-x C-j` (`dired-jump`)|diredを開く|
|`C-x RET f`|`C-x RET f` (`set-buffer-file-coding-system`)|バッファの文字エンコーディング、改行文字を設定、変更する|
|`SPC f e d` (`spacemacs/find-dot-file`)|-|.spacemacsを開く|
|`SPC f e R` (`dotspacemacs/sync-configuration-layers`)|-|.spacemacsを再読込する|

### ウィンドウ (`SPC w`)

|Spacemacs|Emacs|説明|
|:--------|:----|:---|
|`SPC w -`<br>`SPC w s`|`C-x 2` (`split-window-below`)|ウィンドウを水平分割|
|`SPC w /`<br>`SPC w v`|`C-x 3` (`split-window-right`)|ウィンドウを垂直分割|
|`SPC w d`|`C-x 0` (`delete-window`)|現在いるウィンドウを閉じる|
|`SPC w w`|`C-x o` (`other-window`)|他のウィンドウへ移動する|
|`SPC w u`|`winner-undo`|ウィンドウの構成を戻す|
|`SPC w W` (`ace-window`)|-|ヒントで示されたウィンドウへ移動する|
|`SPC 1`〜`SPC 9` (`winum-select-window-1`〜`9`)|-|N番目のウィンドウへ移動する|

#### セッション管理

elscreenのようなウィンドウセッションの管理をするために、Spacemacsには[eyebrowse](https://github.com/wasamasa/eyebrowse)のレイヤがある。
**2016/10/22追記:その後eyebrowseレイヤはなくなり、spacemacs-layoutsレイヤの一部になりました。.spacemacsで`dotspacemacs-distribution 'spacemacs`としている状態であれば、レイヤの設定を追加することなくeyebrowseが使えるようになっています。**

|Spacemacs|Emacs|説明|
|:--------|:----|:---|
|`g t` (`eyebrowse-next-window-config`)|-|次のワークスペースへ移動する|
|`g T` (`eyebrowse-prev-window-config`)|-|前のワークスペースへ移動する|
|`C-c C-w 0`〜`9` (`eyebrowse-switch-to-window-config-0`〜`9`)|-|N番のワークスペースへ移動する。なければ新規に作成する|
|`C-c C-w ,` (`eyebrowse-rename-window-config`)|-|ワークスペースの名前を変更する|
|`C-c C-w "` (`eyebrowse-close-window-config`)|-|ワークスペースを閉じる|

### ヘルプ (`SPC h`)

|Spacemacs|Emacs|説明|
|:--------|:----|:---|
|`SPC ?` (`helm-descbinds`)|-|キーバインドとコマンドの一覧を絞り込み検索する|
|`SPC <f1>` (`helm-apropos`)|-|コマンドの詳細|

## 設定

### 挿入ステートではEmacsのキーバインドで操作したい

挿入ステートではカーソル操作に`C-f`などEmacs風の操作ができない。  
困るようなら、編集スタイルをhybridに設定する。

```emacs-lisp:.spacemacs
   dotspacemacs-editing-style 'hybrid
```

### `C-;`で挿入ステートからエスケープする

`evil-escape`に直接キーバインドを設定する。

```emacs-lisp:.spacemacs
  (global-set-key (kbd "C-;") 'evil-escape)
```

### バージョンを更新する

新しいバージョンのSpacemacsがある場合は、Emacsのモードラインに↑が表示されるのでそれをクリックすればよい。

マニュアルで行いたい場合は、`git fetch`、`git reset --hard`する。

``` shell-session:fish
$ cd ~/.emacs
$ git fetch
$ git reset --hard (git tag -l --sort=-v:refname | head -n 1)
```

## 参考

- [Spacemacs documentation](http://spacemacs.org/doc/DOCUMENTATION.html)