abbrevは通常はself-insert-commandを含む特定のinteractiveなコマンドにより展開されます。このセクションではそのようなコマンドの記述に使用されるサブルーチン、並びに通信のために使用される変数について説明します。
この関数はabbrevという名前のabbrevを表すシンボルをリターンする。そのabbrevが定義されていなければnilをリターンする。オプションの2つ目の引数tableはそれを照合するためのabbrevテーブル。tableがnilならこの関数はまずカレントバッファーのローカルabbrevテーブル、次にグローバルabbrevテーブルを試みる。
この関数はabbrevが展開されるであろう文字列(カレントバッファーにたいして使用されるabbrevテーブルで定義される文字列)をリターンする。これはabbrevが有効なabbrevでなければnilをリターンする。オプション引数tableはabbrev-symbolの場合と同じように使用するabbrevテーブルを指定する。
このコマンドは、(もしあれば)ポイントの前のabbrevを展開する。ポイントがabbrevの後になければこのコマンドは何もしない。展開を行うためにこれは変数abbrev-expand-functionの値となっている関数を引数なしで呼び出して、何であれその関数がリターンしたものをリターンする。
デフォルトの展開関数は展開を行ったらabbrevのシンボル、それ以外はnilをリターンする。そのabbrevシンボルがno-self-insertプロパティが非nilのシンボルであるようなフック関数をもち、そのフック関数が値としてnilをリターンした場合には、たとえ展開が行われたとしてもデフォルト展開関数はnilをリターンする。
この関数はstartとendの間のテキストを置換することによりabbrevのabbrev展開形を挿入する。startが省略された場合のデフォルトはポイント。nameが非nilなら、それはこのabbrevが見つかった名前(文字列)であること。これは展開形のcapitalizationを調整するかどうかを判断するために使用される。この関数はabbrevの挿入に成功したらabbrev、それ以外はnilをリターンする。
このコマンドはポイントのカレント位置をabbrevの開始としてマークする。expand-abbrevの次回呼び出しでは、通常のように以前の単語ではなく、ここからポイント(その時点での位置)にあるテキストが展開するべきabbrevとして使用される。
このコマンドは、まずargがnilならポイントの前の任意のabbrevを展開する(インタラクティブな呼び出しではargはプレフィクス引数)。それから展開する次のabbrevの開始を示すためにポイントの前にハイフンを挿入する。実際の展開ではハイフンは削除される。
これが非nilにセットされているときは、すべて大文字で入力されたabbrevはすべて大文字を使用して展開される。それ以外ならすべて大文字で入力されたabbrevは、展開形の単語ごとにcapitalizeして展開される。
この変数の値は次にabbrevを展開する開始位置としてexpand-abbrevに使用されるバッファー位置。値はnilも可能であり、それはかわりにポイントの前の単語を使用することを意味する。abbrev-start-locationはexpand-abbrevの呼び出しごとに毎回nilにセットされる。この変数はabbrev-prefix-markからもセットされる。
この変数の値はabbrev-start-locationがセットされたバッファー。他のバッファーでabbrev展開を試みることによりabbrev-start-locationはクリアーされる。この変数はabbrev-prefix-markによりセットされる。
これは直近のabbrev展開のabbrev-symbol。これはunexpand-abbrevコマンド(Expanding Abbrevs in The GNU Emacs
Manualを参照)のためにexpand-abbrevにより残された情報である。
これは直近の.abbrev展開の場所。これにはunexpand-abbrevコマンドのためにexpand-abbrevにより残された情報が含まれる。
これは直近のabbrev展開の正確な展開形を、(もしあれば)大文字小文字変換した後のテキストである。そのabbrevがすでに非展開されていれば値はnil。これにはunexpand-abbrevコマンドのためにexpand-abbrevga残sita情報が含まれる。
この変数の値は展開を行うためにexpand-abbrevが引数なしで呼び出すであろう関数。この関数では展開を行う前後に行いたいことを行うことができる。展開が行われた場合にはそのabbrevシンボルをリターンすること。
以下のサンプルコードではabbrev-expand-functionのシンプルな使い方を示します。このサンプルではfoo-modeが‘#’で始まる行がコメントであるような特定のファイルを編集するためのモードであるとします。それらコメント行にたいしてはTextモードのabbrevの使用が望ましく、その他すべての行にたいしては正規のローカルabbrevテーブルfoo-mode-abbrev-tableが適しています。local-abbrev-tableとtext-mode-abbrev-tableの定義については、標準abbrevテーブルを参照してください。add-functionについての詳細はEmacs Lisp関数にたいするアドバイスを参照してください。
(defun foo-mode-abbrev-expand-function (expand)
(if (not (save-excursion (forward-line 0) (eq (char-after) ?#)))
;; 通常の展開を行う
(funcall expand)
;; コメント内はtext-modeのabbrevを使用
(let ((local-abbrev-table text-mode-abbrev-table))
(funcall expand))))
(add-hook 'foo-mode-hook
(lambda ()
(add-function :around (local 'abbrev-expand-function)
#'foo-mode-abbrev-expand-function)))