突然だがEmacs を始めよう


2016/06/06 : 誤字脱字など細かいところを修正

目次
===================
 - 突然だがEmacs を始めよう
 - 1章：Emacs の基本概念
 - 2章：Emacs の基本操作
 - 3章：window / buffer操作
 - 4章:パッケージ管理
 - Tips
 - 感想
 - 参考資料





突然だがEmacs を始めよう
==================

## この文章の目的
「一生楽しく使えるエディタは何がいいかな？」と模索している人（私）が、「そういえばemacs ってどうなんだろう？苦手意識があったけどちょっと触ってみようかな」と思いたち、Emacs の練習と自分用チートシート作成を兼ねて作ったものです。参考にしたURL等は、最後に記載するので、そちらを参考にしてください。

 
### これを書いている人のバックボーン
 - Windows でvisual Stduio でC++を長年（中学から高校にかけて）書いていた。
 - Mac に乗り換え、Xcodeでアプリを書いたり、webのためにSublime Text でrails を書いてきたりした。
 - が、エンジニアとして生きていくには圧倒的に速度が足りないと思った。
 - そもそも**xcodeやSTでプログラムを書くのはさっぱり楽しくない**
 - C言語が母国語


### 注意事項
 - 練習しながら書いているので「これすげえええ」という感嘆符（~~ぶっちゃけどうでも良い感想~~）もついています。
 - 当然、初めて日が浅いので、間違っている箇所も有ると思います（ご指摘していただければ幸いです）
 - あくまで備忘録
 - vimやSTを批判しているわけではないです。念のため。


では、レッツemacs ！！


1章：emacs の基本概念
---------------------

### 画面の見方
 - window : 画面
 - Buffer : 同時にファイルを開くことが出来る。
 - Mode Line : 今開いているbuffer の情報
 - Mini Buffer :  コマンドに関する情報

### よく出てくる記号の意味
 - C : Ctrl の略。C-x という記述を見たら、Ctrl+x という意味。C-x u という記述を見たら、Ctrl+x を押した後、**Ctrlを離して**uを押す。この違い要注意。
 - M : Meta の略。Meta キーっていうものが昔あったらしい。今は人によってAltやEscで代用している。**メタキーを何にするかでEmacs 人生の豊かさが変わると入っても過言ではない**（Ctrlよりもメタキーで挫折する人は多いはず。私もそれで１回挫折している）メタキーの設定はわりと早めに変える事をおすすめするので、詳細はTIPSに。（Mac のデフォルトはEsc）



2章：emacs 基本操作
---------------------
起動

```
 emacs [filename]
```

emacs といちいち打つのがめんどくさいので、.bash_profile などに以下の記述をするといいと思います。

```
alias e=`emacs`
```

終了

```
 C-x C-c
```

コマンドから抜ける

```
  C-g
```

間違えて変なコマンドを打った場合、C-gで回避出来る。


### カーソルの移動
 通常のカーソルキーでも普通に可能だが、せっかくなので、色々頑張る
 
| 概要		| コマンド	| 備考		|
|---------------|---------------|---------------|
| 右（→）	| C-f		| fowrard	|
| 左（←）	| C-b		| back		|
| 上（↑）	| C-p		| previous	|
| 下（↓）	| C-n		| next		|
| 前の単語      | M-b          	|               |
| 次の単語      | M-n           |		|
| 前のページ    | M-v 		| 		|
| 次のページ    | C-v           | 		|
| 行頭		| C-a		| ???		|
| 行末		| C-e		| end		|
| ファイル先頭	| M-<		| 		|
| ファイル最後	| M->		| 		|

これに関しては、表にするより図にしたほうが分かりやすいなと思った。参考文献より引用させていただく。
![Emacs のカーソル移動](http://www.wakayama-u.ac.jp/~takehiko/webprg/03_files/emacskey1.gif)


上下左右の移動に関しては、正直使いにくいと感じた。特に、個人的に押しにくい@が致命的である。
慣れの問題なのだろうか……。
ファイル先頭とファイル行頭に関しては、先述のメタキーを自分好みに変更していると楽になると思う。
単語ごとの移動はわりとよくあると思う。これも、やはりメタキーの修正によって解決するのが良いと思う。

### 編集系操作
| 概要		| コマンド	| 備考		|
|---------------|---------------|---------------|
|改行		| C-j		|		|
|範囲選択終了	| ???		|		|
|コピー		| M-w		| 		|
|カット		| C-w		| 		|
|貼り付け	| C-y		|		|
|削除		| C-d		| delete	|
|Undo		| C-x u		| 		|
|Redo		| C-g C-/ 	| 謎		|

注意すべきは、**デフォルトで、C-h がbackspaceではないこと**である。これを解決するには、以下の設定を.emacsに記述してあげると良い。（デフォルトでhelpを呼び出すが割り当てられているが、特に困らないので上書きしてしまう。

```
(keyboard-translate ?\C-h ?\C-?)
```

さて、問題はredo である。デフォルトだと、どうも１回しかredoできないらしい。それを解決するためにredo-treeというプラグインを導入するといいそうだ。詳細は4章のプラグインの項目でまとめたので、そちらを参考にしてほしい。


### 検索・置換
| 概要		| コマンド	| 備考				|
|---------------|---------------|-------------------------------|
| 検索		| C-s		| search			|
| 逆方向	| C-r		| reverse			|
| 置換		| M-%		| y:yes n:no !:all  q:quit	|


ここで注意すべきは、emacsはデフォルトで、**大文字と小文字を区別しない** ことです。


置換は、少し練習が必要です。僕はなれるのに少し苦労しました。


### ファイル操作

|概要		|コマンド	|			 備考   |
|---------------|---------------|-------------------------------|
| open		| C-x C-f	| ファイル名を指定して開く	|
| save		| C-x C-s	| 保存				|
| Save as	| C-x C-w	| 名前を変えて保存		|


3章：window / buffer 操作
-----------------------------
ウィンドウやバッファの操作はemacsの利便性を圧倒的に向上させるために肝になると思います。まぁ、それはvimも変わらないのですが、vimよりも大事。なぜならEmacs は引きこもり文化なので、可能な限りemacs の中で完結するように設計されている……。

### window操作

|概要			|コマンド	|			 備考   |
|-----------------------|---------------|-------------------------------|
| 上下分割:horizontal	| C-x 2		|				|
| 左右分割:vertical	| C-x 3		| 				|
| ウィンドウ切り替え	| C-x o		| オーです			|
| ウィンドウを閉じる	| C-x 0		| ゼロです			|
| 分割を全て解除	| C-x 1		|				|

さて、ここで注意すべきは、最初にもあった window と buffer の違いである。
window を分割した後、片方のwindowに対して、違うbufferを紐付けて上げると複数のファイルが同時に書ける。なので、対象のwindow に、C-x oで移動してあげて、C-x C-f で新しくファイルをオープンしてあげるといいと思います。

### buffer 操作

|概要			|コマンド	|			 備考   |
|-----------------------|---------------|-------------------------------|
| buffer listの表示	| C-x C-b	|				|
| buffer の切り替え     | C-x b         | 編集中のバッファを切り替える  | 
| delete flag		| d   		| 削除フラグをつける		|
| save flag		| s		| 保存フラグをつける		|
| run  			| x		| 保存/削除の実行		|
| unmark		| u		| フラグを解除する		|
| quit			| q 		| バッファメニューを終了	|

buffer の操作は練習必須である。これに慣れると慣れないではemacs力がぜんぜん違うなと感じた。

さて、buffer list を表示させると、新しくwindowが作られ、そのバッファ内にこんな文字列が表示される

```
CRM Buffer                 Size Mode             File
. * emacs.md               5461 Fundamental      ~/bussorenre/1day100line/emacs.md
    *scratch*               191 Lisp Interaction
 %* *Messages*             2041 Message
```

<dl>
  <dt>C - current</dt>
  <dd>現在見ていたバッファなら. </dd>
  <dt>R - read only</dt>
  <dd>読み込み専用バッファなら%</dd>
  <dt>M - modified</dt>
  <dd>変更があったバッファなら*</dd>
  <dt>Buffer</dt>
  <dd>バッファの名前。ファイルに紐付いていないものは*--*で表記される</dd>
  <dt>Mode</dt>
  <dd>バッファのモード</dd>
  <dt>File</dt>
  <dd>バッファに紐付いているファイル</dd>
</dl>

C-x o でwindowを移動し、buffer list を操作する画面にて、上記のp,n, d,s,x が使用できるようになる。d(バッファを閉じる) s(バッファをファイルに保存する)等の設定を指定した後、xでまとめて実行出来る。バッファが閉じられるだけで、ファイルが消えるわけではないのでご安心を。

次に、C-x b による編集中のバッファの切り替え。これは、このコマンドを叩くと、どのバッファに切り替えますか？みたいなメッセージが出てくる。この時、何もタイプしないでEnterキーを押すと、と、*scratch* といって、新規バッファが作成される。

なお、バッファ間で、ヤンク領域（コピペした内容）は共通で保持されるので、片方のバッファでC-@ M-w でコピーしたものをもう片方のバッファへ移動し（C-x o）ペースト（C-y) してあげる事が出来る。



４章：パッケージ管理
------------------------------
Emacs といえば、そのカスタマイズ性能の凄さが売りらしい（使いこなせていないけど、いつかガンガン使いこなしたい)
Emacs 24 からパッケージ管理がデフォルトで出来るようになったらしい（package.el というものがあるらしい）

まず、emacs の設定ファイルは主に``~/.emacs.d/init.el``に記述していきます。
これから、様々な設定をこのファイル書き込んでいくことになります。

まずは、package.elを有効化するための設定を、以下のように記述します

```lisp:init.el
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/") t)
(package-initialize)
```


デフォルトのパッケージのインストール元だけだと、人気のある有名なパッケージがインストール出来ないらしいので、上のようにmelpaというパッケージリストと、marmalade というパッケージリストを追加する。

以降、パッケージをインストールするには、

```
M-x list packages 
```

を実行することにより、パッケージ一覧バッファなるものが開く。そこから選択してインストールすることが出来る。
![パッケージリストを起動する](https://qiita-image-store.s3.amazonaws.com/0/12665/06c30e07-34f1-495f-1ad9-d9f53713651a.png)
すげえええええ＼(^o^)／
なお、pで上、nで下、enter でインストール, qで終了といった操作感です。

パッケージリストの更新は以下のコマンドで行います

```
M-x package-refresh-contents
```



これでどんどんパッケージインストールが出来るどん！
以下、絶対的に必須だと思ったパッケージのインストールと設定を行います。

### auto-complete 

後々コード補完のためのカスタマイズなども行うため、真っ先に入れておいて損がないなと思ったパッケージ。入れます

パッケージのインストール

```
M-x package-refresh-contents
M-x package-install auto-complete
```

インストールが終わったら、init.elの最後の方に追記

```
;;
;; Auto Complete
;;
;; auto-complete-config の設定ファイルを読み込む。
(require 'auto-complete-config)

;; よくわからない
(ac-config-default)

;; TABキーで自動補完を有効にする
(ac-set-trigger-key "TAB")

;; auto-complete-mode を起動時に有効にする
(global-auto-complete-mode t)
```

auto-complete が有効になっていると、emacs の下の方にAC という表記がある。
![auto-completeを有効にしたinit.el の編集風景](https://qiita-image-store.s3.amazonaws.com/0/12665/443d2876-19a6-5752-c1ac-e8b7cd40bdc0.png)

うおおおおおおおおやっとここまで来たか！！笑

昔、package.el がなかった時代にemacsを始めてたら間違いなくここで挫折していたと思う。感謝。
そして当然ながらauto-complete なる偉大なるプラグインを作っている方にも大感謝


### undo-tree
 一部の人にはgit 不要とまで言わせる代物らしい（違）こちらもauto-complete と並んで必須だと思うのでインストールし設定を記述する。 emacs 素人の私にとって最も大きな機能としては、redoが相当使えるものになること。でも、それだけじゃないらしい。


undo-tree のインストール
```
M-x package-install undo-tree
```

init.el に以下を追記

```
;; 
;; undo-tree
;;
;; undo-tree を読み込む
(require 'undo-tree)

;; undo-tree を起動時に有効にする
(global-undo-tree-mode t)

;; M-/ をredo に設定する。
(global-set-key (kbd "M-/") 'undo-tree-redo)
```

これにより、M-/ でredoが何度もできるようになる。やったねたえちゃん！





Tips - .emacs の設定等
----------------

「こういうところ、デフォルトのままじゃ使いにくいな」って思ったところを変えたりして、より楽しくするための設定変更などを集めてみました。本気でカスタマイズするとEmacs Lisp がーーーとか言い出しそうで、それは今日のスコープじゃないということで次回に回します。


### Mac の環境設定をそもそも変える。
 システム環境設定 -> キーボード
 - キーのリピート：最速
 - リピート入力認識までの時間：最短

にするとわりとヌルヌル動き始めたのでいいと思います。


### より楽にC/Mを打てるようにする。

 - 日本語キーボード を使う。もしくは、USキーボードでも、Ctrl をCapslock と入れ替える。要するにaの右にctrl キーがある状態にする。これは非常に便利。
 - Meta キーを左Command キーに割り当てる。Cmd キーに割り当てる弊害があるが、それをiTerm の設定でカバーしてあげる。
![キーボード環境設定](https://qiita-image-store.s3.amazonaws.com/0/12665/3917be57-7f36-a10c-6ad6-9f0e5d47271b.png)


.emacs に以下のように記述してあげる。

```
(when (eq system-type 'darwin)
    (setq ns-command-modifier (quote meta)))
```

で、次はiTerm 2 の設定を変更する。

 - Profiles → Keys：Left option (⌥) key acts as で +Esc をチェック
 - Profiles → Keys：Right option (⌥) key acts as で +Esc をチェック
 - Keys → Remap Modifier Keys で Left ⌘を Left optionにリマップ
 - Keys → Global Shortcut Keys でショートカット設定
    - Command-Tab を "Do Not Remap Modifiers" に設定。これで⌘-Tabは iTerm2 に捕捉されなくなり、ウィンドウ切り替えができるようになる
    - Control-Command-Enter を "Do Not Remap Modifiers" に設定。これは自分の環境での Spotlight検索ショートカットキーなので、これもiTerm2に捕捉されないようにした

このへんはまんま参考資料の**MacのiTerm/Emacsでメタキーを快適に使いたい**を参考にした。

ただ、個人的にまだまだemacs使いになりきれていないので、左Cmd+v によるペーストが無効にされたのがやや辛かった笑



### .emacs を書き足し、少し便利にする

細かい設定等は、Emacs Lisp を覚えたら真剣に取り組もうと思うが、さしあたって必要なことを.emacs に記述を追加してく。ガチでやるとEmacs Lisperになってしまうので、今回はそこそこで諦める


```
(set-language-environment 'Japanese)    ; 日本語環境
(set-default-coding-systems 'utf-8-unix)    ; UTF-8 が基本
(set-terminal-coding-system 'utf-8-unix)    ; emacs -nw も文字化けしない
(setq default-file-name-coding-system 'utf-8)
(setq default-process-coding-system '(utf-8 . utf-8))
(prefer-coding-system 'utf-8-unix)


;; ロックファイル / バックアップファイルを作成しない
(setq create-lockfiles nil)
(setq make-backup-files nil)
(setq delete-auto-save-files t)


;; 対応するカッコを強調表示
(show-paren-mode t)

;; 時間も表示させる。
(display-time)

;; 行番号を常に表示させる
(global-linum-mode)
(setq linum-format "%4d ")

;; 現在行を目立たせる
(setq hl-line-face 'underline)
(global-hl-line-mode)

;; テーマを設定する
(load-theme 'manoj-dark t)
```





Emacs を練習してみて（感想）
-------------------------------

### なぜvimを選択しなかったのか
 - サーバー管理用にvimはある程度は覚えた。
 - ちょっとした設定ファイルを書き換えるくらいの使い方をしている。
 - **どうしてもhjklに慣れることができなかった。**
 - 特にはっきりした理由はないが、vim でプログラムを書くのはなにか違うなと思った。
 - これも特にはっきりした理由はないが、vim でCを書くのは楽しくなかった。

上記の通り、特にこれといった明確な理由はないのです。冒頭の通り「emacs をちょっと触ってみよう」くらいの気持ちなので、そこを詰められても困ります……汗


### 慣れたらそんなに小指は平気だった。
むしろ私は右手に変な負荷がかかっており、右手のほうがよっぽどしんどい。
左手小指は平気でした。ただ、だんだんと左Shift、左ctrl、tabの区別がだんだんつかなくなってきており、ちょっと練習が必要だなと思いました。

### emacs のキーバインドはどこでも使える
歴史的な経緯が有ると思うのですが（調べておきます）Emacs のキーバインドはどこでも使えるので、上記の押し間違えの課題さえクリアすれば、vimよりも汎用的で、早いタッチタイピングが実現出来るかも知れません。

### 練習するしか無い事
 - C-p （pが右手の小指で押さねばならない。難しい）
 - Ctrl とshift の押し間違い
 - 頑張って、C-j練習するから、C-j で、日本語変換も確定してほしい（設定を変えればなんとか出来そう

### emacs lisp へ
自分のemacs力が上がってきたら、次はemacs lisp にも挑戦したいですね。

### emacs の弱点
emacs は並列動作が苦手らしい。まぁ、エディタとしてなら十分なんですけど、プラットフォームとして使っている本物のemacs 使いさんには致命的な欠点らしい。その辺もいつか、考慮に入れて行きたいところ。

### 本当に感想と、これから
漠然とした苦手意識を捨てて、もっと早くemacs と向き合うべきだったと反省している。それくらい、これを書きながらemacs の設定ファイルをいじったり、歴史について学んだりするのは楽しかった。けれど、大学一回生の時に触って挫折した経験もあるので、やはり敷居が高い物であるのは間違いない。相性の問題もあるので、vim がなんとなく嫌だなと思ったり、ST やAtom というモダンで素晴らしい環境に飽きてきたら触ってみる。くらいでいいのかもしれない。

この文章ではまだ、個人的に設定した以下の２つの目標を成し遂げていない。

 - Emacs で楽しくruby を書く環境を整える。
 - Emacs でVisual Studio よりも楽しくC を書く環境を整える。

これは本気でやると、またすごいボリュームになると思ったので、別の記事でやろうと思う。



参考資料
------------------

 - [Emacs入門 - ドットインストール](http://dotinstall.com/lessons/basic_emacs)
 - [Emacs でMarddown プレビュー](http://qiita.com/gooichi/items/2b185dbdf24166a15ca4)
 - [Emacs のC-h をbackspace として使用する - 勉強日記](http://akisute3.hatenablog.com/entry/20120318/1332059326)
 - [Emacs | バッファーメニュー](http://emacs.okaboshi.info/2014/04/18/%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC/)
 - [Emacs を使って，文章を書く - Linux による Web プログラミング入門](http://www.wakayama-u.ac.jp/~takehiko/webprg/03.html)
 - [MacのiTerm/Emacsでメタキーを快適に使いたい - Qiita](http://qiita.com/hayamiz/items/0f0b7a012ec730351678)
 - [EmacsでRubyの開発環境をさらにめちゃガチャパワーアップしたまとめ | Futurismo](http://futurismo.biz/archives/2213)
 - [enhanced-ruby-modeの概説 - Qiita](http://qiita.com/vzvu3k6k/items/acec84d829a3dbe1427a)
 - [auto-completeを使ってEmacsの補完を便利にする - 計算物理屋の研究備忘録](http://keisanbutsuriya.hateblo.jp/entry/2015/02/08/175005)
 
資料が膨大すぎてどこをリファレンスすれば良いのか悩むくらいすごいサイト

 - [るびきち「日刊Emacs」](http://rubikitch.com/)


るびきちさんの書かれた「emacs テクニックバイブル」を購入したので、休暇とかにちまちま読もうと思います。


以上