Spacemacsに乗り換えてみた（１）導入編

# はじめに

- ``Emacs Prelude``（ http://batsov.com/prelude/ ）から``Spacemacs``に乗り換えてみた
- なにか設定したら、メモを随時追記していく
- 最初は、そこら中に書いてあるけど、インストールから

# 動機

- ``Emacs`` : ``Vim``= ``95 : 5``くらい、普段は``Emacs``を使ってるんだけれど、たまに ``vim``も使うときがあるのでキーバインドを覚えたい
- でもやっぱり``Emacs``から離れたくない・・・というより離れられない
- ``evil``というパッケージがあるのは知っているけど、自分で設定するのは面倒だ
- ``Emacs`` + ``vim`` = ``Spacemacs`` !! （どんぴしゃ！）

# Spacemacsのインストール

- すでにemacsの設定（``~/.emacs.d/``）があったので、バックアップをとっておいた
- [Spacemacsの公式サイト](http://spacemacs.org/)にある``INSTALL``ボタンをクリックし、そこに書いてあるコマンドを入力した

```bash
$ mv ~/.emacs.d ~/.emacs.d.bk
$ git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
```

# Spacemacsの初期設定ウィザード

- ``Emacs``を起動すると``Spacemacs``のロゴが表示され、ウィンドウ下部のミニバッファに初期設定ウィザードが表示された
- 矢印キーと``Enter``キーで選択して進める
- 下記の3つの内容を設定した

## 編集スタイルの選択
```text
What is your preferred editing style ?
-> Among the stars aboard the Evil flagship (vim
   On the planet Emacs in the Holy control tower (emacs)
```
- ``vim``スタイルか``emacs``スタイルかを選択する
- ``Spacemacs``を使うなら、ここでは``vim``スタイルを選択するのがよいと思う
- と書いておきながら、あとで``hybrid``に変更した

## ディストリビューション（？）の選択
```text
What distribution of spacemacs would you like to start with ?
-> The standard distribution, recommended (spacemacs)
   A minimalist distribution that you can build on (spacemacs-base)
```
- フルパッケージ（``spacemacs``）か、ミニマムパッケージ（``spacemacs-base``）かを選択する
- フルパッケージを選択した


## 補完ツールの選択
```text
What type of completion framework do you want ?
-> A heavy one but full-featured (helm)
   A lighter on but still very powerful (ivy)
   None (not recommended)
```
- ``helm``か``ivy``かを選択する
- ``ivy``を選択した
- どちらを選ぶかは好みの問題
  - 僕は``helm``の使い方が結局よく分からず``ido``を使っていた、そっちに似ている``ivy``にした


## インストール完了

- 必要なパッケージのインストールがすべて終って完了！
- ``Quick Help``画面が表示されるので、とりあえず書いてあるとおりにキーを押して遊んでみた

![Screenshot 2018-07-19 15.15.33.png](https://qiita-image-store.s3.amazonaws.com/0/273122/feda7b7d-02c4-bed2-fd1e-20d9ef180ea5.png)

### ``Quick Help``に書いてあること

- 英語が読めれば不毛な作業をここに記しておく
- ``SPC h SPC``の動作は説明を読んでもよく分からず、実際に押してみてもよく分からず、なので、動作が理解できたときに修正する

| キー | 動作 |
|:-----:|-----|
| ``TAB`` or ``J`` | 次のボタンに移動 |
| ``Shift + TAB`` or ``K`` | 前のボタンに移動 |
| ``w`` | ``warning``一覧にジャンプ |
| ``r`` | ``recent file``一覧にジャンプ |
| ``p`` | ``project``一覧にジャンプ |
| ``b`` | ``bookmark``一覧にジャンプ |
| ``c`` | ``org-agenda``一覧にジャンプ |
| ``d`` | ``org-todo``一覧にジャンプ |
| ``o`` | リンクやボタンにジャンプ |
| ``m`` | トップのメニューにジャンプ |
| ``SPC`` | ``Spacemacs``コマンドを起動 |
| ``SPC f e d`` | ``~/.spacemacs``を開く |
| ``SPC h SPC`` | （よく分からない） |
| ``SPC s j`` | ドキュメントを読んでいるときに、見出しを移動 |


# キーバインド

## 終了・再起動（``SPC q``）

| キー | コマンド | 動作 |
|:-----:|-----|-----|
| ``SPC q r`` | restart-emacs-resume-layouts | 再起動 |
| ``SPC q q`` | prompt-kill-emacs | 終了 |
| ``SPC q d`` | restart-emacs-debug-init | デバッグモードで再起動 |


## ``Spacemacs``に関するドキュメント

| キー | コマンド | 動作 |
|:-----:|-----|-----|
| ``SPC h r`` | ivy-spacemacs-help-docs | [Spacemacs Documentation](http://spacemacs.org/doc/DOCUMENTATION.html) |
| ``SPC h l`` | ivy-spacemacs-help-layers | [Spacemacs Layer Lists](http://spacemacs.org/layers/LAYERS.html) |
| ``SPC h f`` | ivy-spacemacs-help-faq | [Spacemacs FAQ](http://spacemacs.org/doc/FAQ.html) |




## ヘルプ操作（``SPC h``）

| キー | コマンド | 動作 |
|:-----:|-----|-----|
| ``SPC ?`` | counsel-descbinds | キーバインドを調べる | 
| ``SPC h d`` | +help-describe | 調べる系 |
| ``SPC h d b`` | describe-bindings | キーバインドを調べる（``SPC ?``と一緒） |
| ``SPC h d f`` | describe-function | 関数を調べる |
| ``SPC h d m`` | describe-mode | 現在のバッファで有効になっているモードと使えるキーバインドを調べる |
| ``SPC h d p`` | describe-package | パッケージを調べる |
| ``SPC h d s`` | describe-system-info | システム情報をクリップボードにコピー（``*Message``バッファで内容を確認できる）|
| ``SPC h d v`` | describe-variable | 変数を調べる |


## ウィンドウ操作（``SPC w``）

| キー | コマンド | 動作 |
|:-----:|-----|-----|
| ``SPC w TAB`` | alternate-window | 別のウィンドウを移動 |
| ``SPC w 2,3`` | layout-double-columns | 縦に{2,3}分割 |
| ``SPC w f`` | follow-mode | follow-modeの切り替え |
| ``SPC w b`` | switch-to-minibuffer-window | ミニバッファに移動 |
| ``SPC w d`` | delete-window | ウィンドウを消去 |
| ``SPC w h,j,k,l`` | evil-window-{left,down,up,right} | 上下左右に移動 |
| ``SPC w W`` | ace-window | 移動するウィンドウを選択 |
| ``SPC w D`` | ace-delete-window | 消去するウィンドウを選択 |
| ``SPC w M`` | ace-swap-window | スワップするウィンドウを選択 |

## バッファ操作（``SPC b``）

| キー | コマンド | 動作 |
|:-----:|-----|-----|
| ``SPC b .`` | buffer-transient-state | バッファ移動ステート |
| ``SPC b b`` | ivy-switch-buffer | バッファを選択 |
| ``SPC b s`` | switch-to-scratch-buffer | ``*scratch*``バッファ |
| ``SPC b d`` | kill-this-buffer | バッファを削除 |
| ``SPC b h`` | home | ``Spacemacs``のホーム画面 |


## ファイル操作（``SPC f``）

| キー | コマンド | 動作 |
|:-----:|-----|-----|
| ``SPC f f`` | counsel-find-file | ファイルを開く |
| ``SPC f r`` | counsel-recentf | 最近使ったファイルを開く |
| ``SPC f j`` | dired-jump | ディレクトリを開く |
| ``SPC f J`` | open-junk-file | 仮ファイルを開く |

- デフォルトの``junk``ファイルの保存先は``~/.emacs.d/.cache/junk/``
- ``Google Drive``で同期できるように、シンボリックリンクにして使うことにした

```bash:junkへのシンボリックリンクを作成
$ cd .emacs.d/.cache/
$ rm -r junk
$ ln -s ~/Google\ Drive/junk/ .
```

## ``Spacemacs``の設定（``SPC f e``）

| キー | コマンド | 動作 |
|:-----:|-----|-----|
| ``SPC f e`` | +emacs(spacemacs) | ``Spacemacs``レイヤーの操作 |
| ``SPC f e d`` | find-dotfile | ``~/.spacemacs``を開く |
| ``SPC f e i`` | find-user-init-file | ``~/.emacs.d/init.el``を開く |
| ``SPC f e R`` | dotspacemacs/sync-configuration-layers | 設定ファイルを再読込み |


## Git操作（``SPC g``）

| キー | コマンド | 動作 |
|:-----:|-----|-----|
| ``SPC g s`` | magit-status | ``Magit``を起動 |


# 設定ファイル``dotspacemacs``の編集

- インストールが完了すると``~/.spacemacs``という設定ファイルができていた
- ``Spacemacs``の設定は、このファイルに記述する
- ``Spacemacs``内からは``SPC f e d``で開くことができる


## 編集スタイルの変更

```emacs-lisp
;; One of `vim', `emacs' or `hybrid'.
;; `hybrid' is like `vim' except that `insert state' is replaced by the
;; `hybrid state' with `emacs' key bindings. The value can also be a list
;; with `:variables' keyword (similar to layers). Check the editing styles
;; section of the documentation for details on available variables.
;; (default 'vim)
dotspacemacs-editing-style '(hybrid :variables
                                    hybrid-mode-default-state 'hybrid)
```


- さっそく編集スタイルを``vim`` → ``hybrid``に変更した
  - 105行目の``dotspacemacs-editing-style``を``vim`` → ``hybrid`` に修正
  - ``hybrid-mode-default-state``を``'normal``から``'hybrid``に変更
  - 詳しくはドキュメント参照 → [8.1 Editing Styles](http://spacemacs.org/doc/DOCUMENTATION.html#editing-styles)
- ``hybrid``に設定すると、バッファが編集モードのときに``Emacs``のキーバインドでカーソル移動ができるようになるので、``Emacs``出身の人はやっておくとよいと思う
- 「``Emacs``な人は``hybrid-mode-default-state``を``emacs``にするとよい」と、ドキュメントに書いてあるが、そうすると``ESC``を押しても``normal``モードに移行できなかったので、ここも``hybrid``にしたほうが、``Spacemacs``を使う恩恵が受けられるのでよいと思う


## フォントの変更

```emacs-lisp:dotspacemacs-default-fontを変更
(defun dotspacemacs/init ()
  (setq-default
   ...
   ;; dotspacemacs-default-font '("Source Code Pro"
   ;;                             :size 13
   ;;                             :weight normal
   ;;                             :width normal
   ;;                             :powerline-scale 1.1)
   dotspacemacs-default-font '("Source Han Code JP"
                               :size 13
                               :weight light
                               :width normal
                               :powerline-scale 1.1)
  ))
```

- デフォルトは ``Source Code Pro``に設定されている
- 日本語で書くことも多いので日本語フォント「[Source Han Code JP（源ノ角ゴシック Code）](https://github.com/adobe-fonts/source-han-code-jp)」に変更した
- 見た目の好みで ``weight``を``light``にした

# Batteries Included

- ``Emacs``も``Batteries Included``である
- （ちゃんとした）パッケージの場合、``Emacs``内蔵のマニュアルから参照することができる
- ウェブ記事でいろいろ探すのもよいが、マニュアルをちゃんと読めば分かることも多い

## 全体の操作

| コマンド       | 内容         |
|:-------------:|---------------|
| ``M-x info`` | マニュアル起動 |
| ``q``        | 終了          |
| ``H``        | コマンド一覧   |
| ``mノード``   | ``ノード``（目次）に移動 |
| ``T``        | 現在のパッケージの目次一覧を表示する |
| ``M-n``      | 現在のノードを別バッファにクローンする |

- ドキュメントを読んでいると、あっちみてこっちみてすることが多いので、そんなときに``M-n``は便利


## ノード間の移動

| コマンド       | 内容          |
|:-------------:|---------------|
| ``d``        | ルート・ノードに移動 |
| ``g``        | 指定したノードに移動 |
| ``]``, ``n`` | 次のノードに移動 |
| ``[``, ~~``p``~~ | 前のノードに移動 |
| ``^``        | 上のノードに移動 |
| ``<``        | 最初のノードに移動 |
| ``>``        | 最後のノードに移動 |
| ``f``        | 参考文献のノードに移動 |

- ``p``（前のノードに移動）は、``Spacemacs``だと使えないみたい

## ノード内の移動

| コマンド       | 内容          |
|:-------------:|---------------|
| ``C-n``, ``j`` | 次の行 |
| ``C-p``, ``k`` | 前の行 |
| ``TAB``      | 次のリンクに移動 |
| ``C-M-i``    | 前のリンクに移動；``Shift + TAB``と同じ |
| ``b``        | ノードの先頭に移動 |
| ``RET``      | リンク先に移動 |
| ~~``SPC``~~      | 1ページ進む（``Spacemacs``だと使えない）|
| ``DEL``      | 1ページ戻る |
| ``L``        | 履歴一覧を表示する |
| ~~``l``~~        | 履歴を戻る（``Spacemacs``だと使えない）|
| ``r``        | 履歴を進む |

- ``SPC``はプリフィックスに取られているので使えない。不便。``Shift + DEL``に割り当てようかな
- ``l``は``vim``の``l``に取られているので使えない。代わりに``L``から探せばよいので問題はない
- ``C-M-i``は``Shift + TAB``のほうが簡単

# 目次

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編（予定）