define-abbrev
はabbrevテーブル内にabbrevを定義するための基本的な低レベル関数です。
メジャーモードがシステムabbrevを定義する際には、:system
プロパティにt
を指定してdefine-abbrev
を呼び出すべきです。すべての保存された非システムabbrevは起動時(何らかのメジャーモードがロードされる前)にリストアされることに注意してください。したがってメジャーモードは最初にそのモードがロードされた際には、それらのモードのabbrevテーブルが空であると仮定するべきではありません。
この関数はabbrev-table内にnameという名前でexpansionに展開されて、hookを呼び出すabbrevをプロパティprops
(abbrevプロパティーを参照)とともに定義する。リターン値はname。ここではprops内の:system
プロパティは特別に扱われる。このプロパティが値force
をもつなら、たとえ同じ名前の非システムabbrevでも既存の定義を上書きするだろう。
nameは文字列であること。引数expansionは通常は望む展開形(文字列)であり、nil
ならそのabbrevを未定義とする。これが文字列またはnil
以外の何かなら、そのabbrevはhookを実行することにより単に展開される。
引数hookは関数またはnil
であること。hookが非nil
ならabbrevがexpansionに置換された後に引数なしでそれが呼び出される。hook呼び出しの際にはポイントはexpansionの終端に配置される。
hookがno-self-insert
プロパティが非nil
であるような非nil
のシンボルなら、hookは展開をトリガーするような自己挿入入力文字を挿入できるかどうかを明示的に制御できる。この場合には、hookが非nil
をリターンしたらその文字の挿入を抑止する。対照的にhookがnil
をリターンしたら、あたかも実際には展開が行われなかったかのようにexpand-abbrev
(またはabbrev-insert
)もnil
をリターンする。
define-abbrev
は実際にabbrevを変更した場合には、通常は変数abbrevs-changed
にt
をセットする。これはいくつかのコマンドがabbrevの保存を提案するためである。いずれにせよシステムabbrevは保存されないので、システムabbrevにたいしてこれは行われない。
この変数が非nil
なら、それはユーザーがグローバルabbrevのみの使用を計画していることを意味する。これはモード固有のabbrevを定義するコマンドにたいして、かわりにグローバルabbrevを定義するよう指示する。この変数はこのセクション内の関数の振る舞いを変更しない。それは呼び出し側により検証される。