まず普通の略語展開.やりたいことは,例えば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)