Emacsの単語略称機能

Emacsにはデフォルトで動的略称機能とAbbrevモードの2種類の機能が備わっている。

動的略称機能

編集中のバッファ内に存在する単語を動的に検索して補完してくれる。
ある単語を途中まで入力し、


M-/
または、

M-x dabbrev-expand
とコマンドすると、ポイントから最も近い単語を補完する。
M-/を繰り返し打つことで他に該当する単語に切り替わる。
この機能はモードではないので常に有効。

Abbrevモード

入力が面倒くさい文字列に対して略称を付けることができる機能。
たとえば、略称Aと展開後の単語Bの組み合わせを登録しておくことで、バッファ編集中にAを入力してSpaceを押すとBに変換してくれる。
この機能を有効にするには、


M-x abbrev-mode
としてマイナーモードであるAbbrevモードを有効にする必要がある。(モードラインにAbbrevが表示される)
このコマンドはAbbrevモードを有効/無効にするトグルなのでもう一度上のコマンドを打つと無効(デフォルト)に戻る。


略称を定義する

展開後にしたい文字列をリージョンで指定して


C-u 0 M-x add-global-abbrev
と打つと、

Global abbrev for "xxxxx":
とメッセージが出るので略称を入力してEnterを押す。
add-global-abbrevの代わりにadd-mode-abbrevを使うと、編集中バッファのモードでのみ有効になる略称が定義される。
定義済み略称は、

M-x list-abbrevs
で一覧表示できる。
また一覧表示された略称定義を直接編集・削除することもできる。


略称定義を永続化する

上のコマンドで登録した略称はEmacsを終了すると消えてしまうので定義ファイルに残す必要がある。


M-x write-abbrev-file
と打ち、~/.abbreb_defs(任意)とファイル名を指定する。
これで.abbreb_defsに略称定義が保存される。
Emacsを再起動して

M-x list-abbrevs
と打つと、さっき定義した略称定義は消えているが、

M-x read-abbrev-file
として定義ファイルを読み込むと前回定義した略称が再び定義される。
.emacsファイルに以下のように設定すればEmacs起動時にAbbrevが有効になり略称定義も読み込み済みとなる。

(setq-default abbrev-mode t)
(read-abbrev-file "~/.abbrev_defs")
(setq save-abbrevs t)


Abbrevモードの応用

ruby-modeなど言語用のメジャーモードの補完機能も基本的にはこのAbbrevモードを使っているようだ。
たとえば、rails.elでは補完機能を実現するためにsnippet.elというライブラリを使っているが、
このsnippet.elの内部でAbbrevを利用している。