EmacsがLispライブラリを読み込む際は、変数load-pathで指定されたディレクトリ一覧の中からそのライブラリを検索します。
この変数の値は、load
でファイルを読み込む際に検索対象とするディレクトリのリストです。各要素は、文字列(ディレクトリである必要があります)または nil(現在の作業ディレクトリを表します)のいずれかです。
Emacsが起動すると、いくつかの手順を経てload-pathの値を設定します。まず、Emacsのコンパイル時に設定されたデフォルトの場所を用いて、自身のLispファイルが含まれるディレクトリを探します。このディレクトリをlisp-directoryに保存します。通常、これは*.elcファイルがインストールされているディレクトリであり、例えば次のようなものです。
"/usr/local/share/emacs/version/lisp"
ここで version は Emacs のバージョンです。(本例および以降の例では、/usr/local をご利用の Emacs 環境に適したプレフィックスに置き換えてください。)このディレクトリとそのサブディレクトリには、Emacs に標準で付属する Lisp ファイルが含まれています。Emacs が自身の Lisp ファイルを見つけられない場合、正常に起動しません。
Emacsをビルドしたディレクトリ—つまり、まだインストールされていない実行ファイル—から起動した場合、Emacsは代わりに、ビルド元のソースが含まれるディレクトリのlispサブディレクトリを使用してlisp-directoryを初期化します。
次にEmacsは、このlisp-directoryを用いてload-pathを初期化します。ソースとは別のディレクトリでEmacsをビルドした場合は、ビルドディレクトリのlispサブディレクトリも追加されます。
これらのディレクトリはすべて、上記の2つの変数に絶対ファイル名として格納されています。
--no-site-lisp オプションを指定して Emacs を起動しない限り、load-path の先頭にさらに 2 つの site-lisp ディレクトリが追加されます。これらはローカルにインストールされた Lisp
ファイル用であり、通常は次のような形式になります:
"/usr/local/share/emacs/version/site-lisp"
および
"/usr/local/share/emacs/site-lisp"
1つ目は現在のEmacs version向けにローカルにインストールされたファイル用、2つ目はインストール済みのあらゆるEmacsバージョンで使用するためのローカルにインストールされたファイル用です。(Emacsが未インストール状態で動作している場合、ソースディレクトリとビルドディレクトリが存在すれば、そこからもsite-lispサブディレクトリが追加されます。ただし、通常、ソースディレクトリとビルドディレクトリにsite-lispサブディレクトリは含まれません。)
環境変数 EMACSLOADPATH が設定されている場合、上記の初期化手順が変更されます。Emacs
は環境変数の値に基づいて load-path を初期化します。
EMACSLOADPATH の構文は PATH
と同様であり、ディレクトリは ‘:’(一部のオペレーティングシステムでは
‘;’)で区切られます。以下に、EMACSLOADPATH 変数を設定する方法の例を示します(sh 形式のシェルから):
export EMACSLOADPATH=/home/foo/.emacs.d/lisp:
環境変数の値に含まれる空要素(末尾にあるもの(上記の例のように、末尾の ‘:’
に注目)、先頭にあるもの、または途中に埋め込まれたもの)は、標準的な初期化手順によって決定されるデフォルト値 load-path に置き換えられます。このような空要素が存在しない場合は、EMACSLOADPATH が load-path
全体を指定します。空要素か、あるいは標準Lispファイルが格納されているディレクトリへの明示的なパスのいずれかを含める必要があります。そうしないと、Emacsは動作しません。(load-path を変更するもう一つの方法は、Emacs起動時にコマンドラインオプション -L を使用することです。詳細は以下を参照してください。)
Emacsはload-path内の各ディレクトリについて、ファイルsubdirs.elが含まれているかを確認し、含まれている場合はそれを読み込みます。subdirs.elファイルはEmacsのビルドまたはインストール時に作成され、それらのディレクトリのサブディレクトリをすべてload-pathに追加するコードが含まれています。直下のサブディレクトリだけでなく、複数階層下のサブディレクトリも追加されます。ただし、名前が英数字で始まらないサブディレクトリ、RCSまたはCVSという名前のサブディレクトリ、および.nosearchという名前のファイルを含むサブディレクトリは除外されます。
次に、Emacsは-Lコマンドラインオプションで指定した追加のロードディレクトリを追加します(The GNU Emacs ManualのAction Argumentsを参照)。また、オプションパッケージがインストールされているディレクトリがある場合、それらも追加します(Packaging Basicsを参照)。
load-pathに1つ以上のディレクトリを追加するために、initファイル(Initファイルを参照)にコードを追記するのが一般的です。例えば:
(push "~/.emacs.d/lisp" load-path)
pushの説明については、pushを参照してください。
ダンプされたEmacsでは、load-pathという特殊な値が使用されます。ダンプされたEmacsをカスタマイズするためにsite-load.elやsite-init.elファイルを使用する場合(Emacsのビルドを参照)、これらのファイルで行ったload-pathへの変更は、ダンプ後に失われます。
この変数には、Emacs自身の*.elおよび*.elcファイルが格納されているディレクトリ名を表す文字列が保持されています。通常、Emacsのインストールツリーにおいてこれらのファイルが配置されている場所を指しますが、Emacsをビルドディレクトリから実行した場合は、Emacsのビルド元となったソースディレクトリ内のlispサブディレクトリを指します。
このコマンドは、ライブラリ library の正確なファイル名を特定します。load と同様の方法でライブラリを検索し、引数 nosuffix
は load と同じ意味を持ちます。つまり、指定した名前 library に接尾辞 ‘.elc’
や ‘.el’ を付加しないでください。
path が nil でない場合、load-path の代わりにそのディレクトリ一覧が使用されます。
プログラムから locate-library
が呼び出されると、ファイル名を文字列として返します。ユーザーが locate-library
を対話的に実行すると、引数 interactive-call は t となり、これにより locate-library
はエコー領域にファイル名を表示するよう指示されます。
このコマンドは、シャドウされたEmacs Lispファイルの一覧を表示します。シャドウファイルとは、load-pathのディレクトリに存在していても、より上位のload-pathのディレクトリに同様の名前のファイルが存在するため、通常はロードされないファイルのことです。
例えば、load-path が次のように設定されているとします。
("/opt/emacs/site-lisp" "/usr/share/emacs/29.1/lisp")
また、これら両方のディレクトリに foo.el
という名前のファイルが含まれています。すると、(require 'foo)
は2番目のディレクトリにあるファイルを決して読み込みません。このような状況は、Emacs のインストール方法に問題がある可能性を示唆しています。
Lispから呼び出された際、この関数はシャドウファイルをバッファに表示するのではなく、一覧形式のメッセージを出力します。オプション引数 stringp が nil
以外の場合、代わりにシャドウファイルを文字列として返します。
Emacsがネイティブコンパイル対応でコンパイルされている場合(Lispのネイティブコードへのコンパイルを参照)、load-pathの検索で‘.elc’バイトコンパイル済みファイルが見つかると、Emacsは対応するネイティブコンパイル済みコードを含む‘.eln’ファイルを探そうとします。ネイティブコンパイル済みファイルは、native-comp-eln-load-pathに列挙されたディレクトリ内で検索されます。
この変数には、Emacsがネイティブコンパイル済みの ‘.eln’
ファイルを検索するディレクトリのリストが格納されています。リスト内の絶対パスではないファイル名は、invocation-directory を基準とした相対パスとして解釈されます(オペレーティングシステム環境を参照)。リストの最後のディレクトリはシステムディレクトリ、すなわちEmacsのビルドおよびインストール手順によって
‘.eln’
ファイルがインストールされるディレクトリです。リスト内の各ディレクトリにおいて、Emacsは、Emacsのバージョンと現在のネイティブコンパイル
ABI に依存する8文字のハッシュ値から構成される名前のサブディレクトリ内で
‘.eln’ ファイルを検索します。このサブディレクトリの名前は変数
comp-native-version-dir に格納されています。