■ Abbrev

略語展開

まず普通の略語展開.やりたいことは,例えばoutと入力して C-oを押すとSystem.out.println(" に展開されたりしてほしい.普通に入力するのはメンドイから.

略語とその展開語の対応一覧はデフォルトでホームディレクトリの .abbrev_defsに記録される.最初の設定は以下の通り. C-oに割り当ててるのはオレの趣味.

(cond ((file-exists-p "~/.abbrev_defs")
       (read-abbrev-file "~/.abbrev_defs")))
(setq save-abbrevs t)
;自動展開はしない
(add-hook 'pre-command-hook
	  (lambda ()
	    (setq abbrev-mode nil)))

(global-set-key "\C-o" 'expand-abbrev)

準備ができたらEmacsを再起動して適当なモードを開く. 全てのモードで共通の略語展開をさせることもできるし, Java-modeやC-modeなど,あるモード固有の略語展開をさせることもできる. 普通は後者かな.

例えばJava-modeを開いて(適当なJavaファイル開くなり,M-x java-modeするなり), outと入力する.そしてtの後ろにカーソルがある状態で

C-x a i l

とすれば,

Mode expansion for "out":

と尋ねてくるので,すかさず

Mode expansion for "out": System.out.println("

と入力する.あとは他にも色々登録するなりして

M-x write-abbrev-file

で保存するだけ. 明示的に保存しなくてもEmacsを閉じる時に保存するか聞いてくるかもしれない. これで登録が完了したはずなので,outと入力した状態で C-oを押せばSystem.out.println("に変わるはず. なお,グローバルな略語を登録したければ

C-x a i g

が使える.いちいちコマンドで登録するのがメンドかったら, .abbrev_defsファイルを直接いじればいい

動的略語展開

動的略語展開はわざわざ.abbrev_defsファイルを作らなくても,現在開かれている バッファの中身を参考にして勝手に展開しようというもの.例えばJavaのソースファイルを 編集してクラスを作ったとしよう.このときもう一つクラスを作ろうと思った時, clまで入力して動的略語展開機能を使うとclから始まる 単語(ソースファイル中に存在する場合)に順次変換される.例えばclass, close, といった具合だ.

この機能はかなり使えるので,オレはC-lに割り当てている. ただし,C-lはもともとカーソルのある行を画面中央に表示するためのrecenter が割り当てられているので,代わりにM-oをrecenterにしている.

ちなみにM-lには単語を順次小文字に変換していくコマンドが割り当てられて いるので一応残しておいた.使わないと思うけど1回だけ使ったことあるから.

(global-set-key "\C-l" 'dabbrev-expand)
(global-set-key "\M-o" 'recenter)