Emacs ベース環境構築

普段Emacsをよく使っており,仮想環境で新たにLinux環境を構築した場合もまずEmacsを入れている筆者です.
[Vagrant](https://ja.wikipedia.org/wiki/Vagrant_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))には毎回emacsインストールコマンドを書いてます.

Emacsが使えるだけで満足するならよかったんですが,自分好みにカスタマイズして普段使っているせいで,初期状態Emacsでは何かと不便になってしまった.

そこで普段Emacsを使う際の **ベース環境** を構築する手順を書いておきます.

## 内容
　**1. 事前準備**

　**2. .emacs記述による構築**
　　**2.1 表示関連設定**
　　**2.2 色設定**
　　**2.3 パッケージ関連設定**
　　**2.4 コード補完関連設定**

　**3. M-xコマンドによる構築**
　　**3.1 色設定**
　　**3.2 コード補完関連導入**

　**4. .emacs記述全体**

## 1. 事前準備
コード補完関連の構築に必要なものをまずインストール.

```
sudo apt-get install -y cmake clang
```

## 2. .emacs記述による構築
Emacsの設定には `.emacs` というファイルに色々と記述していく.
ちなみにほかの記事を調べると `.emacs.el` や `init.el` に記述などあるが,
今まで.emacsで全て設定できたので, `.emacs` を前提に書いていきます.
ちなみにファイルの設置場所は

```
$HOME/.emacs
```
です.

### 2.1 表示関連設定
```
(global-linum-mode t)
(menu-bar-mode -1)
(tool-bar-mode -1)
(setq inhibit-startup-message t)
(setq make-backup-files nil)
```
1行目は行番号を表示するための記述. 必須です.
以降は各種バー類を非表示にするものと,スタートアップ時のメッセージを非表示にする記述.
正直普段 `-nw` オプションで起動するため,あまり効果がない部分. 適宜設定.

### 2.2 色設定
この項目も.emacsに記述されるが,手動での入力は非推奨.
設定が反映されない可能性が高いので,後ほどの **2. M-xコマンドによる構築** で説明する.
ちなみにコメントアウトで以下のような警告文が表示される.

```
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
```
簡単に言うと,手動で変更するときはうまく機能しないので注意してくださいという感じです.

### 2.3 パッケージ関連設定
```
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)

(package-initialize)
```

後述する機能をインストールする際に必要になる設定.
Melpaというパッケージを使えるようにしておきましょう.
また `(package-initialize)` は,各種パッケージ設定を書いた後に実行する必要があるため,
Melpa以外にもパッケージを追加したい場合は必ずこの設定の前に書いてください.

### 2.4 コード補完関連設定
```:company
(when (locate-library "company")
  (global-company-mode 1)
  (global-set-key (kbd "C-M-i") 'company-complete)
  
  (setq company-idle-delay 0)
  (setq company-selection-wrap-around t)
  
  (define-key company-active-map (kbd "C-s") 'company-select-next)
  (define-key company-active-map (kbd "C-w") 'company-select-previous)
  (define-key company-search-map (kbd "C-s") 'company-select-next)
  (define-key company-search-map (kbd "C-w") 'company-select-previous)
  (define-key company-active-map (kbd "<tab>") 'company-complete-selection))
```

```:irony
(eval-after-load "irony"
  '(progn
    (add-to-list 'company-backends 'company-irony)
    (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
    (add-hook 'c-mode-common-hook 'irony-mode)
    (add-hook 'c++-mode-hook 'irony-mode)))
```

```:yasnippet
(eval-after-load "yasnippet"
 '(progn
    (define-key yas-keymap (kbd "<tab>") nil)
    (yas-global-mode 1)))
```

`company` + `irony` + `yasnippet` を用いてコード補完機能を構築.
companyの各種操作方法は好みで変えてもらって大丈夫です. 自分は左手でCtrl押しながら選択できるようにw,sでバインドしています.
また, `(setq ~)` は一つ目が補完候補が出るまでのディレイタイムです. デフォルトが0.5秒で少し待たないといけないので,0秒にしています.
二つ目は候補が一番下まで行った後に一番上まで戻れるようにするための設定です.
なおこの記述だけでは勿論実行されないので,後ほど **2. M-xコマンドによる構築** で
インストール手順を説明します.
companyとirony, yasnippetに関しては他記事の方が詳しく説明されているので,各自調べてみてください.
ちなみに先にパッケージをインストールしていないとemacs起動時にエラーが表示されると思います.
なのでインストール後にこの記述を書くのをお勧めします.

## 3. M-xコマンドによる構築
M-xコマンドを用いた各種設定を説明していきます.
ちなみにM-xは `Alt + x` です. MはMetaキーに由来してるとか.

### 3.1 色設定
先ほど説明した通り,手書き非推奨なのでコマンドで設定していきます.
設定したい部分にカーソルをもっていって(例えば変数の色を設定したい場合はintなどにカーソルを)

```
M-x describe-face RET
```
と入力する.
そうすると今回の例だと `Describe face (default ‘font-lock-type-face’): ` と表示される.
emacsでは `int` や `class` などにタイプが設定されており,それぞれに色を設定することでコードが見やすくなっている.
この状態でENTERキーを押すと,画面が分割されてこのフォントタイプの情報画面に移行できる.
ちなみにNo Windowモードで起動している場合はマウスでの操作切り替えができないので, `Ctrl-x + o`で操作切り替えができる.

次にこの設定画面内の１行目, `customize this face` 状にカーソルをもっていってENTERキーを押す.
下の方に行くと `[X]Foreground: color-xxx [choose] (sample)` という欄があるので,
chooseを押して色一覧が表示される. この中から各自好きな色を設定してください.

ちなみに環境やバージョンによってはForegroundではなく `[X]Inherit` になっている場合がある.
その時はすぐ下にある `Show All Attributes` をおして, Foregroundを選択してください.
設定終了後は上の方にある `[Apply and save]` または通常の保存同様 `Ctrl-x + Ctrl-s` で保存.

### 3.2 コード補完関連導入
```
M-x package-install RET irony RET
M-x package-install RET company-irony RET
M-x package-install RET yasnippet RET
M-x package-install RET flycheck RET
```

.emacs上でのパッケージ記述が間違っていなければ,問題なくインストールできると思う.
なおironyだけはインストール後に

```
M-x irony-install-server RET
```
を実行してください.　このコマンドを実行することでirony関連の設定をしてくれる.
※環境によっては既に実行されている場合もあるが，念のため以下のコマンドで再インストール推奨．

```
M-x irony-server-kill RET 
M-x irony-install-server RET
```


## 4. .emacs記述全体
最後に今まで設定してきたものを含めた.emacs全体を載せておきます.

```:.emacs
(global-linum-mode t)
(menu-bar-mode -1)
(tool-bar-mode -1)
(setq inhibit-startup-message t)
(setq make-backup-files nil)

;; faces color
;;(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 ;; '(font-lock-comment-face ((t (:foreground "color-71"))))
 ;; '(font-lock-constant-face ((t (:foreground "color-105"))))
 ;; '(font-lock-function-name-face ((t (:foreground "color-43"))))
 ;; '(font-lock-keyword-face ((t (:foreground "color-33"))))
 ;; '(font-lock-preprocessor-face ((t (:foreground "color-141"))))
 ;; '(font-lock-string-face ((t (:foreground "color-172"))))
 ;; '(font-lock-type-face ((t (:foreground "color-45"))))
 ;; '(font-lock-variable-name-face ((t (:foreground "color-179")))))

;; package
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(package-initialize)

;; yasnippet
(eval-after-load "yasnippet"
 '(progn
    (define-key yas-keymap (kbd "<tab>") nil)
    (yas-global-mode 1)))

;; company
(when (locate-library "company")
  (global-company-mode 1)
  (global-set-key (kbd "C-M-i") 'company-complete)

  (setq company-idle-delay 0)
  (setq company-selection-wrap-around t)

  (define-key company-active-map (kbd "C-s") 'company-select-next)
  (define-key company-active-map (kbd "C-w") 'company-select-previous)
  (define-key company-search-map (kbd "C-s") 'company-select-next)
  (define-key company-search-map (kbd "C-w") 'company-select-previous)
  (define-key company-active-map (kbd "<tab>") 'company-complete-selection))

;; irony
(eval-after-load "irony"
  '(progn
     (add-to-list 'company-backends 'company-irony)
     (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
     (add-hook 'c-mode-common-hook 'irony-mode)
     (add-hook 'c++-mode-hook 'irony-mode)))
```

色設定は完全に好みです.
コピペで使用できますが,色設定に関しては上述したようにコマンドでの設定をお勧めするので,
消してから使用してください. (一応コメントアウトはしてあります)

自分の中でのベース環境なので,ここからもっと拡張してもいいですし,これだけでもいいです.
あとは個人個人好きなように環境を作っていってください.