[Emacs] インフラエンジニアへオススメするinit.el(その1) [elisp]

最近 `Emacs`の環境に慣れ親しみすぎて、そこから外へ出られなくなってきている今日この頃、みなさまいかがお過ごしでしょうか。今日は、本当に寒いですね。雨も降ったりする予報なのに、外に出てきたオレがバカちんです。

さて、`Emacs`です。何を今更と言われるかも知れませんが、紆余曲折、多くの Mac用 Text Editorの探訪に費やしたこの 8年間ですが、なんだかんだで結局 `Emacs`へ戻ってきてしまいました。
学生時代の`μEmacs`を使いながら、本家`Emacs`への憧れが私をここへ呼びよせたのでしょう。なるべくしてなったとしかいいようがありません。というか、Emacs 以外のキーバインドがしんどいです。

#これからのインフラエンジニアには Emacs だ
viを否定するわけではないです。設定ファイルの変更には、コレからも私は viを使うでしょう。[Neovim](http://blog.livedoor.jp/itsoku/archives/37353625.html)などいう話も出てきています。好きにしてください。

ただ、[SVE(Software Defined Envirionments)](http://www.ibm.com/smarter-computing/jp/ja/readynow/software-defined-environment.html)や[SDN(Software Defined Network)](http://www.atmarkit.co.jp/ait/articles/1304/08/news098.html) など、プログラマブルな基盤の変更は増加の傾向にあり、shellのみならず、これまで以上にインフラエンジニアへのプログラミングスキルの習得が臨まれています。きっと。
そもそも `chef`書けないと、これからはITエンジニアとして認めてもらえない噂も聞きます。Rubyを多少嗜んでおくことが重要な分かれ目になりそうです。

そこで `Emacs`です。

なんでかは自分で探せ( ﾟдﾟ )ｸﾜｯ!!

#インフラエンジニアへオススメする init.el 構成(その1)
さて、`Emacs`のその魅力と言えば、`Emacs lisp`(以下elisp)でしょう。本体自体が巨大な `elisp` インタプリタとなり、多くの機能が `elisp`によって提供されています。
しかしまぁ、この `elisp`が他の言語とちがって取っつきにくかったり、設定が意味不明だったり、たくさんありすぎて、何をどう組み合わせて使ったりすれば良いのか、わからんちんすぎて死にたいです。
他の人の init.elを見ても、定番は分かるものの、何故それが便利なのか分からないことが多いです。というか、プログラマ向けなので、インフラ屋さんには、無駄な機能であることも多く、(ﾟ⊿ﾟ)ｲﾗﾈ(　ﾟдﾟ)､ﾍﾟｯとなることこの上ないことがあります。

そこで、昔取った杵柄ではありませんが、インフラエンジニアの端くれとして、役に立つと見込んだ init.el をいくつか紹介しようというのがこのコーナーです。全10回を目標にがんばります。よろしくお願いします。

##Emacsを手に入れよう
まず、何はなくとも`Emacs`本体を手に入れましょう。

[Mac OS X](http://emacsformacosx.com/)用はここで配布されていますが、是非とも [inline patch適用済](http://sourceforge.jp/projects/macemacsjp/releases/?package_id=13490)を入手ください。自己コンパイルでも勿論構いません。あたしゃ萎えて、バイナリを入手しました。

- [Windows用公式](http://ftp.gnu.org/gnu/emacs/windows/)
- [Mac OS X用バイナリ](http://emacsformacosx.com/)
- [OS X 用バイナリinline patch適用済](http://sourceforge.jp/projects/macemacsjp/releases/?package_id=13490)
- Linux用 (各ディストリビューションにて配布)[公式](http://www.gnu.org/software/emacs/)

ショートカットや使い方は、勝手に学んでください。やり出すと切りが無い。ただ、Ctrl+pnbf で各々上下左右にカーソル移動できます。やったね。

##Macの人向けにオススメのカスタマイズ
Mac使ってるので、記事はMac偏重の内容となっています。仕方ない。

###inline patchの効果を発揮する

```lisp:init.el
;; 日本語IM用の設定
(setq default-input-method "MacOSX")
```

おまじないです。入れておいてください。

###日本語の設定
これもおまじないです。

```lisp:init.el
;; 日本語の設定（UTF-8）
(set-language-environment 'Japanese)
(prefer-coding-system 'utf-8)
```

###Marericks向け、default directory を ~/ へ変更する
Mavericksを使っていると、`Ctrl+x f` や `dired`したときに、`/` を参照するところから始まって、いちいち `~/` へ変更するのにイライラします。次のものを入れておきましょう。

```lisp:init.el
;; Mavericks用デフォルトディレクトリを"~/"にする
(setq inhibit-splash-screen t)
(defun cd-to-homedir-all-buffers ()
  "Change every current directory of all buffers to the home directory."
  (mapc
   (lambda (buf) (set-buffer buf) (cd (expand-file-name "~"))) (buffer-list)))
(add-hook 'after-init-hook 'cd-to-homedir-all-buffers)
```

###commandとoptionを入れ替える
「なんのために?!」
と思われるかも知れませんが、あたしゃ `Metaキー`が右手でもいじれないと困るので、`Metaキー`を `command` へ割り当ててます。
で、元々 `Metaキー`として割り当てられていた `option(alt)` を `super` キーとしてます。古参にはお勧めです。たぶん。

```lisp:init.el
;; CommandとOptionを入れ替える
(setq ns-command-modifier (quote meta))
(setq ns-alternate-modifier (quote super))
```

###'¥' を入力したら '\' と入力して欲しい
そのままですね、`Emacs`の場合、'¥'が役に立たないので、'\'となってもらうようにしましょう。

```lisp:init.el
;; '¥' を入力したら '\' となるように
(define-key global-map [?¥] [?\\])
```

'¥'を入力したくなった場合は、"えん" で日本語変換してください(ぉ

##標準の機能をカスタマイズする
`Emacs24`からは `package` 機能が便利に使えるようになって、新しく Package を入れやすくなりましたが、追加パッケージ系のオススメは次回以降にして、今回は build-in されている機能をenableにしたり、カスタマイズしてみます。これだけで、全然ちがいます。ステキ。

というか、今のところ、インフラエンジニア関係ない気がする。ヤバイ。

###警告音と画面のフラッシュをやめる
心穏やかな精神状態を保つためにも、warning時に発する警告音や、画面のフラッシュは止めておきましょう。ただ、警告されているかどうか分からなくなるので、素人には危険。

```lisp:init.el
;; 警告音もフラッシュも全て無効
(setq ring-bell-function 'ignore)
```

###バッファ内の同じファイル名を区別したい
やっとそれっぽくなってきました。
どう言うことかというと、`chef`で多くのファイルを更新しているときに、`default.rb`というファイルを多く開くことになります。なりませんか?
私はなります。
この場合、バッファを選択しようと `Ctrl+x b`なり `Ctrl+x Ctrl+b` すると `default.rb<2>` や `default.rb<4>` など知的生命体でも理解できないような、謎の割当数値で判別しなければならなくなります。
こんなやっかいなものを `default.rb<zabbix>` `default.rb<mysql>` など、その属するディレクトリ名で判別できるようにしてくれる、神様のような機能がコレです。
教えてくださった[組長](https://twitter.com/fujiwara)マジ感謝です。

```lisp:init.el
;; バッファの同一ファイル名を区別する
(require 'uniquify)
(setq uniquify-buffer-name-style 'post-forward-angle-brackets)
```

###現在のカーソル行を目立たせる
地味に必須の機能です。昨今の大画面では、カーソルがいとも簡単に行方不明になります。まず、カーソル探すところから始まる程度です。
そのために、これを入れておくと、心を穏やかにする効果があります。ぜひやっておきましょう。
ただ、一部の mini bufferではおかしくなるとき有りますけど、気にしないでね。

```lisp:init.el
;;; 現在行を目立たせる
(global-hl-line-mode)
```


###emacsのwindow幅に合わせて、分割数を変える
恐ろしく便利だったので丸パクリです。
Emacs画面のサイズに合わせて、ウィンドウを縦に勝手に分割してくれて、かつ、`Ctrl+x o`と 2段階ストロークの必要だったバッファ間移動を `Ctrl+t`のみで纏めてくれるという嬉しさ2倍の機能です。

詳しくはこちらをどうぞ。
[emacsのwindow幅に合わせて、分割数を変える](http://shibayu36.hatenablog.com/entry/2012/12/18/161455)

Emacs を起動してフルスクリーンにしたら、おもむろに `Ctrl+t`してから作業開始してください。その便利さに涙することでしょう。

```lisp:init.el
;; Window 分割を画面サイズに従って計算する
(defun split-window-vertically-n (num_wins)
  (interactive "p")
  (if (= num_wins 2)
      (split-window-vertically)
    (progn
      (split-window-vertically
       (- (window-height) (/ (window-height) num_wins)))
      (split-window-vertically-n (- num_wins 1)))))
(defun split-window-horizontally-n (num_wins)
  (interactive "p")
  (if (= num_wins 2)
      (split-window-horizontally)
    (progn
      (split-window-horizontally
       (- (window-width) (/ (window-width) num_wins)))
      (split-window-horizontally-n (- num_wins 1)))))

;; Window 分割・移動を C-t で
(defun other-window-or-split ()
  (interactive)
  (when (one-window-p)
    (if (>= (window-body-width) 270)
        (split-window-horizontally-n 3)
      (split-window-horizontally)))
  (other-window 1))
(global-set-key (kbd "C-t") 'other-window-or-split)
```

###バックアップファイルを作らない
インフラエンジニア向け最重要事項です。
`Emacs` では、default で `*~` とファイル名の最後に散るだのついたバックアップファイルを作りやがります。これが鬱陶しい。
バックアップや履歴管理は、今後、インフラエンジニアでも`git`や`svn`でするべきなので、金輪際、こんなバックアップファイルは不要です。そうは言ってもちょっと昔に戻したいって時については、次回以降でお話しします。

```lisp:init.el
;; バックアップファイルを作らないようにする
(setq make-backup-files nil)
;;; 終了時にオートセーブファイルを消す
(setq delete-auto-save-files t)
```

ついでに、変なオートセーブファイルが残っているものも、終了時に消してもらうようにお願いしました。


#まとめ
今回はMacの人向けにやっておいた方が良い設定と、build-inパッケージでオススメの設定をご紹介しました。

全然、インフラエンジニアと関係なさそうなところが、今後も期待ですね!

かしこ('A`)