[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22. 略語の利用法

定義済みの略語(abbrev)とは, 挿入時に別のテキストに展開される単語のことです. 略語を定義するときに, それをどう展開するか指定します. たとえば, ‘foo’を略語として, ‘find outer otter’に展開すると定義したとします. すると, f o o <SPC>と打鍵すれば バッファには‘find outer otter (36) が挿入されます.

略語の別な形に, 動的略語展開(dynamic abbrev expansion)があります. 動的略語展開とは, バッファ中のポイントのまえにある文字列を バッファ内にあるその文字列で始まる既存の単語に展開することで, 陽にコマンドを実行して行います. See section 動的略語展開.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.1 略語の考え方

略語とは, あらかじめどう展開するか定義された単語のことです. 略語に続けて, 空白, タブ, ピリオドなどの単語の区切り文字を入力すると, 略語は展開されて展開形に置き換わります. たとえば, 略語‘foo’を展開形‘find outer otter’に展開するように 定義しておけば, f o o .と打鍵すると ‘find outer otter.’をバッファに挿入できます.

略語は, 略語(abbrev)モード(マイナモード)がオンのときにだけ展開されます. 略語(abbrev)モードをオフにしても定義した略語が消えてしまうわけではなく, つぎにオンにしたときに同じ定義をふたたび使えます. コマンドM-x abbrev-modeでこのモードのオン/オフをトグル(切り替えが) できます. また, 数引数を指定した場合, 引数が正のときには略語(abbrev)モードはオンになり, それ以外のときにはオフになります. See section マイナモード(minor mode). abbrev-modeは変数でもあります. この変数がnil以外のときには略語(abbrev)モードはオンです. この変数に値を設定すると, 自動的にカレントバッファに ローカルな変数になります.

略語定義はモードに固有にできます. つまり, あるメジャーモードのときにだけ働くように定義できます. 略語はグローバルにも定義でき, そのときはすべてのメジャーモードで使えます. 同じ略語に, グローバルな定義と, さまざまなメジャーモードに固有な定義とを 持たせることができます. あるメジャーモードに固有な定義は, グローバルな定義に優先します.

略語は, 編集作業中に対話的に定義できます. 略語の定義一覧を, あとで使うためにファイルに保存することもできます. 大量の略語定義をセッションごとにロードする人もいます.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2 略語の定義方法

C-x a g

ポイントのまえの単語を展開形として, 略語を定義する. (add-global-abbrev).

C-x a l

上と同様. ただし, 現在のメジャーモードに固有な略語を定義する. (add-mode-abbrev).

C-x a i g

バッファ中の1単語を略語として定義する. (inverse-add-global-abbrev).

C-x a i l

バッファ中の1単語をモードに固有な略語として定義する. (inverse-add-mode-abbrev).

M-x kill-all-abbrevs

このコマンドは現在有効なすべての略語定義を抹消し空にする.

略語を定義する普通の方法は, まず, 略語に置き換わってほしい展開形のテキストを入力し, つぎにその直後にポイントをもっていき, C-x a gadd-global-abbrev)と打鍵します. すると, ミニバッファを用いて略語を読み取り, ポイントの直前の単語(群)に対する略語として登録します. 展開形として用いる単語の個数は, 数引数で指定します. たとえば, 略語‘foo’をまえのように定義するには, テキスト‘find outer otter’を挿入し, 続いてC-u 3 C-x a g f o o <RET>と打鍵します.

C-x a gに数引数として0を指定すると, 展開形はリージョンの内容になります.

コマンドC-x a ladd-mode-abbrev)も同様ですが, 特定のモードに固有な定義になります. モードに固有な略語は, 特定のメジャーモードの中だけで有効です. C-x a lは, C-x a lと打鍵したときのメジャーモードに対する 略語を定義します. 引数の意味はC-x a gと同じです.

すでにバッファ内にあるテキストを略語として使いたい場合には, C-x a gのかわりにコマンドC-x a i ginverse-add-global-abbrev), あるいは, C-x a lのかわりにコマンドC-x a i linverse-add-mode-abbrev)を使います. これらは『逆さ』(inverse)コマンドと呼ばれます. というのは, これらのコマンドで使う (バッファにあるものとミニバッファから読むものの)2つの文字列 の用途が逆さだからです.

略語の定義を変更するには, 単に新たに定義してください. 略語がすでに定義されていると, 略語定義コマンドは置き換えてよいかどうかを確認してきます.

略語の定義を削除するには, 略語定義コマンドに負の数引数を指定します. C-u - C-x a gC-u - C-x a lのようにします. 前者はグローバルな定義を, 後者はモードに固有な定義を削除します.

M-x kill-all-abbrevs は, グローバルとローカルのすべての略語定義を 削除します.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.3 略語展開の制御

ポイントの直前に略語があるときに白文字や区切り文字(<SPC>, コンマなど) を打鍵すると, 略語はつねに展開されます. より正確には, 英単語の構成文字以外のどんな文字でも略語展開は起こり, 英単語の構成文字の任意の組み合わせを略語に使用できます. 略語の通常の使い方は, 略語を入力してから区切り文字を入力して 展開を行わせるという方法です.

略語展開では大文字小文字を保存します. したがって, ‘foo’は‘find outer otter’に, ‘Foo’は‘Find outer otter’に展開されます. また, 変数abbrev-all-capsに応じて, ‘FOO’は (変数の値がnil以外のときは) ‘FIND OUTER OTTER’, あるいは, ‘Find Outer Otter’に展開されます

以下は略語展開を制御するために使うコマンドです.

M-'

これまで入力した部分を これから入力する略語から分離する.

C-x a e

ポイントの直前の略語を展開する(expand-abbrev). このコマンドは略語(abbrev)モードがオンでなくても働く.

M-x expand-region-abbrevs

リージョン中のいくつかの, あるいはすべての略語を展開する.

接頭辞が付いた略語を展開したい場合もあるでしょう. 略語‘cnst’は‘construction’に展開されるとして, ‘reconstruction’と入力するためにこの略語を使いたいとします. ‘recnst’と打鍵してもだめです. というのは, ‘recnst’は定義済みの略語ではないからです. ではどうすればよいかというと, 接頭辞‘re’と略語‘cnst’のあいだでコマンドM-'abbrev-prefix-mark)を使うのです. まず‘re’と打ち込みます. 続いてM-'と打鍵します. するとバッファにハイフン(-)が挿入され, 切れ目が入ったことを示します. それから略語‘cnst’を入力します. バッファには‘re-cnst’と入っています. ここで単語構成文字以外の文字を打ち込めば, 略語‘cnst’が‘construction’に展開されます. 展開時にはM-'が挿入したハイフン(-)は削除されます. 結果は, 望みどおりの‘reconstruction’です.

もし, 略語を展開しないでそのまま残しておきたい場合には, C-qに続けて区切り文字を入れます. つまり, foo C-q ,とすると, バッファには‘foo,’のまま残ります.

まちがって略語を展開してしまった場合には, C-_(see section 変更をアンドゥする(もとに戻す))と打鍵すれば, 展開をアンドゥし略語に戻せます. このとき略語展開を引き起こした区切り文字も削除されます. 略語を展開せずに区切り文字とともに入力したいならば, 区切り文字をC-qでクォートして挿入します. 区切り文字を削除せずに直前に展開したものを略語に戻すには, コマンドM-x unexpand-abbrevを使うこともできます.

M-x expand-region-abbrevs は, リージョン全体にわたって定義済みの略語を 探し, みつかったそれぞれについてそれを展開するかを聞いてきます. このコマンドは, 略語(abbrev)モードをオンにし忘れて略語を用いた テキストを入力してしまったときに便利です. あるいは, 特別な略語定義一式を用いて 一度に全体を置き換えるときにも便利です. このコマンドは略語(abbrev)モードがオンでなくても使えます.

略語を展開するときには, フックpre-abbrev-expand-hook (see section フック)が実行されます.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4 略語の表示と編集

M-x list-abbrevs

すべての略語定義を表示する.

M-x edit-abbrevs

略語の一覧を編集する. 定義を追加, 変更, 削除できる.

M-x list-abbrevsの出力はつぎのようになります.

 
(lisp-mode-abbrev-table)
"dk"	       0    "define-key"
(global-abbrev-table)
"dfn"	       0    "definition"

(空行には意味はない. また, いくつかのモードの略語表は省略した. )

括弧で括られた名前から成る行は, 特定モードの略語表のヘッダです. global-abbrev-tableには, グローバルな略語定義が入っています. また, メジャーモード名からとったそれ以外の名前の略語表には, モードに固有な略語が入っています.

各略語表では, 空でない各行が1つの略語を定義します. 行の先頭の単語は略語です. つぎに続く数字はこの略語を展開した回数です. Emacsは, 略語が実際にどれだけ使われているか数えていて, あまり使わない定義を削除できるようにしています. 行の最後の文字列が展開形です.

M-x edit-abbrevsにより, Emacsバッファ内の略語一覧を編集することで 略語定義の追加, 変更, 削除を行えます. 一覧の形式は上で述べたものと同じです. このバッファは‘*Abbrevs*’と呼ばれ, 略語編集(edit-abbrevs)モードになっています. このバッファでC-c C-cと打鍵すると, バッファで指定したように略語定義が登録され, バッファにない略語定義は削除されます.

コマンドedit-abbrevsは実際にはlist-abbrevsと同ですが, 前者はバッファ‘*Abbrevs*’を選択するのに対し, 後者はバッファを別のウィンドウに表示するだけです.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.5 略語の保存

以下のコマンドは, 編集セッション間で略語定義を保存するためのものです.

M-x write-abbrev-file <RET> file <RET>

ファイルfileにすべての略語定義を書き出す.

M-x read-abbrev-file <RET> file <RET>

ファイルfileから略語定義を読み込み, その指定どおりに定義する.

M-x quietly-read-abbrev-file <RET> file <RET>

上と同様だが, 処理経過を表示しない.

M-x define-abbrevs

カレントバッファ内の定義で略語を定義する.

M-x insert-abbrevs

すべての略語とその展開形をカレントバッファに挿入する.

M-x write-abbrev-fileは, ミニバッファからファイル名を読み取り, そのファイルにすべての略語定義情報を書き出します. このコマンドは, 以後のセッションで使うために略語定義を保存するために使います. ファイルに保存されるテキストは一連のLisp式であり, これらの式を実行すると, 現状と同じ略語が定義されます.

M-x read-abbrev-fileは, ミニバッファからファイル名を読み取り, そのファイルを読み込んでファイルの内容に従って略語を定義します. M-x quietly-read-abbrev-fileも同じですが, 現在何が進行しているかをエコー領域に表示しません. このコマンドは, ‘.emacs’ファイルで使うことに主眼があります. どちらのコマンドも, 空の引数を指定すると 変数abbrev-file-nameに指定したファイル名を使います. この変数のデフォルトは"~/.abbrev_defs"です.

Emacsは, 略語定義を変更してあると自動的に略語定義を保存するかどうか, (C-x sC-x C-cなどで)すべてのファイルを保存するかどうか 問い合わせるときに同時に聞いてきます. この機能は, 変数save-abbrevsの値をnilにすると禁止できます.

コマンドM-x insert-abbrevsM-x define-abbrevsは, 上で述べたコマンドと同様ですが, Emacsバッファ内のテキストに作用します. M-x insert-abbrevsは, カレントバッファのポイントの直前に すべての略語定義を記述したテキストを挿入します. M-x define-abbrevsは, カレントバッファ全体を解析し, その内容に従って略語を定義します.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6 動的略語展開

これまでに述べてきた略語の機能は, テキストを挿入するときに自動的に働きますが, すべての略語を陽に登録しておく必要があります. 一方, 動的略語(dynamic abbrevs)は, バッファの内容に基づいて略語の展開形を自動的に決定することができます. ただし, 陽に指示したときだけ, 動的略語展開を行います.

M-/

バッファのポイントの直前の単語を動的略語(dynamic abbrev)として, その略語で始まる単語をバッファ内から探索し展開する (dabbrev-expand).

C-M-/

ポイントの直前の単語を動的略語として補完する (dabbrev-completion).

たとえば, バッファ内に‘does this follow ’があるときに f o M-/と打鍵すると, バッファ内で‘fo’で始まる近くにある単語が ‘follow’なので‘follow’が挿入されます. M-/に数引数を指定すると, ポイントから先頭に向かって探して, 2番目のもの, 3番目のものというように異なる展開形に展開できます. M-/を繰り返すことにより, 次々にさらに先頭へ向かって探して別の候補に展開します. ポイントよりまえのすべてのテキストを探し終えた場合には, ポイントよりうしろのテキストを探します. 変数dabbrev-limitnil以外 (37) ならば, バッファ内のどの範囲まで展開候補を探すかを指定します.

カレントバッファを探し終ると, 変数dabbrev-check-all-buffersnilに設定していない限り, M-/は他のバッファも探します.

C-u - M-/のようにM-/に負の数引数を指定すると, まずポイントのうしろから展開候補を探し, つぎにポイントのまえから展開候補を探します. M-/を繰り返して別の展開候補を探す場合には, 引数を指定しません. これにより, ポイントよりうしろのすべての展開候補を試してから, つぎにポイントよりまえのすべての展開候補を試せます.

動的略語を展開したあとでは, 展開形のもともとの場所でつぎに続く単語(群)を コピーすることができます. コピーしたい単語ごとに単に<SPC> M-/と打鍵します. 単語のあいだの空白や句読点も単語とともにコピーされます.

コマンドC-M-/dabbrev-completion)は, 動的略語の補完を行います. 展開候補を1つずつ試すかわりに, すべての候補を全部探して それらに共通するテキストを挿入します. それらに共通部分がなければ, C-M-/は候補一覧を表示するので 普通の方法でその中から1つ選びます. See section 補完.

動的略語展開は略語(abbrev)モードと完全に独立しています. M-/による単語の展開は, 略語(abbrev)モードで定義済みかどうかとは完全に独立しています.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7 動的略語のカスタマイズ方法

通常, 動的略語展開では大文字小文字を区別しないで候補を探します. つまり, 展開候補と略語の大文字小文字が一致する必要はありません.

この機能は変数dabbrev-case-fold-searchで制御できます. 値がtのときは, 候補を探すときに大文字小文字を区別しません. 値がnilのときは, 候補と略語の大文字小文字が一致する必要があります. 変数dabbrev-case-fold-searchの値は, デフォルトでは真であるcase-fold-searchです. したがって, 変数case-fold-searchが 展開候補を探すときの大文字小文字の区別を制御します.

通常, 動的略語展開は打ち込んだ略語の大文字小文字のパターンを保存します. つまり, 略語の大文字小文字のパターンに合うように 展開形の大文字小文字を変換します.

変数dabbrev-case-replaceは, 略語の大文字小文字のパターンを 保存するかどうかを制御します. 値がtのときは, たいていの場合, パターンを保存します. nilのときは, つねに展開形をそのままコピーします. dabbrev-case-replaceの値は, デフォルトでは真であるcase-replaceです. したがって, 変数case-replaceが 展開形をそのままコピーするかどうかを制御します.

しかしながら, 展開形の大文字小文字のパターンが複雑であるとき, 略語の始めから終りまでがそのパターンに一致する場合, これらの変数に関わらず展開形をそのままコピーします. たとえば, バッファにvariableWithSillyCasePatternとあって v a M-/と打鍵すると, 大文字小文字のパターンを含め展開形をそのままコピーします.

変数dabbrev-abbrev-char-regexpnil以外の場合, 動的展開においてどんな文字を単語構成文字とみなすかを制御します. これに指定する正規表現は1文字のみに一致するものである必要があり, 2文字以上に一致してはいけません. 同じ正規表現は, どの文字が展開形を構成するかも指定します. 値としてnilを指定すると特別な意味があり, 略語は単語の構成文字だけから成り, 展開形は単語と記号文字から成るという意味になります.

シェルスクリプトやmakefileなどでは, 変数名には接頭辞‘$’があったりなかったりします. これらのテキスト用のメジャーモードでは, 変数dabbrev-abbrev-skip-leading-regexpを設定して 余分な接頭辞を扱えるように動的展開をカスタマイズできます. この変数には, 動的略語展開で無視すべき余分な接頭辞に一致する 正規表現を指定します.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by 新堂 安孝 on September 22, 2009 using texi2html 1.82.