@c -*-texinfo-*-
@c This is part of the GNU Emacs Lisp Reference Manual.
@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
@c See the file elisp-jp.texi for copying conditions.
@c 複製の条件はelisp-jp.texiに書いてあります。
@setfilename ../info/abbrevs-jp
@node Abbrevs, Processes, Syntax Tables, Top
@chapter 省略形とその展開
@cindex abbrev
@cindex abbrev table
@cindex 省略形[しょうりゃくけい]
@cindex 省略形テーブル[しょうりゃくけいてーぶる]

    省略あるいは@dfn{省略形(abbrev)}とは、さらに長い文字列へと展開できる
文字列のことです。ユーザは省略した文字列を入力し、それを省略の展開形によっ
て自動的に置き換えることができます。このことによりタイプする量を減らせま
す。

@c abbrev table -- 省略形テーブル
    現在有効な省略形は、@dfn{省略形テーブル(abbrev table)}に保持されてい
ます。各バッファはローカルな省略形テーブルを持っていますが、通常同じ主モー
ドにあるバッファは一つの省略形テーブルを共有します。また、グローバルな省
略形テーブルも存在します。通常は両方のテーブルを使用します。

    省略形テーブルは、各省略形のためのシンボルを含むobarrayとして表現さ
れます。このシンボルの名前が省略形であり、シンボルの値が展開形、シンボル
の関数定義が省略形を展開するときのフック関数です(@pxref{Defining
Abbrevs})。シンボルの属性リスト・セルには、省略形が展開された回数が入りま
す。これらのシンボルは通常のobarrayにはinternされないため、Lisp式を読み
込んだ結果として現れることは決してありません。実際、普通は省略形を操作す
るコード以外では決して使われません。そのため、これらのシンボルを極端に通
常とは違う方法で使用しても安全です。@xref{Creating Symbols}。

    ユーザレベルでの省略形に関するコマンドは@ref{Abbrevs,, Abbrev
Mode, emacs, The GNU Emacs Manual}をご覧ください。

@menu
* Abbrev Mode::                 Emacsで省略形が使えるように準備する。
* Tables: Abbrev Tables.        省略形テーブルの作成と使用方法。
* Defining Abbrevs::            省略形の定義とその展開。
* Files: Abbrev Files.          省略形をファイルにセーブする。
* Expansion: Abbrev Expansion.  展開の制御、展開サブルーチン。
* Standard Abbrev Tables::      さまざまな主モードで使用される省略形テーブル。
@end menu

@node Abbrev Mode, Abbrev Tables, Abbrevs, Abbrevs
@comment  node-name,  next,  previous,  up
@section Emacsで省略形が使えるように準備する

    Abbrevモードは、@code{abbrev-mode}変数の値で制御される副モードです。

@defvar abbrev-mode
この変数の値が非@code{nil}のとき、省略形がバッファに入力されたときの自動
展開が有効になります。値が@code{nil}のときは、省略形が定義されていたとし
ても、それは自動的に展開されません。

この変数はどのような方法で設定しても、自動的にバッファローカル変数になり
ます。
@end defvar

@defvar default-abbrev-mode
これは、@code{abbrev-mode}の、その値が上書きされていないバッファにおける
値です。@code{(default-value 'abbrev-mode)}と同じです。
@end defvar
@node Abbrev Tables, Defining Abbrevs, Abbrev Mode, Abbrevs
@section 省略形テーブル

    この節では、省略形テーブルをどのように作成し、操作するのかを説明します。

@defun make-abbrev-table
この関数は、新しい空の省略形テーブル、つまり、何もシンボルを含まない
obarrayを作成して返します。これはゼロで埋められたベクトルです。
@end defun

@defun clear-abbrev-table table
この関数は、@var{table}のすべての省略形の定義を未定義化しますが、テーブ
ルそのものは空にして残します。戻り値は@code{nil}です。
@end defun

@defun define-abbrev-table tabname definitions
この関数は、@var{tabname}(シンボル)を省略形テーブルとして定義します。つまり、
値に省略形テーブルをもつ変数として定義します。この関数は、
@var{definitions}にしたがって、テーブルのなかの省略形を定義します。
@var{definitions}は、@code{(@var{abbrevname} @var{expansion} @var{hook}
@var{usecount})}形式の要素をもつリストです。戻り値は常に@code{nil}です。
@end defun

@defvar abbrev-table-name-list
省略形テーブルを値にもつシンボルのリストです。@code{define-abbrev-table}
は新しい省略形テーブルの名前をこのリストにつけ加えます。
@end defvar

@defun insert-abbrev-table-description name &optional human
この関数は、@var{name}と名づけられた省略形テーブルの記述を、ポイントの前に挿
入します。引数@var{name}は、省略形テーブルを値にもつシンボルです。戻り値は、
常に@code{nil}です。

もし、@var{human}が非@code{nil}のとき、記述は人間が読みやすい形でおこなわ
れます。それ以外のばあい、記述はLisp式となります。このLisp式は、現在定義
されている@var{name}を正確に定義する@code{define-abbrev-table}の呼び出し
式です。
@end defun

@node Defining Abbrevs, Abbrev Files, Abbrev Tables, Abbrevs
@comment  node-name,  next,  previous,  up
@section 省略形の定義

    以下の関数は、指定した省略形テーブルの中の省略形を定義します。
@code{define-abbrev}が低水準な基本関数であるのに対し、@code{add-abbrev}
はユーザに情報を尋ねるコマンドによって使われます。

@defun add-abbrev table type arg
この関数は、ユーザからの情報に基づいて、省略形テーブル@var{table}に省略形を
追加します。引数@var{type}は、これから定義する省略形の種類に関して英語で記
述した文字列です(典型的な例は@code{"global"}あるいは
@code{"mode-specific"})。これは、ユーザへのプロンプトに使われます。引数
@var{arg}は、展開形に使用する単語数です。

戻り値は、新しい省略形を内部的に示すシンボルです。または、すでに存在する省
略形を上書きするかどうかの確認時にユーザが承諾しなかった場合には、
@code{nil}です。
@end defun

@defun define-abbrev table name expansion hook
この関数は、@var{table}に、@var{name}という名前の、@var{expansion}へと展開さ
れ、@var{hook}を呼び出す省略形を定義します。戻り値は、Emacs内部で省略形を
表現するinternされていないシンボルです。その名前は、@var{name}です。

引数@var{name}は、文字列であるべきです。引数@var{expansion}は、文字列か、あ
るいは省略形を取り消す場合は、@code{nil}であるべきです。

引数@var{hook}は、関数または@code{nil}です。もし、@var{hook}が非@code{nil}の
ときは、省略形を@var{expansion}で置き換えたあとに、引数なしでそれが呼ば
れます。@var{hook}が呼ばれるとき、ポイントは@var{expansion}の末尾です。

省略形の使用回数はゼロに初期化されます。
@end defun

@defopt only-global-abbrevs
この変数の値が非@code{nil}の場合、ユーザはグローバル省略形だけを使うと決
めたことになります。このことはコマンドに、モード特有の省略形を定義するか
わりに、グローバルな省略形を定義するよう示します。この変数は、この節の関数の機
能を変えることはなく、関数の呼びだし側でチェックされます。
@end defopt

@node Abbrev Files, Abbrev Expansion, Defining Abbrevs, Abbrevs
@section 省略形をファイルにセーブする

    省略形の定義が保存されたファイルは、実際にはLispコードのファイルです。
省略形は、同じ内容の省略形テーブルを定義するLispプログラムの形で保存されます。
そのため、@code{load} (@pxref{How Programs Do Loading})でファイルを読み
込むことが可能です。しかしながら、関数@code{quietly-read-abbrev-file}は、
より便利なインターフェースを提供します。

    @code{save-some-buffers}のようなユーザレベルの機能は、以下に示すよう
な変数の制御下で、自動的に省略形をファイルへ保存することがで
きます。

@defopt abbrev-file-name
省略形を読み書きするファイル名のデフォルト値です。
@end defopt

@defun quietly-read-abbrev-file filename
@c ソース読むと @defun quietly-read-abbrev-file &optional filename が正しい?。
この関数は、前に@code{write-abbrev-file}で書き込まれた@var{filename}という
名前のファイルから、省略形の定義を読み込みます。もし、@var{filename}が
@code{nil}のときは、@code{abbrev-file-name}で指定されたファイルが使われ
ます。あとで変更を保存するために、@code{save-abbrevs}は@code{t}にセットさ
れます。

この関数は、メッセージを表示しません。@code{nil}を返します。
@end defun

@defopt save-abbrevs
変数@code{save-abbrev}が非@code{nil}のとき、Emacsはファイルをセーブする時
に省略形もセーブします。@code{abbrev-file-name}は、省略形をセーブするファ
イル名を指定します。
@end defopt

@defvar abbrevs-changed
この変数は、省略形の定義や変更があったときに、非@code{nil}にセットされます。さま
ざまなEmacsコマンドがあなたの省略形を保存するかどうかを判断するフラグの
役目を果たします。
@end defvar

@deffn Command write-abbrev-file filename
全省略形テーブルのすべての省略形定義を、ファイル@var{filename}へ、ロードす
ると元と同じ省略形を定義するLispプログラムの形でセーブします。この関数は
@code{nil}を返します。
@end deffn

@node Abbrev Expansion, Standard Abbrev Tables, Abbrev Files, Abbrevs
@comment  node-name,  next,  previous,  up
@section 省略形の参照と展開

    省略形はたいてい、@code{self-insert-command}を含む対話的に使われるコマ
ンドによって展開されます。この節では、そのような関数を書く時に使うサブルーチン
について説明します。同じく、関数同士がコミュニケーションするために使う変数
についても説明します。

@defun abbrev-symbol abbrev &optional table
この関数は、@var{abbrev}と名づけられた省略形を示すシンボルを返します。省略形
が定義されていない場合は、@code{nil}を返します。二つめのオプション引数
@var{table}は、省略形を探すテーブル名です。@var{table}が@code{nil}のとき、この
関数は、まずカレント・バッファのローカル省略形テーブルを探し、その次にグロー
バル省略形テーブルを探します。
@end defun

@defun abbrev-expansion abbrev &optional table
この関数は、@var{abbrev}が(カレント・バッファで使われる省略形テーブルの定義に
したがって)展開される文字列を返します。オプション引数@var{table}は、
@code{abbrev-symbol}の場合と同じく、使用するテーブルを指定します。
@end defun

@deffn Command expand-abbrev
このコマンドは、ポイントの前の省略形を展開します。もし、ポイントが省略形の後
ろになければ、このコマンドはなにもしません。展開を行なった場合は@code{t}
を返し、それ以外は@code{nil}を返します。
@end deffn

@deffn Command abbrev-prefix-mark &optional arg
現在のポイントを、省略形の始まりとしてマークします。次の
@code{expand-abbrev}の呼び出しでは、通常のようにポイント直前の単語ではな
く、この場所から(そのときの)ポイントまでを、展開するべき省略形として使用
します。
@end deffn

@defopt abbrev-all-caps
非@code{nil}のとき、すべて大文字で入力された省略形は、すべて大文字で展開さ
れます。それ以外の場合、すべて大文字で入力された省略形は、各単語の先頭の
一文字が大文字で展開されます。
@end defopt

@defvar abbrev-start-location
これは、@code{expand-abbrev}のためのバッファ内位置で、次の省略形展開の始ま
りの位置に使われます。(@code{nil}のときは、ポイントの前の単語を代わりに
使う意味になります)。 @code{abbrev-start-location}は、@code{expand-abbrev}
が呼び出されるたびに@code{nil}に初期化されます。この変数は、
@code{abbrev-prefix-mark}によってもセットされます。
@end defvar

@defvar abbrev-start-location-buffer
この変数の値は、@code{abbrev-start-location}がセットされたバッファです。ほ
かのバッファで省略形展開を行なうと、@code{abbrev-start-location}はクリアさ
れます。この変数は、@code{abbrev-prefix-mark}によってセットされます。
@end defvar

@defvar last-abbrev
これは、最新の省略形の展開の@code{abbrev-symbol}です。この情報は、
@code{unexpand-abbrev}コマンドのために、@code{expand-abbrev}によって設定
されます。
@end defvar

@defvar last-abbrev-location
最新の省略形展開が行なわれた場所を示します。この情報は、
@code{unexpand-abbrev}コマンドのために、@code{expand-abbrev}によって設定
されます。
@end defvar

@defvar last-abbrev-text
これは、大文字小文字の変換も(もしあった場合は)含めて、最新の省略形展開の正
確な展開形です。もし、展開がすでに逆展開さているならば、この値は@code{nil}と
なります。この情報は、@code{unexpand-abbrev}コマンドのために、
@code{expand-abbrev}によって設定されます。
@end defvar

@c Emacs 19 feature
@defvar pre-abbrev-expand-hook
これは正規フックであり、省略形が展開される直前に、このフックが保持する関数が順番に実行さ
れます。@xref{Hooks}。 正規フックであるため、このフック関数は引数をとり
ません。しかしながら、ポイントの直前を調べることで、展開される省略形を見つ
けることができます。
@end defvar

    以下の例は、@code{pre-abbrev-expand-hook}の簡単な使い方です。もしユー
ザが省略形を句読点で終らせた場合、確認を行なうフック関数が実行されま
す。このため、このフックはユーザに省略形を展開するかどうか決定させ、もし
確認がとれない場合はその展開を中止します。

@smallexample
(add-hook 'pre-abbrev-expand-hook 'query-if-not-space)

;; @r{この関数は@code{pre-abbrev-expand-hook}から呼び出されます。}

;; @r{もしユーザがスペースで省略形を終らせた場合、この関数は何も}
;; @r{行ないません(省略形の展開のために戻ります)。}
;; @r{もしユーザがそれ以外の文字を入力した場合、この関数は展開を行なうか}
;; @r{どうかを尋ねます。}

;; @r{問い合わせに対して、ユーザが@kbd{y}を入力した時@code{nil}を}
;; @r{返します(@code{not}関数のため)。}
;; @r{しかし戻り値は展開には影響ないので、これで問題ないでしょう。}


(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"))))
@end smallexample

@node Standard Abbrev Tables,  , Abbrev Expansion, Abbrevs
@comment  node-name,  next,  previous,  up
@section 標準的な省略形テーブル

    ここに示す変数は、Emacsでプリロードされる主モードのために用意してい
る省略形テーブルです。

@defvar global-abbrev-table
モードに依存しない省略形テーブルです。ここで定義された省略形は、全バッファ
で有効になります。各バッファは、ローカルな省略形テーブルももつことができ、
そこで定義された省略形は、このグローバル・テーブルのものよりも優先されます。
@end defvar

@defvar local-abbrev-table
このバッファローカル変数の値は、カレント・バッファの(モード特有の)省略形テー
ブルです。
@end defvar

@defvar fundamental-mode-abbrev-table
Fundamentalモードで使われるローカルな省略形テーブルです。全Fundamentalモー
ド・バッファのローカル省略形テーブルとなります。
@end defvar

@defvar text-mode-abbrev-table
Textモードで使われる省略形テーブルです。
@end defvar

@defvar c-mode-abbrev-table
Cモードで使われる省略形テーブルです。
@end defvar

@defvar lisp-mode-abbrev-table
LispモードとEmacs Lispモードで使われる省略形テーブルです。
@end defvar
