オートロード(autoload: 自動ロード)の機能により、定義されているファイルをロードすることなく関数やマクロの存在を登録できます。関数の最初の呼び出しで実際の定義およびその他の関連するコードをインストールするために適切なライブラリーを自動的にロードして、すべてがすでにロードされていたかのように実際の定義を実行します。関数やマクロのドキュメントの参照(ドキュメントの基礎を参照)、変数名や関数名の補完(以下のプレフィックスによるautoloadを参照)によってもオートロードが発生します。
オートロードされた関数をセットアップするには2つの方法があります。それはautoload
を呼び出す方法と、ソースの実際の定義の前に“マジック”コメントを記述する方法です。autoload
はオートロードのための低レベルのプリミティブです。任意のLispプログラムが、任意のタイミングでautoload
を呼び出すことができます。Emacsとともにインストールされるパッケージにとって、マジックコメントは関数をオートロードできるようににするための一番便利な方法です。そのコメント自身は何も行いませんが、コマンドloaddefs-generate
にたいするガイドの役目を果たします。このコマンドはautoload
の呼び出しを構築して、Emacsビルド時に実行されるようにアレンジします。
この関数はfilenameから自動的にロードされるように、functionという名前の関数(かマクロ)を定義する。文字列filenameにはfunctionの実際の定義を取得するファイルを指定する。
filenameがディレクトリー名、またはサフィックス.el
と.elc
のいずれも含まなければ、この関数はこれらのサフィックスのいずれかを強制的に追加して、サフィックスがないただのfilenameという名前のファイルはロードしない(変数load-suffixes
により要求される正確なサフィックスが指定される)。
引数docstringはその関数のドキュメント文字列である。autoload
の呼び出しでドキュメント文字列を指定することにより、その関数の実際の定義をロードせずにドキュメントを見ることが可能になる。この引数の値は通常は関数定義のドキュメント文字列と等しいこと。もし等しくなければ、その関数定義のドキュメント文字列がロード時に有効になる。
interactiveが非nil
なら、その関数はインタラクティブに呼び出すことが可能になる。これによりfunctionの実際の定義をロードせずに、M-xによる補完が機能するようになる。ここでは完全なインタラクティブ仕様は与えられない。完全な仕様はユーザーが実際にfunctionを呼び出すまで必要ない。ユーザーが実際に呼び出したときに、実際の定義がロードされる。
interactiveがリストなら、そのコマンドを適用可能なモードのリストとして解釈される。
普通の関数と同様、マクロとキーマップをオートロードできる。functionが実際にはマクロならtypeにmacro
、キーマップのならtypeにkeymap
を指定する。Emacsのさまざまな部分では、実際の定義をロードせずにこれらの情報を知ることが必要とされる。
オートロードされたキーマップは、あるプレフィクスキーがシンボルfunctionにバインドされているとき、キーを探す間に自動的にロードされる。そのキーマップにたいする他の類のアクセスではオートロードは発生しない。特にLispプログラムが変数の値からそのキーマップを取得してkeymap-set
を呼び出した場合には、たとえその変数の名前がシンボルfunctionと同じであってもオートロードは発生しない。
functionが非voidのオートロードされたオブジェクトではない関数定義をもつなら、その関数は何も行わずにnil
をリターンする。それ以外ならオートロードされたオブジェクト(autoload型を参照)を作成して、それをfunctionにたいする関数定義として格納する。オートロードされたオブジェクトは以下の形式をもつ:
(autoload filename docstring interactive type)
たとえば、
(symbol-function 'run-prolog) ⇒ (autoload "prolog" 169681 t nil)
このような場合、"prolog"
はロードするファイルの名前、169681はemacs/etc/DOCファイル(ドキュメントの基礎を参照)内のドキュメント文字列への参照で、t
はその関数がインタラクティブであること、nil
はそれがマクロやキーマップでないことを意味する。
この関数はobjectがオートロードされたオブジェクトなら非nil
をリターンする。たとえばrun-prolog
がオートロードされたオブジェクトかチェックするには以下を評価する
(autoloadp (symbol-function 'run-prolog))
オートロードされたファイルは、通常は他の定義を含み1つ以上の機能を必要としたり、あるいは提供するかもしれません。(内容の評価でのエラーにより)そのファイルが完全にロードされていなければ、そのロードの間に行われた関数定義やprovide
の呼び出しはアンドゥされます。これはそのファイルからオートロードされる関数にたいして再度呼び出しを試みたときに、そのファイルを確実に再ロードさせるためです。こうしないと、そのファイル内のいくつかの関数はアボートしたロードにより定義されていて、それらはロードされない修正後のファイルで提供される正しいサブルーチンを欠くため、正しく機能しないからです。
オートロードされたファイルが意図したLisp関数またはマクロの定義に失敗すると、データ"Autoloading failed to
define function function-name"
とともにエラーがシグナルされます。
オートロードのマジックコメント(autoload
cookieとも呼ばれる)は、オートロード可能なソースファイル内の実際の定義の直前にある、‘;;;###autoload’だけの行から構成されます。関数loaddefs-generate
は、対応するautoload
呼び出しをloaddefs.el内に書き込みます(autoload
cookieとなる文字列とloaddefs-generate
で生成されるファイルの名前は、上述のデフォルトから変更可能です。以下参照)。Emacsのビルドではloaddefs.elをロードするためにautoload
を呼び出します。
このマジックコメントは任意の種類のフォームをloaddefs.el内にコピーできます。このマジックコメントに続くフォームはそのままコピーされます。しかしオートロード機能が特別に処理するフォームの場合は除外されます(たとえばautoload
内への変換)。以下はそのままコピーされないフォームです:
defun
とdefmacro
。cl-defun
とcl-defmacro
(Argument
Lists in Common Lisp
Extensionsを参照)、およびdefine-overloadable-function
(mode-local.el内のコメントを参照)も該当する。
define-minor-mode
、define-globalized-minor-mode
、define-generic-mode
、define-derived-mode
、define-compilation-mode
、define-global-minor-mode
。
defcustom
、defgroup
、deftheme
、defclass
(EIEIO in EIEIOを参照)、およびdefine-skeleton
(Autotyping in Autotypingを参照)。
ビルド時にそのファイル自身をロードするときにフォームを実行しないようにするためにマジックコメントを使用することもできます。これを行なうにはマジックコメントと同じ行にフォームを記述します。これはコメントなのでソースファイルをロードするときには何も行いません。ただしビルド時に実行されたEmacsでは、loaddefs-generate
がloaddefs.elにコピーします。
以下はマジックコメントによるオートロードのために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. \(fn)" t nil)
ダブルクォートの直後のバックスラッシュと改行は、loaddefs.elのように事前ロードされる未コンパイルのLispファイルだけに用いられる慣習です。これらはetc/DOCファイルにドキュメント文字列を配置するよう指示する文字です。Emacsのビルド、およびlib-src/make-docfile.cのコメントも参照してください。loaddefs.elは編集用ではありませんが、ある程度は人が読みやすいように保とうと努めています。たとえばdefvar
の値の中のコントロール文字をエスケープしたり、行が長くならないようにdoc文字列のダブルクォーテーションの直後にはバックスラッシュと改行を挿入するようにしています。ドキュメント文字列の使い方(usage
part)の中の‘(fn)’は、種々のヘルプ関数(ヘルプ関数を参照)が表示するときにその関数の名前に置き換えられます。
関数定義手法として既知ではなく、認められてもいないような、通常とは異なるマクロにより関数定義を記述した場合、通常のオートロードのマジックコメントの使用によって定義全体がloaddefs.el
内にコピーされるでしょう。これは期待した動作ではありません。かわりに以下を記述することにより、意図したautoload
呼び出しをloaddefs.el
内に配置することができます。
;;;###autoload (autoload 'foo "myfile") (mydefunmacro foo ...)
autoload cookieとしてデフォルト以外の文字列を使用して、デフォルトのloaddefs.elとは異なるファイル内に対応するオートロード呼び出しを記述できます。これを制御するためにEmacsは2つの変数を提供します:
この定数の値はautoload
cookieにマッチさせるregexp。loaddefs-generate
はそのcookieの後に続くLispフォームを、生成したautoloadファイルにコピーする。これは‘;;;###autoload’や‘;;;###calc-autoload’のようなコメントにマッチするだろう。
この変数の値は、オートロード呼び出しが書き込まれるEmacs Lispファイルを命名する。デフォルト値はloaddefs.elだが、(たとえば.elファイル内のセクションLocal Variables))をオーバーライドできる。オートロードファイルは、フォームフィード文字で開始される終端を含んでいると仮定される。
以下の関数はオートロードオブジェクトにより指定されたライブラリーを明示的にロードするために使用されるかもしれません:
この関数はオートロードオブジェクトautoloadにより指定されたロードを処理する。オプション引数nameに非nil
を指定するなら、関数値がautoloadとなるシンボルを指定すること。この場合、この関数のリターン値がそのシンボルの新しい関数値になる。オプション引数macro-onlyの値がmacro
なら、この関数は関数ではなくマクロのロードだけを有効にする。