次: , 前: Abbrev Files, 上: Abbrevs


35.5 略語の探索と展開

通常、略語は、self-insert-commandを含む特定の対話的なコマンドに よって展開されます。 本節では、データのやりとりに使う変数に加えて、そのようなコマンドを書くために 使用するサブルーティンについて述べます。

— 機能: abbrev-symbol abbrev &optional table

この関数は、名前abbrevの略語を表すシンボルを返す。 そのような略語が定義されていなければ、戻り値はnilである。 省略可能な第2引数tableは、探索対象の略語表である。 tablenilであると、 この関数は、まずカレントバッファのローカルな略語表を試し、 つぎにグローバルな略語表を試す。

— 機能: abbrev-expansion abbrev &optional table

この関数は、abbrevが (カレントバッファで使用される略語表での定義どおりに) 展開されるであろう文字列を返す。 省略可能な引数tableは、abbrev-symbolと同様に、 使用する略語表を指定する。

— コマンド: expand-abbrev

このコマンドは、ポイントのまえの略語をあれば展開する。 略語の直後にポイントがない場合、このコマンドはなにもしない。 このコマンドは、展開を行えばtを返し、 さもなければnilを返す。

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

現在のポイント位置を略語の開始位置としてマークする。 つぎにexpand-abbrevを呼び出すと、 通常どおりにポイントのまえの単語を使うかわりに、 ここから(その時点での)ポイントまでのテキストを略語として展開する。

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

これがnil以外であると、 大文字だけで入力された略語を大文字だけで展開する。 さもなければ、大文字だけで入力された略語は、 展開形の各単語を大文字で始めるように展開される。

— 変数: abbrev-start-location

これは、expand-abbrevがつぎに展開する略語の開始位置として使う バッファ内位置である。 (nilであると、そのかわりにポイントのまえの単語を使う意味である。) expand-abbrevが呼び出されるたびに、 abbrev-start-locationnilに設定される。 この変数は、abbrev-prefix-markでも設定される。

— 変数: abbrev-start-location-buffer

この変数の値は、abbrev-start-locationが設定されたバッファである。 別のバッファで略語を展開しようとするとabbrev-start-locationは クリアされる。 この変数はabbrev-prefix-markが設定する。

— 変数: last-abbrev

これは、もっとも最近に略語展開されたabbrev-symbol (略語を表すシンボル)である。 この情報は、コマンドunexpand-abbrev向けに expand-abbrevが残す (see 略語展開の制御) 。

— 変数: last-abbrev-location

これは、もっとも最近に略語展開した箇所である。 これは、コマンドunexpand-abbrev向けに expand-abbrevが残した情報を保持する。

— 変数: last-abbrev-text

これは、もっとも最近に略語展開したときの(あれば)大文字小文字変換後の 展開形のテキストである。 略語展開を取り消すと、この値はnilである。 これは、コマンドunexpand-abbrev向けに expand-abbrevが残した情報を保持する。

— 変数: pre-abbrev-expand-hook

これは、任意の略語を展開する直前に順に実行される関数を 収めたノーマルフックである。 see Hooks。 ノーマルフックなので、フック関数は引数を受け取らない。 しかし、バッファでポイントのまえを調べることで 展開すべき略語をみつけることができる。

以下のコード例は、pre-abbrev-expand-hookの使い方を示します。 ユーザーが略語を句読点文字で終えると、フック関数が確認を求めます。 したがって、このフックにより、ユーザーは展開の可否を決定でき、 了承しなかったときには展開を止められます。

     (add-hook 'pre-abbrev-expand-hook 'query-if-not-space)
     
     
     ;; この関数は、pre-abbrev-expand-hookが起動する
     
     
     
     
     
     ;; ユーザーが略語を空白で終えると、この関数はなにもしない
     ;; (つまり、略語を展開できるように戻る)
     ;; ユーザーがその他の文字を入力したら、
     ;; この関数は展開するかどうかを問い合わせる
     
     
     
     
     ;; ユーザーがプロンプトにyで答えたら、
     ;; (関数notを使っているので)この関数はnilを返すが
     ;; 問題ない。戻り値は展開には影響しない
     
     (defun query-if-not-space ()
       (if (/= ?\  (preceding-char))
           (if (not (y-or-n-p "Do you want to expand this abbrev? "))
               (error "Not expanding this abbrev"))))