Spacemacsに乗り換えてみた（２）キーバインド編

# はじめに

- ``Spacemacs``を使っていて設定したことを「[Spacemacsの乗り換えてみた（１）](https://qiita.com/shotakaha/items/da1282327f0dbc1b6289)」にちょこちょこ付け足していたが、なんだか長くなってきたので分割することにした


# キーバインドの設定

```emacs-lisp:dotspacemacs/user-config()の抜き出し
(defun dotspacemacs/user-config ()
  "Configuration function for user code.
This function is called at the very end of Spacemacs initialization after
layers configuration.
This is the place where most of your configurations should be done. Unless it is
explicitly specified that a variable should be set before a package is loaded,
you should place your code here."

  ...
  ;;; personal key-bindings
  (bind-key "C-h" 'delete-backward-char)
  (bind-key "s-{" 'previous-buffer)
  (bind-key "s-}" 'next-buffer)
  (bind-key "s-[" 'previous-multiframe-window)
  (bind-key "s-]" 'next-multiframe-window)
  (bind-key "C-x o" 'ace-window)
  (bind-key "C-x C-m" 'smex)
  (bind-key "C-x m" 'smex-major-mode-commands)
  (bind-key "C-x C-j" 'dired-jump)
  (bind-key "C-x g" 'magit-status)
  (bind-key "C-x M-g" 'magit-dispatch-popup)
  ...
  ;;; ivy-flx
  (setq ivy-re-builders-alist '((t . ivy--regex-fuzzy)))
  )
```

- ``~/.spacemacs``の``dotspacemacs/user-config()``の中に追記する
- キーバインドの他にも、ユーザ設定はここに書けばよい
- すでに``秘伝のinit.el``を持ってる人は、ここにコピペすればよい

```text:関数の説明の和訳
- ユーザ設定を書くための関数
- Spacemacsを起動後、一番最後に読み込まれる（レイヤーを使ったパッケージ読み込みよりも後）
- パッケージが読み込まれる前に設定すべき変数は例外だが、たいていの設定はここに書けばOK
```

- パッケージ読み込みの前に設定したい内容は``dotspacemacs/user-init()``に書けばよいらしい
- その関数の説明には「設定のタイミングがよく分かんなかったら、とりあえず``user-config()``に書いてみ？」と書いてある


# ``C-h``を``delete-backward-char``にする

```emacs-lisp:delete-backward-char
  (bind-key "C-h" 'delete-backward-char)
```

- ``Emacs``を使う場合に、まず設定すべきキーバインド（だと思っている）
- ``C-h``を``delete-backward-char``に置き換える
- ``Spacemacs``では``use-package``も使っているので、``bind-key``を使って設定した
- 今後、いろいろ追加する際、``bind-key``のほうが見通しよく書けるため


# バッファの移動をタブ感覚で

```emacs-lisp
  (bind-key "s-{" 'previous-buffer)
  (bind-key "s-}" 'next-buffer)
```

- 個人的にお気に入りのキーバインド
- ブラウザでタブ移動するときと同じキーバインドで、バッファ移動ができる！
- ``SPC b p``、``SPC b n``で同じことができる

# ウィンドウ移動を簡単に

```emacs-lisp
(bind-key "s-[" 'previous-multiframe-window)
(bind-key "s-]" 'next-multiframe-window)
(bind-key "C-x o" 'ace-window)
```

- これも個人的に好み
- バッファ移動と同じように``⌘ + ], [``で前のウィンドウ、次のウィンドウに移動できる
  - ``Spacemacs``だと``] w``、``[ w``に割り当てられている
- デフォルトの``C-x o (other-window)``は``ace-window``に置き換えた



# ``C-x C-m``を``smex``にする

```emacs-lisp:smex
  (bind-key "C-x C-m" 'smex)
  ;; (bind-key "C-x m" 'smex-major-mode-commands)
```

- ``Prelude``では``smex``を使っていたので、そのまま使えるようにしておいた
- ``smex-major-mode-commands``は、そのバッファのメジャーモードで使えるコマンド候補をリストするコマンド。``C-x m``は``mu4e-compose-new``に割り当てられているので、とりあえずコメントアウトしておく。


# ディレクトリを開く

```emacs-lisp:dired-jump
  (bind-key "C-x C-j" 'dired-jump)
```

- これも``Prelude``使っていたころの名残り
- ``jump``の意味がよく分からなけれど、いま表示されているバッファ（ファイル）があるディレクトリを``dired``バッファとして開く
- ``SPC f j``で同じことができる

# Magitを使いやすく

```emacs-lisp:magit-status
  (bind-key "C-x g" 'magit-status)
  (bind-key "C-x M-g" 'magit-dispatch-popup)
```

- ``Magit``は``git``レイヤーを使うとインストールされる（はず）
- ``matig-status``は``SPC g s``に割り当てられているが、なじみのある``C-x g``も追加した

# ``ivy``で曖昧マッチングをする

- キーバインドの設定ではないが、``ivy``を使っていて、使いにくいと感じた点を改善
- これまで使っていた``ido``では``ido-flx``にしていたので、``ivy``を使った候補の絞り込みも同様に「``fuzzy matching``（曖昧マッチング）」可能にした
- 変更点は [Better fuzzy matching support in Ivy](https://oremacs.com/2016/01/06/ivy-flx/) を参照（←``Ivy``作者の ``abo-abo``さんのブログ記事）
- ``Spacemacs``のデフォルトだと``ivy--regex-ignore-order``だったので、``ivy--regex-fuzzy``に変更した


# 目次

1. [Spacemacsに乗り換えてみた（１）導入編](https://qiita.com/shotakaha/items/da1282327f0dbc1b6289)
2. [Spacemacsに乗り換えてみた（２）キーバインド編](https://qiita.com/shotakaha/items/bba69546c6cd43ed4927)
3. [Spacemacsに乗り換えてみた（３）レイヤー編](https://qiita.com/shotakaha/items/364fca7d09596d636a8b)
4. [Spacemacsに乗り換えてみた（４）ウェブ制作編](https://qiita.com/shotakaha/items/dcd11c3afade2f0efb49)
5. [Spacemacsに乗り換えてみた（５）メーラ編](https://qiita.com/shotakaha/items/e2ba10457fa9b8d6e895)
6. Spacemacsに乗り換えてみた（６）LaTeX編（予定）