次: , 前: Loading Non-ASCII, 上: Loading


14.4 自動ロード

自動ロード(autoload)機能により、 関数やマクロを定義しているファイルをロードしていなくても、 関数やマクロをLispに登録できます。 関数を初めて呼び出すと、 適切なファイルを読み込んで実際の定義と関連する他のコードを インストールしてから、すでにロードしてあったかのように実際の定義を実行します。

関数を自動的にロードするように設定する方法は2つあります。 autoloadを呼び出すか、あるいは、 ソース内の実際の定義のまえに特別な『マジック』コメントを書きます。 autoloadは自動ロードを行う低レベルの基本関数です。 任意のLispプログラムでいつでもautoloadを呼び出せます。 マジックコメントは、Emacsで使うパッケージ向けに 関数を自動的にロードするように設定するとても便利な方法です。 これらのコメントそのものはなにもしませんが、 コマンドupdate-file-autoloadsに対する指針として働きます。 このコマンドは、autoloadの呼び出しを作成し、 Emacs構築時にそれらを実行するように設定します。

— 機能: autoload function filename &optional docstring interactive type

この関数は、functionという名前の関数(やマクロ)を filenameから自動的にロードするように定義する。 文字列filenameは、functionの実際の定義を取得するために ロードするファイルを指定する。

filenameにディレクトリ名や接尾辞.el.elcがなければ、 autoloadはこれらの接尾辞の1つを必ず付加し、 接尾辞を付けないfilenameという名前のファイルはロードしない。

引数docstringは、関数に対する説明文字列である。 通常、これは関数定義そのものの説明文字列と同一であること。 autoloadの呼び出しにおいて説明文字列を指定しておくことで、 関数の実際の定義をロードしなくても説明文を見ることが可能になる。

interactivenil以外ならば、 functionを対話的に呼び出せることを意味する。 つまり、関数の実際の定義をロードしなくても M-xの補完が動作するのである。 完全な対話指定を指定しない。 ユーザーがfunctionを実際に呼び出すまでは必要なく、 呼び出し時点で実際の定義をロードするからである。

普通の関数と同様に、マクロやキーマップも自動的にロードできる。 functionが実際にはマクロならば、typeにはmacroを指定する。 functionが実際にはキーマップならば、 typeにはkeymapを指定する。 Emacsのさまざまな部分では、 実際の定義をロードせずにこの情報を知る必要がある。

自動ロードと指定したキーマップは、 プレフィックスキーのバインディングがシンボルfunctionであるときに、 キーを探す過程で自動的にロードする。 キーマップのこれ以外の参照方法では、自動的にロードしない。 特に、変数名がシンボルfunctionと同じであっても、 Lispプログラムで変数の値からキーマップを取得して define-keyを呼び出す場合には、自動的にロードしない。

functionが自動ロードオブジェクトではない 空でない関数定義を有する場合には、 autoloadはなにもせずにnilを返す。 functionの関数セルが空であったり、 すでに自動ロードオブジェクトである場合には、 つぎのような自動ロードオブジェクトとして関数セルを定義する。

          (autoload filename docstring interactive type)
     

たとえばつぎのとおり。

          (symbol-function 'run-prolog)
               => (autoload "prolog" 169681 t nil)
     

この場合、"prolog"はロードすべきファイルの名前であり、 169681はファイルemacs/etc/DOC-version (see Documentation Basics)内の説明文字列を指す。 tは関数が対話的であることを示し、 nilはマクロでもキーマップでもないことを示す。

自動ロード対象のファイルでは、通常、他の定義や 複数の機能を提供したり必要としたりします。 (その内容の評価中のエラーなどで)ファイルを完全にロードできないと、 ロード中に行った関数定義やprovideの呼び出しをもとに戻します。 そのファイルから自動ロードする任意の関数をつぎに呼び出そうとしたときに、 そのファイルを再度ロードすることを保証するためです。 こうしておかないと、 自動ロードをアボートしたファイルで関数が定義されても、 そのファイルのうしろの部分で定義される その関数に必要なサブルーティンが必ずしもロードされないために その関数が動作しない可能性があるからです。

自動ロード対象のファイルで必要なLisp関数やマクロの定義に失敗すると、 "Autoloading failed to define function function-name"を 伴ったエラーを通知します。

自動ロードを指定するマジックコメントは、 `;;;###autoload'だけを書いた行であり、 自動ロード対象のソースファイル上で実際の関数定義の直前に必要です。 コマンドM-x update-file-autoloadsは、 対応するautoload呼び出しをloaddefs.elに書き込みます。 Emacs構築時にはloaddefs.elをロードするので、 autoloadを呼び出します。 M-x update-directory-autoloadsはもっと強力で、 カレントディレクトリのすべてのファイルに対する自動ロード情報を更新します。

同じマジックコメントは、任意の種類のフォームをloaddefs.elに コピーできます。 マジックコメントに続くフォームが関数定義でない場合、 そのフォームをそのままコピーします。 構築時にはフォームを実行しても、 ファイルのロード時にはそのフォームを実行しないように マジックコメントを使うこともできます。 そうするには、マジックコメントと同じ行にそのフォームを書きます。 するとそれはコメントなので、ソースファイルをロードするときにはなにもしません。 一方、M-x update-file-autoloadsはそのフォームをloaddefs.elに コピーするので、Emacs構築時には実行されるのです。

つぎの例は、マジックコメントを使ってdoctorを自動ロードする方法です。

     ;;;###autoload
     (defun doctor ()
       "Switch to *doctor* buffer and start giving psychotherapy."
       (interactive)
       (switch-to-buffer "*doctor*")
       (doctor-mode))

こうすると、loaddefs.elではつぎのようになります。

     (autoload 'doctor "doctor"
       "\
     Switch to *doctor* buffer and start giving psychotherapy."
       t)

ダブルクォートの直後にバックスラッシュや改行を書く慣習は、 loaddefs.elなどの あらかじめロードするLispファイルの中だけで使うものです。 これは、make-docfileに対して、 説明文字列をetc/DOCファイルに書くように指示します。 See Building Emacs