[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

35. 略語と略語の展開

略語(abbrev)とは, より長い文字列へ展開される文字の列のことです. ユーザーが略語の文字列を挿入すると, その展開形に自動的に置換されます. これにより打鍵量を省けます.

現在有効な略語の集まりは, 略語表(abbrev table)に記録されています. 各バッファにはローカルな略語表がありますが, 通常, 同じメジャーモードのすべてのバッファは1つの略語表を共有します. グローバルな略語表もあります. 通常, 両方を使います.

略語表は, 各略語に対するシンボルを収めたオブジェクト配列として表現されます. シンボルの名前が略語です. その値は展開形であり, その関数定義は展開を行うフック関数です. その属性リストのセルには略語を展開した回数である利用回数が入ります. それらのシンボルは, 通常のオブジェクト配列にはインターンされませんから, Lisp式を読み取った結果には, それらはけっして現れません. 実際, 略語を扱うコード以外では, それらはけっして使われません. したがって, それらをかなり非標準的に使っても安全です. See section シンボルの作成とインターン.

ユーザーレベルの略語コマンドについては, (emacs-ja)Abbrevs section ‘略語の利用法’ in GNU Emacs マニュアルを参照してください.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

35.1 略語(abbrev)モードの設定

略語(abbrev)モードは, 変数abbrev-modeの値で制御される マイナモードです.

Variable: abbrev-mode

この変数の値がnil以外であると, バッファに略語が挿入されると自動的に展開するようになる. 値がnilであると, 略語を定義することはできるが, 自動的には展開されない.

この変数は設定されると自動的にバッファローカルになる.

Variable: default-abbrev-mode

これは, abbrev-modeを上書きしていないバッファ向けの abbrev-modeの値である. これは(default-value 'abbrev-mode)と同じである.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

35.2 略語表

本節では, 略語表の作成方法と扱い方について述べます.

Function: make-abbrev-table

この関数は, 新たな空の略語表, つまり, シンボルを含まないオブジェクト配列を作成して返す. ベクトルはゼロで埋められる.

Function: clear-abbrev-table table

この関数は, 略語表table内のすべての略語を未定義にして略語表を空にする. 関数はnilを返す.

Function: define-abbrev-table tabname definitions

この関数は, tabname(シンボル)を略語表の名前として定義する. つまり, この変数としての値は略語表になる. definitionsに従って略語表に略語を定義する. ここで, definitions(abbrevname expansion hook usecount)の形の 要素から成るリストである. 戻り値はつねにnilである.

Variable: abbrev-table-name-list

その値が略語表であるシンボルのリストである. define-abbrev-tableは, 新たな略語表の名前をこのリストに追加する.

Function: insert-abbrev-table-description name &optional human

この関数は, nameで指名される略語表の記述をポイントのまえに挿入する. 引数nameは, その値が略語表であるシンボルである. 戻り値はつねにnilである.

humannil以外であると, この記述は人間向けである. さもなければ, この記述はLisp式, つまり, nameの現在の定義どおりにnameを定義するような define-abbrev-tableの呼び出しである.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

35.3 略語を定義する

これらの関数は, 指定した略語表に略語を定義します. define-abbrevは下位レベルの基本的な関数ですが, add-abbrevはユーザーに情報を問い合わせるコマンドが使います.

Function: add-abbrev table type arg

この関数は, ユーザーからの情報に基づいて 略語表tableに略語を追加する. 引数typeは, この略語の種類を英語で表した文字列である (典型的には, "global""mode-specific". ) この文字列はユーザーへのプロンプトに使われる. 引数argは, 展開形の単語数である.

戻り値は, 新たな略語を内部的に表現するシンボルであるか, 既存の略語を再定義することをユーザーが拒否したときにはnilである.

Function: define-abbrev table name expansion hook

この関数は, 略語表tableにおいて, 略語nameexpansionに展開するように定義し, hookを呼び出すように定義する. 戻り値は, Emacs内部で略語を表現するシンボルを返すが, その名前はnameである.

引数nameは文字列であること. 引数expansionは, 普通は, 目的の展開形(文字列)であるが, 略語を未定義にするにはnilである. これが文字列でもnilでもなければ, 略語を『展開する』ときにはhookだけを実行する.

引数hookは, 関数かnilである. hooknil以外であると, 略語をexpansionに置換し終えてから引数なしで呼ばれる. hookが呼ばれるときには, ポイントはexpansionの直後に置かれる.

略語の利用回数は0に初期化される.

User Option: only-global-abbrevs

この変数がnil以外であると, ユーザーはグローバルな略語だけを使う意図があることを表す. モード固有の略語を定義するコマンドに対して, グローバルな略語を定義するように指示する. この変数は本節の関数のふるまいを変えることはないが, それらを呼び出す側でこの変数を検査している.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

35.4 略語をファイルに保存する

略語定義を保存したファイルは, 実際には, Lispコードのファイルです. 略語は, 同じ内容の同じ略語表を定義するLispプログラムの形で保存されます. したがって, ファイルはload(see section プログラムからのロード方法)で ロードできます. しかし, 関数quietly-read-abbrev-fileがより便利なインターフェイスを 提供します.

save-some-buffersなどのユーザーレベルの機能では, ここに述べた変数の制御のもとで, 略語をファイルに自動的に保存できます.

User Option: abbrev-file-name

これは, 略語を読み込んだり保存するデフォルトのファイル名である.

Function: quietly-read-abbrev-file filename

この関数は, write-abbrev-fileで書いておいた ファイルfilenameから, 略語定義を読み取る. filenamenilであると, abbrev-file-nameで指定されるファイルを使う. save-abbrevstを設定して, 変更は保存されるようにする.

この関数はいっさいメッセージを表示しない. nilを返す.

User Option: save-abbrevs

save-abbrevnil以外の値であると, Emacsはファイルを保存するときに略語も保存する. abbrev-file-nameが略語を保存するファイルを指定する.

Variable: abbrevs-changed

略語を定義したり変更すると, この変数はnil以外に設定される. これは, 読者の略語を保存する機会を与えるために, Emacsのさまざまなコマンドに対するフラグとして働く.

コマンド: write-abbrev-file filename

ロードすると同じ略語を定義するようなLispプログラムの形で, ファイルfilenameにすべての略語表のすべての略語定義を保存する. この関数はnilを返す.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

35.5 略語の探索と展開

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

Function: abbrev-symbol abbrev &optional table

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

Function: abbrev-expansion abbrev &optional table

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

コマンド: expand-abbrev

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

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

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

User Option: abbrev-all-caps

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

Variable: abbrev-start-location

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

Variable: abbrev-start-location-buffer

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

Variable: last-abbrev

これは, もっとも最近に略語展開されたabbrev-symbol (略語を表すシンボル)である. この情報は, コマンドunexpand-abbrev向けに expand-abbrevが残す (see (emacs-ja)Expanding Abbrevs section ‘略語展開の制御’ in GNU Emacs マニュアル) .

Variable: last-abbrev-location

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

Variable: last-abbrev-text

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

Variable: pre-abbrev-expand-hook

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

以下のコード例は, 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"))))


[ << ] [ >> ]           [冒頭] [目次] [見出し] [ ? ]

この文書は新堂 安孝によって2009年9月22日texi2html 1.82を用いて生成されました。