自分がEmacs でよく使うコマンド、キーバインド、モード

この記事はACCESS Advent Calendar 7日目の記事です。
こんにちは ACCESS開発本部IoT開発部の加藤 (@aKenjiKato ) です。

今回は自身が使っているEmacsに導入しているコマンドや設定しているキーバインド、モードを紹介します。

思い出した順で書いています。

---

# M-x open-junk-file

`~/.junk/`以下に適当な名前でカラのファイルを作ってくれます。
拡張子を指定すればそれに応じたメジャーモードになります。

私は長いデバッグログから特定の部分を抜いてその中でC-sとかしたいときはこれを使います。

```el:Cask
(depends-on "open-junk-file")
```

参考

* http://ongaeshi.hatenablog.com/entry/org-and-open-junk-memo-life
* http://qiita.com/akisute3@github/items/1d143b0b69e9aaf252ca


# C-s (isearch-forward) & C-o (helm-occur-from-isearch)

C-s(isearch-forward)でインクリメンタルサーチができますが、その状態で C-o (helm-occur) をするとバッファ内のマッチする文字列すべてが出てきます。

さらにその状態で文字列を打つと更に絞込ができます。

```el:Cask
(depends-on "helm")
```

```el:init.el
(define-key isearch-mode-map (kbd "C-o") 'helm-occur-from-isearch)
```

# git-gutter+-mode & C-x v = (git-gutter+-show-hunk)

git-gutter+-mode でバッファ右側にワークツリー上の変更点を表示できますが、
カーソルがある行を含むハンクを表示させたい場合は、C-x v = (git-gutter+-show-hunk)で表示できるようにしています。

```el:Cask
(depends-on "git-gutter-fringe+")
```

```el:init.el
(define-key git-gutter+-mode-map (kbd "C-x v =") 'git-gutter+-show-hunk)
```

# C-x c f (helm-multi-files)

現在開いているバッファ名、最近開いたファイル名、カレントディレクトリのファイル名から検索してくれます。
最近開いたファイル名は、`recentf`を使っているようです。

```el:Cask
(depends-on "helm")
(depends-on "recentf-ext")
```

```el:init
(setq recentf-max-saved-items 1000)
```

# C-x g f (helm-git-files)

今開いているファイルと同じGitのローカルリポジトリにあるファイルのファイル名をインクリメンタルサーチできます。
リポジトリにあるファイルを開くときの9割はこれを使っています。

```el:Cask
(depends-on "helm")
(depends-on "helm-git-files")
```

```init.el
(global-set-key (kbd "C-x g f") 'helm-git-files)
```

# C-x g g (helm-git-grep)

今開いているファイルと同じGitのローカルリポジトリにあるファイルの内容をインクリメンタルサーチできます。
gtags なくてもこれでそこそこいけます。

```el:Cask
(depends-on "helm")
(depends-on "helm-git-grep")
```

```el:init.el
(global-set-key (kbd "C-x g g") 'helm-git-grep)
```

# C-; (comment-dwim-2)

リージョンまたは今いる行を空気を読んでコメントアウト、アンコメントアウトします。

```el:Cask
(depends-on "comment-dwim-2")
```

```el:init.el
(global-set-key (kbd "M-;") 'comment-dwim-2)
(setq comment-dwim-2--inline-comment-behavior 'reindent-comment)
```

# M-/ (dabbrev-expand)

現在開いているバッファから補完します。連打すると次の候補に行きます。
ビルトインの機能ですが、シンプルで強力です。

# C-c r (anzu-query-replace)

リージョンまたはバッファ全体で一致する文字列を置換します。
通常のquery-replaceよりはるかに便利です。

```el:Cask
(depends-on "anzu")
```

```el:init.el
(global-anzu-mode 1)
(global-set-key (kbd "C-c r") 'anzu-query-replace)
```

# highlight-symbol

現在カーソルがある単語をハイライトします。
導入し始めは視覚的にやかましかったですが、スペルミスのチェックに役立つので今では手放せません。

```el:Cask
(depends-on "highlight-symbol")
```

```el:init.el
(setq highlight-symbol-idle-delay 0)
```

# C-a 連打 , C-e 連打 (sequential-command)

C-a, C-eは通常はbeginning-of-line, end-of-lineにバインドされていますが、
sequential-commandの導入で、それぞれ 行頭-バッファ先頭-元の位置、行末-バッファ末尾-元の位置を順に移動するコマンドになります。

これはすぐに病みつきになりました。

```el:Cask
(depends-on "sequential-command")
```

```el:init.el
(require 'sequential-command-config)
(sequential-command-setup-keys)
```

# electric-pair-mode

これを有効にすると、カッコを入力したときに、対応するカッコを自動的に入力してくれます。
パッケージだと思っていたのですが、ビルトインでした。
これ無しで仕事は考えられません。

```el:init.el
(electric-pair-mode t)
```

# uniquify

重複するファイル名のバッファがあった時、親フォルダ名をつけるなどしてわかりやすく表示してくれます。

関わっているプロジェクトではしょっちゅう別のフォルダの同じファイル名を開くので、これなしでは仕事ができません。危なくて。

```el:init.el
(require 'uniquify)
(setq uniquify-ignore-buffers-re "*[^*]+*")
(setq uniquify-buffer-name-style 'post-forward-angle-brackets)
```

# C-x j (goto-line)

ビルトインの機能ですが、一番早く打鍵できるキーにマッピングしてあります。
いつ設定したのか不明…
昔はこれがデフォルトだったような気がしなくもない。別のエディタから持ってきたのかも

```el:init.el
(global-set-key (kbd "C-x j") 'goto-line)
```

# M-y (helm-show-kill-ring)

Kill-ring (Emacs組み込みのマルチクリップボード的なやつ）の履歴を表示してくれます。
これまでにC-kやC-wで切り取った文字列がここに全部出てくるので、文字列を切り取ってスニペットとして使うのに便利です。

```el:Cask
(depends-on "helm")
```

```el:init.el
(global-set-key (kbd "M-y") 'helm-show-kill-ring)
```

# C-x C-f (helm-find-files), C-x b (helm-buffer-list), M-x (helm-M-x)

それぞれ find-files, switch-to-buffer, M-xの置換です。
インクリメンタルに絞り込みができます。

```el:Cask
(depends-on "helm")
```

```el:init.el
(global-set-key (kbd "C-x C-f") 'helm-find-files)
(global-set-key (kbd "C-x b") 'helm-buffers-list)
(global-set-key (kbd "M-x") 'helm-M-x)
```

----

時間が許す限り書きましたがこの辺りで締めとさせてください。

明日は @aKatsuhiroMihara さんです。
明日もよろしくお願いいたします。