これが今の私の Emacs の設定です

[昨日のアドベントカレンダー](http://ainame.hateblo.jp/entry/2013/12/08/162032)で紹介されました catatsuy です！

せっかくのアドベントカレンダーですので，各言語の細かい設定ではなく，汎用的なものを中心に書いていきたいと思います！！


# 設計思想

[init-loader.el と package.el を導入して快適 Emacs ライフ - Qiita [キータ]](http://qiita.com/catatsuy/items/5f1cd86e2522fd3384a0)

私の記事ですが，基本的にこの記事に沿っています

今のところこれで破綻せずに管理できていますのでおすすめできる管理方法だと思っています

今回紹介する外部 elisp は全て package.el をから導入可能です


# GUI で使う

Emacs はターミナル上で使う事もできますが，私は IME との相性を考えて GUI で使うことにこだわっています

[EmacsでIMEと仲良くする - Qiita [キータ]](http://qiita.com/catatsuy/items/886f1e0632c0b2760fb4)

Ubuntu13.10 では IBus の劇的な仕様変更によりこの手法は適用できないようですが，私はまだ検証できていません


# Emacs で PATH を通して外部プログラムを使う

GUI の Emacs だと普通には PATH が通らないので Emacs 内で外部プログラムをうまく使えません

[EmacsでPATHの設定が引き継がれない問題をエレガントに解決する - Qiita [キータ]](http://qiita.com/catatsuy/items/3dda714f4c60c435bb25)

にあるように [purcell/exec-path-from-shell](https://github.com/purcell/exec-path-from-shell) を使いましょう

```el:21-exec-path-from-shell.el
(exec-path-from-shell-initialize)
```

として外部プログラムを呼び出す設定は `22-*.el` のように 21 より大きい番号をつけます

外部プログラムを呼び出す elisp として foreign-regexp と migemo が便利です

foreign-regexp を使うと perl/ruby/javascript の正規表現を使って検索できるようになります
自分が好きなものを使えばいいのですが，どの言語もコアに使っている人はパッケージなどでは入れず，PATH を特殊な方法で通しているはずなので PATH の設定が必要です

私は Ruby を使っているので以下のようにしています

```el:23-foreign-regexp.el
(require 'foreign-regexp)

(custom-set-variables
 '(foreign-regexp/regexp-type 'ruby)
 '(reb-re-syntax 'foreign-regexp))
```

migemo の設定は以下を参考にしてください

[migemoを使ってEmacsライフを快適に - Qiita [キータ]](http://qiita.com/catatsuy/items/c5fa34ead92d496b8a51)


# 最近開いたファイルを使う

世のエディタには最近開いたファイルを簡単に開けるようになっているものが多いです
しかし Emacs は最初の状態では使えません
そこで `recentf-ext` がおすすめです

私は最近使ったファイルの一覧からファイルを開くことが圧倒的に多いので，起動画面で最近使ったファイルを表示するようにして，かつ `C-x C-r` というショートカットキーで開けるようにしています
また自動保存するようにして異常終了などしてリストが消えることがないようにしています

以下が私の設定です

```el:21-recentf.el
;; 自動保存
(when (require 'recentf-ext nil t)
  (setq recentf-max-saved-items 2000)
  (setq recentf-exclude '(".recentf"))
  (setq recentf-auto-cleanup 10)
  (setq recentf-auto-save-timer (run-with-idle-timer 30 t 'recentf-save-list))
  (recentf-mode 1))

(global-set-key "\C-x\ \C-r" 'recentf-open-files)

;; 起動画面で recentf を開く
(add-hook 'after-init-hook (lambda()
    (recentf-open-files)
    ))
```


# プログラミングをする上で重要な設定

プログラミングをする上で重要な設定を書いていきます

すべて標準で入っていると思うので書くだけで動くと思います

## whitespace-mode でスペースとタブを可視化

複数人で開発をする上ではタブとスペースはコーディング規約に沿って使い分けをする必要があります
またスペースを変な位置にある状態でコミットをしないように気をつけないといけませんし，日本人特有の問題として全角スペースが変なところに混ざらないようにもしないといけません

これらを神通力で見るのは難しいので可視化しましょう

EmacsWiki が参考になります

[EmacsWiki: White Space](http://www.emacswiki.org/emacs/WhiteSpace)

また参考になる記事も紹介します

[Emacs - whitespace-modeを使って、ファイルの保存時に行末のスペースや末尾の改行を削除する - Qiita [キータ]](http://qiita.com/itiut@github/items/4d74da2412a29ef59c3a)

以下が私の設定です

```el:30-whitespace.el
(require 'whitespace)

(setq whitespace-style '(face tabs tab-mark spaces space-mark lines-tail trailing space-before-tab space-after-tab::space))
(setq whitespace-space-regexp "\\(\x3000+\\)")
(setq whitespace-display-mappings
      '((space-mark ?\x3000 [?\□])
        (tab-mark   ?\t   [?\xBB ?\t])
        ))
(global-whitespace-mode t)

(set-face-attribute 'whitespace-trailing nil
                    :foreground "DeepPink"
                    :underline t)
(set-face-attribute 'whitespace-tab nil
                    :foreground "LightSkyBlue"
                    :underline t)
(set-face-attribute 'whitespace-space nil
                    :foreground "GreenYellow"
                    :weight 'bold)
```

ちなみに私は標準で入っている elisp の設定は 30 番台に書くようにしています
単なる気分で分けているだけなので，深い意味はありません


## カーソルの位置を保存する

長いファイルになるとカーソルの位置も復元して欲しいので必須です

```el:30-saveplace.el
(require 'saveplace)
(setq-default save-place t)
```

## ファイル名

ライブラリの規約などで同じファイル名でディレクトリが違うというファイルを大量に作ることは往々にしてあると思います

デフォルトだとすごい適当な名前が付いて全く分からないので uniquify を使います

```el:30-uniquify.el
(require 'uniquify)

(setq uniquify-buffer-name-style 'post-forward)
```

## ファイルの最後に改行を挿入する

ファイルの最後に改行がないファイルというのは何かと扱いづらいことが多いです

自動で挿入するようにしておきましょう

```el:init.el
(setq require-final-newline t)
```


# おわりに

個々の言語の設定ではなく，極力汎用的な，Emacs ユーザーなら誰にでも当てはまりそうなものを厳選したつもりです
便利な設定が一つでも見つけられたなら幸いです

明日の担当は @ongaeshi さんです
Emacs を盛り上げていきましょう！！