GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/emacs/Lisp-Libraries.html ・ emacs-doc.conao3.com

29.8 Emacs用Lispコードライブラリ

Emacs Lispのコードは、慣習的にファイル名が.elで終わるファイルに保存されます。こうしたファイルは、Emacs Lispモードで自動的に表示されます。

Emacs Lispのコードはバイトコードにコンパイルでき、これにより読み込み速度が向上し、占有容量が削減され、実行速度も速くなります。慣例として、コンパイル済みのEmacs Lispコードは、ファイル名の末尾が‘.elc’となる別ファイルに保存されます。例えば、foo.elのコンパイル済みコードはfoo.elcに保存されます。Emacs Lispリファレンスマニュアルのバイトコンパイルを参照してください。

Emacs Lispのコードは、ネイティブコード(CやFortranのコンパイラが生成するものに近いマシンコード)にコンパイルすることも可能です。ネイティブコードはバイトコードよりもさらに高速に動作します。ネイティブコンパイルされたEmacs Lispのコードは、ファイル名の末尾が‘.eln’となるファイルに保存されます。Emacs Lispリファレンスマニュアルのネイティブコンパイルを参照してください。

Emacs Lispファイルをロードするには、M-x load-fileと入力します。このコマンドはミニバッファを使用してファイル名を読み込み、そのファイルの内容をEmacs Lispコードとして実行します。あらかじめファイルを開いておく必要はありません。このコマンドは、既存のEmacsバッファからではなく、ディスクから直接ファイルを読み込みます。

Emacs Lisp ファイルが Emacs Lisp の ロードパス(後述)にインストールされている場合、M-x load-file の代わりに M-x load-library と入力することでそのファイルをロードできます。M-x load-library コマンドはファイル名ではなく ライブラリ名 を要求し、Emacs Lisp ロードパス内の各ディレクトリを検索して、そのライブラリ名に一致するファイルを探します。ライブラリ名が ‘foo’ の場合、foo.elc、foo.el、foo という名前のファイルを検索します。(Emacs がネイティブコンパイルを有効にしてビルドされている場合、load-library は foo.el に対応する ‘.eln’ ファイルを探し、foo.elc の代わりにそれをロードします。)デフォルトの動作は、最初に見つかったファイルをロードすることです。このコマンドは、コンパイル済みファイルの方がロードと実行が速いため、.elc ファイルよりも .eln ファイルを、.el ファイルよりも .elc ファイルを優先します。lib.el が lib.elc よりも新しいことが判明した場合、誰かが .el ファイルに変更を加えたにもかかわらず再コンパイルし忘れた可能性を考慮して警告を表示しますが、それでも .elc ファイルをロードします。(この動作により、Emacs Lisp ソースファイルへの未完了の編集内容を保存し、変更内容が利用可能になるまで再コンパイルせずにおくことができます。)ただし、オプション load-prefer-newer に nil 以外の値を設定した場合、前述の手順ではなく、Emacs はファイルの最新バージョンをロードします。Emacs がネイティブコンパイルでビルドされており、lib.el に対応する ‘.eln’ ファイルが見つからない場合、lib.elc をロードしてバックグラウンドで lib.el のネイティブコンパイルを開始し、コンパイルが完了した時点で ‘.eln’ ファイルをロードします。

Emacs Lispプログラムは通常、load関数を用いてEmacs Lispファイルを読み込みます。これはload-libraryに似ていますが、より低レベルであり、追加の引数を受け付けます。Emacs Lispリファレンスマニュアルのプログラムの読み込み方法を参照してください。

Emacs Lispのロードパスは、変数 load-path で指定されます。その値はディレクトリ(文字列)のリストである必要があります。これらのディレクトリは、M-x load-library コマンド、下位レベルの load 関数、およびEmacs Lispライブラリを検索するその他のEmacs関数によって、指定された順序で探索されます。load-path のエントリには特別な値 nil を指定することもでき、これは現在のデフォルトディレクトリを表しますが、この値を使用することはほぼ常に得策ではありません。なぜなら、その意味は load-path がEmacsによって使用された際にアクティブなバッファに依存するためです。(もしリストに nil があればいいのにと思うなら、おそらく本当に使いたいのは M-x load-file でしょう。)

load-path のデフォルト値は、Emacs 本体の Lisp コードが格納されているディレクトリのリストです。 別のディレクトリに自作のライブラリがある場合は、そのディレクトリをロードパスに追加できます。 このマニュアルで説明されている他のほとんどの変数とは異なり、load-path はカスタマイズ・インターフェース(簡単なカスタマイズ・インターフェース を参照)からは変更できませんが、init ファイル(Emacs 初期化ファイル を参照)に次のような行を記述することで、ディレクトリを追加できます:

(add-to-list 'load-path "/path/to/my/lisp/library")

ローカルにインストールしたライブラリは、デフォルト値である load-path に含まれる site-lisp ディレクトリ、または site-lisp のサブディレクトリのいずれかに配置するのが一般的です。これにより、load-path のデフォルト値を変更する必要がなくなります。

load-pathと同様に、ネイティブコンパイルされたLispコードを含む*.elnファイルをEmacsが検索するディレクトリの一覧は、変数native-comp-eln-load-pathで指定されます。

一部のコマンドはオートロードされており、実行するとEmacsは関連するライブラリを自動的に先に読み込みます。例えば、M-x compileコマンド(Emacsでのコンパイル実行を参照)はオートロードされており、このコマンドを呼び出すと、Emacsは自動的にcompileライブラリを先に読み込みます。対照的に、M-x recompileコマンドはオートロードされていないため、compileライブラリを読み込むまで利用できません。

自動ロードは、自動ロードされるコマンドのドキュメントを参照した際(コマンド名または変数名によるヘルプを参照)、そのドキュメントがライブラリ内の他の関数や変数に言及している場合にも発生します(ライブラリをロードすることで、Emacsは*Help*バッファ内のハイパーリンクを適切に設定できます)。この機能を無効にするには、変数help-enable-autoloadをnilに変更してください。

describe-variable および describe-function の名前を補完する際にも、補完対象のプレフィックスに基づいて自動読み込みが行われます。この機能を無効にするには、変数 help-enable-completion-autoload を nil に変更してください。

ライブラリをEmacsが検出してロードできるディレクトリに配置したら、起動時に利用可能にしておきたい場合があるでしょう。これは、ライブラリがオンデマンドで自動的に利用可能となるべき機能を定義しており、手動でライブラリをロードするのが不便な場合に有用です。このような場合は、initファイルに適切なフォームを追加して、ライブラリが確実にロードされるようにしてください。常に起動時にライブラリをロードする必要がある場合は load または require を、特定のコマンドや関数が呼び出された際にEmacsにライブラリをロードさせたい場合は autoload を指定してください。例えば:

 ;; Loads my-shining-package.elc unconditionally.
 (require 'my-shining-package)
 ;; Will load my-shining-package.elc when my-func is invoked.
 (autoload 'my-func "my-shining-package")

なお、package-install(パッケージのインストールを参照)を用いてパッケージをインストールすると、パッケージのLispファイルがEmacsから参照可能なディレクトリに配置されるほか、必要に応じてload-pathも拡張されるため、こうしたパッケージでは前述の手動によるカスタマイズは不要となります。