検索エンジンから来た人に注意このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。 したがって、一般的な Emacs ユーザーにとっては、
このマニュアルと実機の動作とが符合しない場合があります。
|
Lispコードのファイルをロードするとは、その内容をLisp環境に Lispオブジェクトの形式で持ち込むことを意味します。Emacsはそのファイルを 見つけて開き、テキストを読み込み、各形式を評価し、その後ファイルを閉じます。
ロード関数群は、eval-current-buffer
関数がバッファ内の全ての式を
評価するのと同じように、ファイル内の全ての式を評価します。違いは、
ロード関数群が読み込んで評価するのは、ディスク上にあるファイル中の
テキストであり、Emacsバッファ内のテキストではないことです。
ロードされたファイルは、ソース・コードかバイトコンパイル・コードかの いずれかの形のLisp式を含ねばなりません。ファイル中の各形式は、 トップレベルの形式(top-level form)と呼ばれます。ロード可能な ファイル中の形式に特別なフォーマットは存在しません。ファイル中のどの形式も、 同じように、直接バッファにタイプしてそこで評価ができます(実際、 ほとんどのコードはこの方法で検査されます)。ほとんどの場合、それらの形式は 関数定義と変数定義です。
Lispコードを含むファイルはしばしばライブラリ(library)と呼ばれます。 それゆえ、「Rmailライブラリ」はRmailモードのためのコードを含むファイル であるといえます。 同様に、「Lispライブラリ・ディレクトリ」は、Lispコードを含むファイルの ディレクトリであるといえます。
Emacs Lispにはロードのためのインタフェースがいくつかあります。
たとえば、autoload
はあるファイル中の関数のために、名札オブジェクトを
作成します。自動ロード関数を呼び出そうとすると、その関数の実際の定義を
得るために、そのファイルがロードされます(see section 自動ロード)。require
は
そのファイルがまだロードされてないならば、ロードします
(see section 機能)。
結局、これらの機能全てはload
関数を呼び出してその作業を行ないます。
ファイルを見つけるのに、load
は最初に`filename.elc'という
名前のファイルを探します。つまり、filenameに`.elc'を追加した
名前のファイルを探します。その名前のファイルがあれば、それがロードされます。
その名前のファイルがないならば、load
は`filename.el'という
名前のファイルを探します。そのファイルがあれば、それがロードされます。
最後に、これらいずれの名前も見つからなかった場合に、load
は
filenameに何もつけない名前のファイルを探し、あればそれをロードします
(load
関数のfilenameの探し方は、そんなに賢くありません。
`foo.el.el'という意地悪な名前のファイルがあるときに、
(load "foo.el")
を評価すると、まさにこれを見つけてしまいます)。
オプション引数nosuffixが非nil
ならば、
接尾辞`.elc'や`.el'は試しません。この場合は、
欲しいファイル名を正確に指定する必要があります。
filenameが、たとえば`foo'や`baz/foo.bar'のように
相対ファイル名ならば、load
は変数load-pathを使って
そのファイルを探します。load-path
のリストの各ディレクトリに
filenameを追加して、名前が一致した最初のファイルをロードします。
現在のデフォルト・ディレクトリは、load-path
に指定されたときにかぎり
試されます。nil
が現在のデフォルト・ディレクトリを表します。
load
は三つの接尾辞候補全てについて、load-path
の最初の
ディレクトリで試し、次に2番目のディレクトリで試し、次のディレクトリで試し、
としていきます。
`foo.elc'が`foo.el'よりも古いという警告を受け取ったなら、 `foo.el'のリコンパイルを考えるべきでです。See section バイトコンパイル。
nomessageがnil
ならば、ロード中、
`Loading foo...'と`Loading foo...done'といったメッセージが
エコー領域に現れます。
ファイル・ロード中にハンドルされないエラーが起こると、ロードは打ち切られます。
ロードがautoload
のためになされたものであった場合、
そのロード中に行なわれた関数定義はいずれも取り消されます。
load
がロードすべきファイルを見つけられなかった場合、
file-error
エラーを(`Cannot open load file filename'とともに)
通知するのが普通です。しかし、missing-okが非nil
ならば、
load
は単にnil
を返します。
変数load-read-function
を使ってload
が式を読み込むために
read
の代わりに使う関数を指定することもできます。
以下を参照してください。
load
はファイルのロードが成功した場合、t
を返します。
load
でファイルをロードするときに検索を行なう
ディレクトリのリストです。各要素は文字列(ディレクトリ名であること)あるいは
nil
(現在の作業ディレクトリを表す)です。
load-path
の値は、環境変数EMACSLOADPATH
が設定されていれば
その値で初期化されます。さもなくば、Emacs構築時に`emacs/src/paths.h'で
指定したデフォルト値になります。
EMACSLOADPATH
の構文は、PATH
に使うものと同じです。
`:'(オペレーティング・システムによっては`;')で
ディレクトリ名を分離し、`.'を現在のデフォルト・ディレクトリに使用します。
EMACSLOADPATH
変数をcsh
の`.login'ファイルで
設定する例を挙げます:
setenv EMACSLOADPATH .:/user/bil/emacs:/usr/lib/emacs/lisp
sh
で設定する方法を挙げます:
export EMACSLOADPATH EMACSLOADPATH=.:/user/bil/emacs:/usr/local/lib/emacs/lisp
`.emacs'ファイルで、デフォルトのload-path
の前に
ディレクトリをいくつか追加するコードを挙げます:
(setq load-path (append (list nil "/user/bil/emacs" "/usr/local/lisplib" "~/emacs") load-path))
本例では、パスは現在の作業ディレクトリを最初に、 続いて`/user/bil/emacs'ディレクトリで、 次に`/usr/local/lisplib'ディレクトリで、 次に個人の`~/emacs'ディレクトリで、 それらの後でLispコードの標準ディレクトリを探します。
コマンド行オプション`-l'あるいは`-load'で、Emacs起動の一部として
ロードするLispライブラリを指定します。
このファイルは現在のディレクトリにあるかもしれないので、Emacs 18は一時的に
現在のディレクトリをload-path
の前に追加して、
そのファイルを見つけられるようにしていました。新しいEmacsの版では、
load-path
を変更せずに、こういった現在のディレクトリのファイルも
見つけることができます。
Emacsのダンプでは、load-path
に特別な値を使用します。
ダンプ終了時点でload-path
の値が変更されない(即ち、同じ特殊な値のまま)
ならば、ダンプされたEmacsは通常のload-path
の値に起動時に切替えます。
しかし、ダンプ終了時点でload-path
がそれ以外の値だったら、
その値がダンプされたEmacsの実行時にも使用されます。
そのため、`site-init.el'や`site-load.el'内でいくつかのライブラリを
ロードするために一時的にload-path
を変更したいならば、
load-path
をload
呼出し周辺でlet
によって、
ローカルに束縛しなければなりません。
nil
で、
それ以外ならばnil
となります。
load
とeval-region
について、
read
の代わりに使用する代替式読込み関数を指定します。
関数は引数を一つ、read
と全く同じように受け取らねばなりません。
通常この変数の値はnil
で、ロード関数群がread
を使わなければならない
ことを意味します。
load
がEmacs構築時にどのように使われるかについて知るには、
section Emacsを作るを参照してください。
自動ロード(autoload)機能によって、関数やマクロを、 Lisp内で既知ではあるが、それが定義されているファイルのロードは延期する、 ということができます。その関数への最初の呼出しで、適切なファイルを自動的に 読み込んで、実定義とほかの関連コードをインストールし、その後、実定義を あたかも元々からあったかのように実行します。
自動ロード関数を設定するには、二つの方法があります。autoload
を
呼ぶ方法と、特殊な「魔法」のコメントをソースの実定義の前に書く方法です。
自動ロードのためのautoload
は低水準のプリミティブですが、
任意のLispプログラムがautoload
を任意の時点で呼び出すことができます。
魔法のコメントは、それ自体は何もしません。しかしそれは、Emacs構築時に
実行されるようにautoload
呼出しを構築し調整する、
コマンドupdate-file-autoloads
の案内役として働きます。
魔法のコメントは関数を自動ロード化する最も簡便な方法ですが、
Emacsとともにインストールされるパッケージにしか使えません。
引数docstringはその関数の説明文字列です。通常、これは関数定義自身の
説明文字列と同じです。autoload
呼出しで説明文字列を指定することで、
関数の実定義をロードしなくても説明文字列を見ることができるようになります。
interactiveが非nil
ならば、関数は対話的に呼び出すことができます。
これでその関数の実定義をロードしなくても、M-xの補完が働くようになります。
完全な対話引数の指定はここでは与えなくて構いません。
ユーザが実際にfunctionを呼び出すまで、引数は不要であり、
もし呼び出したなら、実定義をロードするまでです。
マクロやキーマップも普通の関数同様に自動ロードできます。
functionが実際はマクロならば、typeをmacro
として
指定してください。functionが実際はキーマップならば、
typeをkeymap
として指定してください。Emacsのさまざまな部分で、
実定義をロードせずにこの情報を知る必要があります。
自動ロード・キーマップは、キー検索の際に、
前置キーのバインドがシンボルfunctionであったならば、
自動的にロードします。それ以外の種類のキーマップへのアクセスでは、
自動ロードは起こりません。特に、Lispプログラムが変数の値からキーマップを
取り出し、define-key
を呼び出す時には、起こりません。
変数名がシンボルfunctionと同一であっても起こりません。
訳注: キーマップの指定の仕方の例。
;; (autoload 'hoge-prefix "hoge.el" "Hoge map" t 'keymap) ;; (local-set-key "\C-c\C-c" 'hoge-prefix) ;; contents of file hoge.el follows. (defvar hoge-map nil) (if hoge-map nil (setq hoge-map (make-keymap)) (define-key hoge-map "\C-c" (lambda () (interactive) (message "hoge!")))) (fset 'hoge-prefix hoge-map)
functionがすでに非voidな関数定義を持ち、
それが自動ロード・オブジェクトではない場合、autoload
は何もしないで
nil
を返します。functionの関数セルがvoidな場合、
あるいはそれがすでに自動ロード・オブジェクトならば、
このような自動ロード・オブジェクトとして定義されます:
(autoload filename docstring interactive type)
たとえば、
(symbol-function 'run-prolog) => (autoload "prolog" 169681 t nil)
この場合、"prolog"
はロードするファイルの名前で、
169681は`emacs/etc/DOC'ファイル中の説明文字列を参照し
(see section 説明文字列の基礎)、t
は関数が対話的であることを意味し、
nil
でそれがマクロでもキーマップでもないことを示します。
自動ロード・ファイルは普通ほかの定義も含み、一つ以上の機能を
要求/提供します。ファイルが完全にロードされなかった場合(その内容の評価で出た
エラーのため)、ロード中に行なった、いかなる関数定義もprovide
の呼出しも、
取り消されます。
こうして、このファイルから自動ロードされるどの関数でも次の呼出しでは、
ファイルのロードをやり直すことを保証します。もしこうなっていなかったならば、
ファイル中のいくつかの関数が、定義されたようには見えるかもしれないが、
ファイルの後ろの方にあったためにうまくロードされなかった
サブルーチンの欠如により、それらは正しく動作しない、ということが起こり得ます。
自動ロードされたファイルが望みのLisp関数やマクロの定義に失敗すると、
"Autoloading failed to define function function-name"
という
データでエラーが通知されます。
魔法の自動ロード・コメントは、自動ロード可能なソース・ファイル中の
関数の実定義の直前に`;;;###autoload'のように行に単独で書きます。
コマンドM-x update-file-autoloadsは、対応するautoload
呼出しを
`loaddefs.el'に書き込みます。`loaddefs.el'はEmacsの構築中に
ロードされるので、autoload
が呼び出されます。
M-x update-directory-@linebreak{autoloads}はさらに強力です。
これは現在のディレクトリ中の全てのファイルについて、自動ロードを更新します。
同じ魔法のコメントで任意の形式を`loaddefs.el'にコピーできます。
魔法のコメントに続く形式が関数定義でないならば、それはそのままコピーされます。
魔法のコメントを、そのファイルがロードされるときには実行せずに、
構築時に実行するという形式を作るために使うこともできます。
こうするには、形式を魔法のコメントと同じ行に書きます。
それはコメント中にあるので、ファイルをロードしたときには何もしません。
しかし、update-directory-autoloads
はそれを`loaddefs.el'に
コピーするので、Emacs構築中に実行されます。
以下の例は、魔法のコメントでdoctor
の自動ロードが
どのように準備されるかを示します:
;;;###autoload (defun doctor () "Switch to *doctor* buffer and start giving psychotherapy." (interactive) (switch-to-buffer "*doctor*") (doctor-mode))
これが`loaddefs.el'に生成されます:
(autoload 'doctor "doctor" "\ Switch to *doctor* buffer and start giving psychotherapy." t)
二重引用符直後に続くバックスラッシュと改行は、`loaddefs.el'のように
プリロードされるLispファイル中だけで使う、お決まりの手法です。
これによってmake-docfile
に、この説明文字列は`etc/DOC'ファイルに
置くとのだということを示します。See section Emacsを作る。
1回のEmacsセッション中で、一つのファイルを複数回ロードしても構いません。 たとえば、バッファで編集して、関数定義を書き直して再インストールした後に、 元の版に戻りたいと思うかもしれません。 そうするには、その関数があったファイルを再ロードすればよいのです。
ファイルをロードあるいは再ロードするときは、load
や
load-library
関数がコンパイルされてないファイルではなく、
類似の名前のバイトコンパイルされたファイルを自動的にロードするということを
覚えておいてください。保存して再インストールしたいと思ったファイルを
書き直した場合には、必要ならそれをバイトコンパイルしてください。
さもないと不注意にも古いバイトコンパイルされたファイルを、
新しいコンパイルされてないファイルの代わりに再ロードしてしまうかも知れません!
Lispライブラリ・ファイル中に形式を書く時は、そのファイルが複数回
ロードされるかもしれないことを念頭に置いてください。
たとえば、変数定義がdefvar
か defconst
かというのは、
ライブラリが再ロードされたときにその変数を再初期化するのが望ましいか否かに
依存します。つまりdefconst
は再初期化しますが、defvar
は
これを行ないません(See section グローバル変数の定義)。
要素をalistに追加する最も簡単な方法は、こうなります:
(setq minor-mode-alist (cons '(leif-mode " Leif") minor-mode-alist))
しかしこれではライブラリが再ロードされた場合、要素が重複して追加されます。 この問題を避けるには、次のように書きます:
(or (assq 'leif-mode minor-mode-alist) (setq minor-mode-alist (cons '(leif-mode " Leif") minor-mode-alist)))
リストに要素を重複せずに追加するには、add-to-list
を使います。
(see section 変数の値を変更する方法)。
ライブラリがすでにロードされたか否かを明示的に検査したくなることも あるでしょう。ライブラリ中で、それが以前ロードされたか否かを検査する 一つの方法をここに示します:
(defvar foo-was-loaded) (if (not (boundp 'foo-was-loaded)) execute-first-time-only) (setq foo-was-loaded t)
ライブラリがprovide
を使って名前つき機能を提供しているならば、
featurep
でそのライブラリがロードされたか否かを検査できます。
provide
とrequire
とはファイルを自動的にロードする
autoload
の代わりになります。これらは、名前つき機能(feature)に
基づいて働きます。
自動ロードは特定の関数の呼出しによって起動されますが、機能はほかのプログラムが
はじめてそれを名前で要求したときにロードされます。
機能名は関数や変数などをまとめたものを代表するシンボルです。 それらを定義するファイルはその機能を提供(provide)しなくてはならりません。 それらを使うほかのプログラムはその機能を要求(require)することで、 定義されていることを保証するかも知れません。要求した機能が まだロードされてなければ、定義ファイルをロードします。
機能が存在することを要求するには、機能名を引数としてrequire
を
呼び出します。require
はグローバル変数features
を覗いて、
望みの機能がすでに提供されているか調べます。
なければ、その機能を適切なファイルからロードします。ロードされるファイルは
features
にその機能を追加するために、provide
をトップレベルで
呼び出す必要があります。それに失敗すると、require
はエラーを通知します。
機能は普通それを提供するファイルに因んで名づけられます。そうすると、
require
にファイル名を与える必要がなくなります。
たとえば、`emacs/lisp/prolog.el'においては、run-prolog
の
定義が次のコードを含みます:
(defun run-prolog () "Run an inferior Prolog process, input and output via buffer *prolog*." (interactive) (require 'comint) (switch-to-buffer (make-comint "prolog" prolog-program-name)) (inferior-prolog-mode))
式(require 'comint)
で、`comint.el'がまだロードされてなければ、
それをロードします。これによって、make-comint
が定義されていることを
保証します。
`comint.el'は次のトップレベルの式を含んでいます。
(provide 'comint)
これはcomint
をグローバルなfeatures
リストに追加し、
そうすることで(require 'comint)
に、もう何もしなくてよいことを
知らせます。
require
をファイルのトップレベルで使うと、
ロードしたときと同様、そのファイルのバイトコンパイル時
(see section バイトコンパイル)にも効果を発揮します。要求されたパッケージが
バイトコンパイラが知るべきマクロを含む時には、このようにします。
require
のトップレベルでの呼出しはバイトコンパイル時に
評価されますが、provide
呼出しは違います。それゆえ、定義ファイルに
同じ機能についてのprovide
に続くrequire
を含めることで、
それがバイトコンパイル以前にロードされることを保証できます。
次の例のようになります。
(provide 'my-feature) ; バイトコンパイラは無視し、
; load
は評価する。
(require 'my-feature) ; バイトコンパイラが評価する。
コンパイラはprovide
を無視し、require
を処理することで
問題のファイルをロードします。問題のファイルをロードすると、
provide
呼出しが実行されるので、続くrequire
呼出しは
ロード中何もしなくてよくなります。
provide
呼出しの直接の効果は、まだ入ってないならばfeatureを、
リストfeature
の先頭に追加することです。
引数featureは実際シンボルでなければなりません。
provide
はfeatureを返します。
features => (bar bish) (provide 'foo) => foo features => (foo bar bish)
ファイルが自動ロードを満足するためにロードされ、
それが内容の評価中にエラーでストップした場合、
そのロード中に発生した関数定義やprovide
呼出しは、全て取り消されます。
See section 自動ロード。
(featurep feature)
を使います。以下参照)。
存在しないならば、require
はfilenameをload
でロードします。
filenameが与えられないならば、シンボルfeatureの名前を
ロードのファイル名として使います。
ファイルのロードでfeatureの提供に失敗すると、
require
は`Required feature feature was not provided'
というエラーを通知します。
features
のメンバである)ならば、
t
を返します。
provide
呼出しによって本リストに置かれます。
features
リスト内の要素順序に意味はありません。
ライブラリによってロードされた関数や変数を捨てて、
ほかのLispオブジェクトのためにメモリを再生することができます。
そうするには、関数unload-feature
を使います:
defconst
, defvar
, defun
,
defmacro
, defsubst
, defalias
で定義された
全ての関数、マクロ、変数を未定義化します。
その後、以前これらシンボルに関連づけられていた自動ロードを全て復元します
(ロードはこれらをシンボルのautoload
属性に保存しています)。
通常unload-feature
は、ほかのロードされたライブラリが依存するような
ライブラリのアンロードは拒否します(ライブラリaがライブラリbに
依存するのは、aがbのrequire
を含む時です)。
オプション引数forceが非nil
ならば、
依存性を無視して任意のライブラリをアンロードできます。
unload-feature
関数はLispで書かれています。
そしてその動作は、変数load-history
に基づいています。
各要素がリストで、一つのライブラリを表します。 そのリストのCARはライブラリの名前の文字列です。 リストの残りは以下のオブジェクトから成ります:
(require . features)
の形式のリストで、
要求された機能を表します。
(provide . features)
の形式のリストで、
提供された機能を表します。
load-history
の値にCARがnil
である要素が一つあるかも
知れません。この要素は、ファイルに対応づいていないバッファで行なった
eval-buffer
による定義であることを表しています。
コマンドeval-region
はload-history
を更新しますが、
読み込んだファイルに関しての要素を置き換えるのではなく、
その要素に定義されたシンボルを追加する、というやり方をします。
特定のライブラリがロードされたときに、あるコードを実行するように、
eval-after-load
を呼び出すことで要求することができます。
ライブラリ名libraryはload
の引数と完全に
一致しなければなりません。load-path
を検索してインストールされた
ライブラリが見つかったときに正しい結果を得るには、library内に
いかなるディレクトリ名も含めてはなりません。
form内でエラーが起きてもロードは取り消されませんが、 formの残り部分は実行されません。
一般的には、よく設計されたLispプログラムは本機能を使ってないはずです。
Lispライブラリとの、きれいでモジュール式の対話法は、
(1) ライブラリの変数(ライブラリ外での使用を意味する)を検査し設定する、
(2) ライブラリの関数を呼び出す、
です。(1)をやりたいときは、直ちに行なうことができます(ライブラリが
ロードされるのを待つ必要がない)。(2)を行うには、
ライブラリをロードする必要があります(require
が望ましい)。
しかし、リリース用プログラムの設計標準に合わせる必要はないと
感じるのであれば、eval-after-load
を自分の個人的カスタマイズに
使用しても構いません
(filename forms...)
関数load
は、eval-after-load
を実現するために
after-load-alist
をチェックします。
Go to the first, previous, next, last section, table of contents.