次: , 前: How Programs Do Loading, 上: Loading


14.2 ライブラリの探索

EmacsがLispライブラリをロードするときには、 変数load-pathで指定したディレクトリ群でライブラリを探します。

— ユーザオプション: load-path

この変数の値は、loadでファイルをロードするときに探索する ディレクトリのリストである。 各要素は、(ディレクトリ名である)文字列か (カレント作業ディレクトリを表す)nilである。

load-pathの値は、環境変数EMACSLOADPATHがあれば、 それで初期化します。 さもなければ、デフォルト値は、 Emacsを構築したときにemacs/src/paths.hで指定したものです。 そして、リスト内のディレクトリのサブディレクトリをリストに追加して 拡張します。

EMACSLOADPATHの構文はPATHと同じです。 `:'(オペレーティングシステムによっては`;')で ディレクトリ名を区切ります。 デフォルトのカレントディレクトリには`.'を使います。 csh.loginファイルで環境変数EMACSLOADPATHを 指定する例はつぎのとおりです。

     setenv EMACSLOADPATH .:/user/bil/emacs:/usr/local/share/emacs/20.3/lisp

shを使っている場合はつぎのようにします。

     export EMACSLOADPATH
     EMACSLOADPATH=.:/user/bil/emacs:/usr/local/share/emacs/20.3/lisp

.emacsファイルで、 デフォルトのload-pathの先頭に複数のディレクトリを追加するには、 つぎのようなコードを書きます。

     (setq load-path
           (append (list nil "/user/bil/emacs"
                         "/usr/local/lisplib"
                         "~/emacs")
                   load-path))

この例では、Lispコードを、まずカレント作業ディレクトリで探索し、 続いて、/user/bil/emacsディレクトリ、 /usr/local/lisplibディレクトリ、~/emacsディレクトリ、 さらに、標準のディレクトリで探索します。

Emacsのダンプには、load-pathの特別な値を使います。 ダンプ終了時にload-pathの値が未変更(つまり、同じ特別な値)であれば、 ダンプ版Emacsは起動時に、上に述べたように、普通のload-pathの値を 使います。 しかし、ダンプ終了時にload-pathの値が別の値であれば、 ダンプ版Emacsの実行でもその(別の)値を使います。

したがって、site-init.elsite-load.elで 少数のライブラリをロードするために 一時的にload-pathを変更したい場合には、 loadの呼び出しをletで囲んで load-pathをローカルに束縛するべきです。

システムにインストールしたEmacsを実行中は、 load-pathのデフォルト値には、2つの特別なディレクトリ (とそれらのサブディレクトリ)が含まれます。

     "/usr/local/share/emacs/version/site-lisp"

     "/usr/local/share/emacs/site-lisp"

です。 前者は、Emacsの特定の版向けにローカルにインストールしたパッケージ用です。 後者は、Emacsの任意の版向けにローカルにインストールしたパッケージ用です。

Emacsのある版向けのパッケージが別の版ではトラブルを引き起こす理由は いくつかあります。 Emacsの互換性のない変更のために更新を必要とするパッケージもあります。 予告なしに変更される可能性のある明文化していない Emacsの内部データに依存するものもあります。 Emacsの新しい版では、パッケージの特定の版と一体になっているものもあり、 その版だけで使うべきです。

Emacsは、起動すると、ディレクトリのサブディレクトリを捜し出して、 それらをload-pathに追加します。 直下のサブディレクトリも複数レベル下のサブディレクトリも load-pathに追加します。

しかし、サブディレクトリすべてを含むわけではありません。 英数字で始まらない名前のサブディレクトリは除外します。 RCSという名前のサブディレクトリも除外します。 また、.nosearchという名前のファイルを置いた サブディレクトリも除外します。 これらの方法を用いれば、site-lispディレクトリ下の 特定のサブディレクトリの探索を防げます。

Emacsを構築したディレクトリでEmacsを起動すると、 つまり、正式にインストールしてない実行形式を起動すると、 load-pathには、普通、2つのディレクトリを追加します。 主構築ディレクトリのサブディレクトリ、lispsite-lispです。 (どちらも、絶対ファイル名で表される。)

— コマンド: locate-library library &optional nosuffix path interactive-call

このコマンドは、ライブラリlibraryの正確なファイル名を探す。 loadと同様にライブラリを探索する。 引数nosuffixの意味はloadと同じであり、 指定した名前libraryに接尾辞`.elc'や`.el'を付加しない。

pathnil以外であると、 それはload-pathのかわりに使うディレクトリのリストである。

locate-libraryをプログラムから呼び出した場合、 文字列でファイル名を返す。 ユーザーがlocate-libraryを対話的に実行した場合、 引数interactive-calltであり、これは locate-libraryに対してファイル名をエコー領域に表示するように指示する。