Next: , Previous: , Up: プログラムのコンパイルとテスト   [Contents][Index]


28.8 EmacsのためのLispコードによるライブラリー

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.elcfoo.elfooを見つけようと試みます(ネイティブコンパイルを有効にしてEmacsをビルドした場合には、load-libraryfoo.elに対応するfoo.elcを探す)。デフォルトの動作では、最初に見つかったファイルをロードします。このコマンドは.elより.elc.elcより.elnを優先します。それはコンパイルされたファイルの方が、ロードと実行が速いからです。lib.ellib.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-autoloadnilに変更してください。

describe-variabledescribe-functionでの名前補完時にも、接頭辞が補完されたかにもとづいて、自動ロードが発生します。この機能を無効にするには、変数help-enable-completion-autoloadnilに変更してください。

Emacsが検索、ロード可能なディレクトリーにライブラリーを一度配置したら、スタートアップ時に利用可能にしたいと思うかもしれません。これはライブラリーがオンデマンドで自動的に利用可能になる必要がある機能を定義していて、手動でのライブラリーが不便な際に有用です。この場合にはinitファイルに適切なフォーム(スタートアップ時にライブライーのロードが常に必要ならloadrequire、あるコマンドや関数の呼び出し時に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ファイルに書き込むことに注意してください。