Next: Emacs Lisp式の評価, Previous: Lisp式の実行, Up: プログラムのコンパイルとテスト [Contents][Index]
Emacs Lispのコードは、慣習として.elで終わる名前のファイルに保存されます。このようなファイルは、自動的にEmacs Lispモードでvisitされます。
Emacs Lispのコードは、loadが速く省スペースで、実行も速いバイトコードにコンパイルできます。慣習により、コンパイルされたEmacs Lispのコードは‘.elc’で終わる名前の別のファイルに保存されます。たとえば、foo.elをコンパイルしたコードはfoo.elcになります。Byte Compilation in the Emacs Lisp Reference Manualを参照してください。
Emacs Lispコードをネイティブコード(native code)にコンパイルすることもできます。これはCやFortranコンパイラーが生成するマシンコードと違いはありません。ネイティブコードはバイトコードよりもさらに高速に実行されます。ネイティブにコンパイルされたEmacs Lispコードは、名前が‘.eln’で終わるファイルに格納されます。Native Compilation in the Emacs Lisp Reference Manualを参照してください。
Emacs Lispファイルをロード(load)するには、M-x load-fileとタイプします。このコマンドはミニバッファーを使ってファイル名を読み取り、そのファイル内容をEmacs Lispコードとして実行します。最初にファイルをvisitしておく必要はありません。このコマンドは、既存のEmacsバッファーからではなく、ディスクからファイルを直接読み込みます。
Emacs Lispファイルが、Emacs Lispのロードパス(load path:
以下で定義)にインストールされている場合、M-x load-fileではなくM-x
load-libraryとタイプしてロードできます。M-x
load-libraryコマンドは、ファイル名ではなくライブラリー名(library name)の入力を求めます。これはEmacs
Lispのロードパスの各ディレクトリーを検索して、そのライブラリー名にマッチするファイルを見つけようと試みます。ライブラリー名が‘foo’の場合、ファイル名foo.elc、foo.el、fooを見つけようと試みます(ネイティブコンパイルを有効にしてEmacsをビルドした場合には、load-library
はfoo.elに対応するfoo.elcを探す)。デフォルトの動作では、最初に見つかったファイルをロードします。このコマンドは.elより.elc、.elcより.elnを優先します。それはコンパイルされたファイルの方が、ロードと実行が速いからです。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
と似ていますが、より低レベルで追加の引数を指定できます。How
Programs Do Loading in the Emacs Lisp Reference Manualを参照してください。
Emacs
Lispのロードパスは、変数load-path
により指定されます。この変数の値は、ディレクトリー(文字列)のリストです。これらのディレクトリーは、M-x
load-libraryコマンド、低レベルのload
関数、その他のEmacs
Lispライブラリーを探すEmacs関数により、指定された順に検索されます。load-path
のリストの要素には、特別な値nil
も指定できます。これはカレントのデフォルトディレクトリーを意味しますが、その意味するところはEmacsがload-path
を使用する際のカレントディレクトリーに依存するはずなので、これを使うのは大抵間違っています(リストにnil
を含めたいと思うとき、大抵の場合は、本当に望んでいるのはM-x
load-fileを使用することです)。
load-path
のデフォルト値は、Emacs自身がLispコードを格納するディレクトリーのリストです。他のディレクトリーに独自のライブラリーがある場合、ロードパスにそのディレクトリーを追加できます。このマニュアルで説明されている他の大半の変数とは異なり、load-path
はCustomizeインターフェース(Easy Customizationインターフェースを参照してください)を通じての変更はできません。しかしinitファイルに以下のような行を記述して、ディレクトリーを追加できます(Emacs初期化ファイルを参照してください):
(add-to-list 'load-path "/path/to/my/lisp/library")
通例ではローカルにインストールしたライブラリーは、すでにload-path
のデフォルト値であるsite-lispディレクトリーか、site-lispのサブディレクトリーに配置します。この方法ならload-path
のデフォルト値を変更する必要はありません。
load-path
と同じように、EmacsがネイティブコンパイルされたLispコードをもつ*.elnファイルを探すディレクトリーのリストは、変数native-comp-eln-load-path
で指定します。
いくつかのコマンドは、自動ロード(autoload)されます。これらを実行するとき、Emacsは最初に関連するライブラリーを自動的にロードします。たとえばM-x
compileコマンド(Emacs下でのコンパイルの実行を参照してください)は、自動ロードされます。これを呼び出した場合、Emacsは最初に、自動的にcompile
ライブラリーをロードします。対照的にコマンドM-x
recompileは、自動ロードされません。そのため、このコマンドはcompile
ライブラリーをロードするまで利用できません。
自動的なロードは、自動ロードされたコマンドのドキュメントを探すとき(コマンドと変数名のヘルプを参照してください)にも発生します。それは、ドキュメントがライブラリーの他の関数や変数を参照する場合です(ライブラリーのロードにより*Help*バッファーのハイパーリンクが適切にセットアップされます)。この機能を無効にするには、変数help-enable-autoload
をnil
に変更してください。
describe-variable
とdescribe-function
での名前補完時にも、接頭辞が補完されたかにもとづいて、自動ロードが発生します。この機能を無効にするには、変数help-enable-completion-autoload
をnil
に変更してください。
Emacsが検索、ロード可能なディレクトリーにライブラリーを一度配置したら、スタートアップ時に利用可能にしたいと思うかもしれません。これはライブラリーがオンデマンドで自動的に利用可能になる必要がある機能を定義していて、手動でのライブラリーが不便な際に有用です。この場合にはinitファイルに適切なフォーム(スタートアップ時にライブライーのロードが常に必要ならload
かrequire
、あるコマンドや関数の呼び出し時にEmacsがライブラリーのロードを要するならautoload
)を追加して確実にライブラリーがロードされるようにしてください。たとえば:
;; 無条件でmy-shining-package.elcをロード (require 'my-shining-package)
;; my-func
呼び出し時にmy-shining-package.elcをロード
(autoload 'my-func "my-shining-package")
package-install
(パッケージのインストールを参照)を使用したパッケージのインストールでは、Emcasが探すディレクトリーにパッケージのLispファイルを配置するように配慮するとともに、上述した手動によるカスタマイズが不要となるように必要な初期化コードをinitファイルに書き込むことに注意してください。