略語は通常、self-insert-command
を含む特定のインタラクティブコマンドによって展開されます。本節では、こうしたコマンドの記述に使用されるサブルーチンと、通信に用いられる変数について説明します。
この関数は、abbrev という名前の略語を表すシンボルを返します。その略語が定義されていない場合は
nil を返します。オプションの第2引数 table
は、検索対象とする略語テーブルです。table が nil の場合、この関数はまず現在のバッファのローカル略語テーブルを、次にグローバル略語テーブルを検索します。
この関数は、abbrev
が展開される文字列(現在のバッファで使用されている略記テーブルで定義されたもの)を返します。abbrev
が有効な略記でない場合は、nil を返します。オプション引数 table は、abbrev-symbol
と同様に、使用する略記テーブルを指定します。
このコマンドは、ポイントの前に略語がある場合にそれを展開します。ポイントが略語の後に続かない場合、このコマンドは何もしません。展開を行う際は、abbrev-expand-function
変数の値である関数を引数なしで呼び出し、その関数が返した値を返します。
デフォルトの展開関数は、展開が行われた場合は略記記号を、そうでない場合は nil
を返します。略記記号に、no-self-insert プロパティが non-nil である記号のフック関数が定義されており、そのフック関数が値として nil を返す場合、展開が行われたとしても、デフォルトの展開関数は nil を返します。
この関数は、abbrev の略語展開を挿入し、start と end
の間のテキストを置き換えます。start が省略された場合は、デフォルトで point
となります。name が nil
でない場合、それはこの略語が見つかった際の名称(文字列)である必要があり、展開後の大文字・小文字を調整するかどうかを判断するために使用されます。略語が正常に挿入された場合は
abbrev を、そうでない場合は nil
を返します。
このコマンドは、pointの現在位置を略語の開始位置として指定します。次にexpand-abbrevを呼び出した際は、通常通り直前の単語を使用するのではなく、ここからpoint(その時点での位置)までのテキストを展開用の略語として使用します。
まず、このコマンドは、arg が nil
でない限り、ポイントより前のあらゆる略語を展開します。(対話モードでは、arg
がプレフィックス引数となります。)次に、次に展開される略語の開始位置を示すため、ポイントの前にハイフンを挿入します。実際の展開では、このハイフンが削除されます。
これを non-nil
に設定すると、すべて大文字で入力された略語はすべて大文字で展開されます。それ以外の場合は、すべて大文字で入力された略語は、展開後の各単語の先頭を大文字にして展開されます。
この変数の値は、expand-abbrev
が次に展開する略語の開始位置として使用するバッファ位置(整数またはマーカー)です。また、値は nil
とすることもでき、その場合は代わりにポイント直前の単語を使用します。expand-abbrev
が呼び出されるたびに、abbrev-start-location は nil に設定されます。この変数は abbrev-prefix-mark によっても設定されます。
この変数の値は、abbrev-start-location
が設定されているバッファです。他のバッファで略記を展開しようとすると、abbrev-start-location がクリアされます。この変数は abbrev-prefix-mark によって設定されます。
これは、直近で展開された略語の abbrev-symbol です。この情報は、unexpand-abbrev コマンドのために expand-abbrev によって残されています(The GNU
Emacs Manual の Expanding
Abbrevs を参照してください)。
ここは、直近で略語が展開された箇所です。ここには、unexpand-abbrevコマンドのためにexpand-abbrevが残した情報が含まれています。
これは、ケース変換(ある場合)後の、直近に展開された略語の正確な展開テキストです。略語が既に展開済みである場合、その値は nil となります。ここには、unexpand-abbrev
コマンドのために expand-abbrev が残した情報が含まれています。
この変数の値は、expand-abbrev
が引数なしで呼び出して展開を行う関数です。この関数は、展開の前後で任意の処理を行うことができます。展開が行われた場合は、略記記号を返す必要があります。
以下のサンプルコードは、abbrev-expand-function
の簡単な使用例を示しています。ここでは、foo-mode
を特定のファイルを編集するためのモードとし、‘#’
で始まる行をコメントとして扱うものとします。これらの行にはテキストモードの略語を使用したいと考えています。それ以外のすべての行には、通常のローカル略語テーブルである
foo-mode-abbrev-table が適しています。local-abbrev-table および text-mode-abbrev-table の定義については、標準略語テーブル を参照してください。add-function の詳細については、Advising Emacs Lisp 関数 を参照してください。
(defun foo-mode-abbrev-expand-function (expand)
(if (not (save-excursion (forward-line 0) (eq (char-after) ?#)))
;; Performs normal expansion.
(funcall expand)
;; We're inside a comment: use the text-mode abbrevs.
(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)))