Next: Repeated Loading, Previous: Loading Non-ASCII, Up: Loading
自動ロード(autoload)機能により、 関数やマクロを定義しているファイルをロードしていなくても、 関数やマクロをLispに登録できます。 関数を初めて呼び出すと、 適切なファイルを読み込んで実際の定義と関連する他のコードを インストールしてから、すでにロードしてあったかのように実際の定義を実行します。
関数を自動的にロードするように設定する方法は2つあります。
autoload
を呼び出すか、あるいは、
ソース内の実際の定義のまえに特別な『マジック』コメントを書きます。
autoload
は自動ロードを行う低レベルの基本関数です。
任意のLispプログラムでいつでもautoload
を呼び出せます。
マジックコメントは、Emacsで使うパッケージ向けに
関数を自動的にロードするように設定するとても便利な方法です。
これらのコメントそのものはなにもしませんが、
コマンドupdate-file-autoloads
に対する指針として働きます。
このコマンドは、autoload
の呼び出しを作成し、
Emacs構築時にそれらを実行するように設定します。
この関数は、functionという名前の関数(やマクロ)を filenameから自動的にロードするように定義する。 文字列filenameは、functionの実際の定義を取得するために ロードするファイルを指定する。
filenameにディレクトリ名や接尾辞
.el
や.elc
がなければ、autoload
はこれらの接尾辞の1つを必ず付加し、 接尾辞を付けないfilenameという名前のファイルはロードしない。引数docstringは、関数に対する説明文字列である。 通常、これは関数定義そのものの説明文字列と同一であること。
autoload
の呼び出しにおいて説明文字列を指定しておくことで、 関数の実際の定義をロードしなくても説明文を見ることが可能になる。interactiveが
nil
以外ならば、 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。