GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Abbrev-Expansion.html ・ emacs-doc.conao3.com

39.4 略語の調べ方と展開

略語は通常、self-insert-command を含む特定のインタラクティブコマンドによって展開されます。本節では、こうしたコマンドの記述に使用されるサブルーチンと、通信に用いられる変数について説明します。

関数: abbrev-symbol abbrev &optional table

この関数は、abbrev という名前の略語を表すシンボルを返します。その略語が定義されていない場合は nil を返します。オプションの第2引数 table は、検索対象とする略語テーブルです。table が nil の場合、この関数はまず現在のバッファのローカル略語テーブルを、次にグローバル略語テーブルを検索します。

関数: abbrev-expansion abbrev &optional table

この関数は、abbrev が展開される文字列(現在のバッファで使用されている略記テーブルで定義されたもの)を返します。abbrev が有効な略記でない場合は、nil を返します。オプション引数 table は、abbrev-symbol と同様に、使用する略記テーブルを指定します。

コマンド: expand-abbrev

このコマンドは、ポイントの前に略語がある場合にそれを展開します。ポイントが略語の後に続かない場合、このコマンドは何もしません。展開を行う際は、abbrev-expand-function 変数の値である関数を引数なしで呼び出し、その関数が返した値を返します。

デフォルトの展開関数は、展開が行われた場合は略記記号を、そうでない場合は nil を返します。略記記号に、no-self-insert プロパティが non-nil である記号のフック関数が定義されており、そのフック関数が値として nil を返す場合、展開が行われたとしても、デフォルトの展開関数は nil を返します。

関数: abbrev-insert abbrev &optional name start end

この関数は、abbrev の略語展開を挿入し、start と end の間のテキストを置き換えます。start が省略された場合は、デフォルトで point となります。name が nil でない場合、それはこの略語が見つかった際の名称(文字列)である必要があり、展開後の大文字・小文字を調整するかどうかを判断するために使用されます。略語が正常に挿入された場合は abbrev を、そうでない場合は nil を返します。

コマンド: abbrev-prefix-mark &optional arg

このコマンドは、pointの現在位置を略語の開始位置として指定します。次にexpand-abbrevを呼び出した際は、通常通り直前の単語を使用するのではなく、ここからpoint(その時点での位置)までのテキストを展開用の略語として使用します。

まず、このコマンドは、arg が nil でない限り、ポイントより前のあらゆる略語を展開します。(対話モードでは、arg がプレフィックス引数となります。)次に、次に展開される略語の開始位置を示すため、ポイントの前にハイフンを挿入します。実際の展開では、このハイフンが削除されます。

ユーザーオプション: abbrev-all-caps

これを non-nil に設定すると、すべて大文字で入力された略語はすべて大文字で展開されます。それ以外の場合は、すべて大文字で入力された略語は、展開後の各単語の先頭を大文字にして展開されます。

変数: abbrev-start-location

この変数の値は、expand-abbrev が次に展開する略語の開始位置として使用するバッファ位置(整数またはマーカー)です。また、値は nil とすることもでき、その場合は代わりにポイント直前の単語を使用します。expand-abbrev が呼び出されるたびに、abbrev-start-location は nil に設定されます。この変数は abbrev-prefix-mark によっても設定されます。

変数: abbrev-start-location-buffer

この変数の値は、abbrev-start-location が設定されているバッファです。他のバッファで略記を展開しようとすると、abbrev-start-location がクリアされます。この変数は abbrev-prefix-mark によって設定されます。

変数: last-abbrev

これは、直近で展開された略語の abbrev-symbol です。この情報は、unexpand-abbrev コマンドのために expand-abbrev によって残されています(The GNU Emacs Manual の Expanding Abbrevs を参照してください)。

変数: last-abbrev-location

ここは、直近で略語が展開された箇所です。ここには、unexpand-abbrevコマンドのためにexpand-abbrevが残した情報が含まれています。

変数: last-abbrev-text

これは、ケース変換(ある場合)後の、直近に展開された略語の正確な展開テキストです。略語が既に展開済みである場合、その値は nil となります。ここには、unexpand-abbrev コマンドのために expand-abbrev が残した情報が含まれています。

変数: abbrev-expand-function

この変数の値は、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)))