provide と require
は、ファイルを自動的に読み込むための autoload の代替手段です。これらは名前付きの フィーチャー
として機能します。自動読み込みは特定の関数を呼び出すことでトリガーされますが、フィーチャーが読み込まれるのは、別のプログラムが名前を指定して初めて要求したときです。
フィーチャー名とは、関数や変数などの集合を表すシンボルのことです。これらを定義するファイルは、そのフィーチャーを提供する必要があります。これらを利用する別のプログラムは、フィーチャーを要求することで、定義がなされていることを確実にできます。これにより、定義ファイルがまだ読み込まれていない場合は、そのファイルが読み込まれます。
機能の存在を必須とする場合は、機能名を引数として require を呼び出します。require はグローバル変数 features
を参照し、目的の機能が既に提供されているかを確認します。提供されていない場合は、適切なファイルから機能を読み込みます。このファイルは、トップレベルで
provide を呼び出して機能を features に追加する必要があります。これが失敗した場合、require がエラーを通知します。
例えば、idlwave.el では、idlwave-complete-filename の定義に以下のコードが含まれています。
(defun idlwave-complete-filename ()
"Use the comint stuff to complete a file name."
(require 'comint)
(let* ((comint-file-name-chars "~/A-Za-z0-9+@:_.$#%={}\\-")
(comint-completion-addsuffix nil)
...)
(comint-dynamic-complete-filename)))
式 (require 'comint) は、ファイル comint.el がまだロードされていない場合にそれをロードし、comint-dynamic-complete-filename
が定義されるようにします。通常、機能はそれを提供するファイルにちなんで命名されるため、require
にファイル名を指定する必要はありません。(なお、require 文を let の本体の外に記述することが重要である点に注意してください。変数が let
で束縛されている間にライブラリをロードすると、let の終了後に変数が未束縛になるといった、意図しない結果を招く可能性があります。)
comint.el ファイルには、以下のトップレベル式が含まれています。
(provide 'comint)
これにより、グローバルリスト features に comint が追加され、以降 (require
'comint) は何も行う必要がないことが分かります。
ファイルのトップレベルで require
を使用すると、そのファイルを読み込む際だけでなく、バイトコンパイルを行う際にも効果が現れます(バイトコンパイル
を参照)。これは、必要なパッケージにバイトコンパイラが認識しておくべきマクロが含まれている場合に備えるためです。また、require
で読み込まれたファイル内で定義された関数や変数に対するバイトコンパイラの警告を回避することもできます。
require へのトップレベル呼び出しはバイトコンパイル時に評価されますが、provide への呼び出しは評価されません。したがって、以下の例のように、同一の機能に対して provide に続いて require
を記述することで、定義ファイルがバイトコンパイルされる前に確実に読み込まれるようにできます。
(provide 'my-feature) ; Ignored by byte compiler,
; evaluated by load.
(require 'my-feature) ; Evaluated by byte compiler.
コンパイラは provide を無視し、該当するファイルを読み込むことで require を処理します。ファイルの読み込みによって provide の呼び出しが実行されるため、ファイルが読み込まれた際、後続の require の呼び出しは何も行いません。
この関数は、feature が現在の Emacs セッションにロード済みであるか、あるいはロード中であることを通知します。これは、feature に関連する機能が、他の Lisp プログラムでも利用可能であるか、あるいは利用可能になることを意味します。
provide を呼び出すことによる直接的な効果は、features の先頭に feature
が(まだそのリストに含まれていない場合に)追加され、それを待機している任意の eval-after-load コードが呼び出されることです(読み込み用フック を参照)。引数 feature はシンボルである必要があります。provide
は feature を返します。
指定されている場合、subfeatures は、このバージョンの feature
が提供する特定のサブフィーチャーの集合を示すシンボルのリストである必要があります。サブフィーチャーの有無は featurep を用いて確認できます。サブフィーチャーという考え方は、パッケージ(1つの feature)が十分に複雑で、ロードされるか否か、あるいは特定のバージョンに存在するか否かにかかわらず、パッケージのさまざまな部分や機能に名前を付けることが有用である場合に、それらを利用するというものです。例については、ネットワーク機能の可用性のテスト
を参照してください。
features
⇒ (bar bish)
(provide 'foo)
⇒ foo
features
⇒ (foo bar bish)
オートロードを満たすためにファイルが読み込まれ、その内容の評価におけるエラーにより処理が停止した場合、読み込み中に発生した関数定義やprovide呼び出しは取り消されます。 オートロードを参照してください。
この関数は、現在の Emacs セッションに feature が存在するかどうかを調べます((featurep feature) を使用します。後述)。引数
feature はシンボルである必要があります。
その機能が利用できない場合、require は load を用いて filename を読み込みます。filename が指定されていない場合は、シンボル feature
の名前が読み込み元のベースファイル名として使用されます。ただし、この場合、require は
feature に ‘.el’
または ‘.elc’
という接尾辞(圧縮接尾辞が付加される場合もあります)を付けて探すことを要求し、単に feature
という名前のファイルは使用されません。(変数 load-suffixes で、必要となる正確な
Lisp 接尾辞を指定します。)
noerror が nil
以外の場合、ファイルの実際の読み込みに伴うエラーが抑制されます。その場合、ファイルの読み込みに失敗すると require は nil を返します。通常、require は feature を返します。
ファイルの読み込みに成功したものの、feature が提供されない場合、require は当該機能の欠落に関するエラーを示します。
この関数は require と同様に動作しますが、feature が既にロードされている場合(すなわち、後述の features のリストに既に含まれている場合)は除きます。feature が既にロードされている場合、この関数は feature
が filename
とは異なるファイルによって提供されているかを確認し、そうであればデフォルトでエラーを発生させます。オプション引数 noerror の値が reload
である場合、関数はエラーを発生させず、代わりに filename を強制的に再ロードします。noerror が nil 以外の値である場合、関数は feature が既に別のファイルによって提供されていることに関する警告を出力します。
この関数は、現在のEmacsセッションでfeatureが提供されている場合(すなわち、featureがfeaturesのメンバーである場合)、tを返します。subfeatureがnilでない場合、この関数は当該サブフィーチャーも提供されている場合(すなわち、subfeatureがfeatureシンボルのsubfeatureプロパティのメンバーである場合)に限り、tを返します。
この変数の値は、現在のEmacsセッションでロードされた特徴量であるシンボルのリストです。各シンボルはprovideの呼び出しによってこのリストに追加されました。featuresリスト内の要素の順序に意味はありません。
use-package
マクロは、機能をロードして利用するための設定を行う便利な手段を提供します。これにより、require
のように機能を必須とする処理と、ロードタイムフック(ロード用フック
を参照)と同様に、実際に機能がロードされた際に実行されるコードを組み合わせることができます。use-package の宣言的な構文により、ユーザーの初期化ファイルで非常に簡単に利用できます。
このマクロは、指定された feature の読み込み方法、および使用するための設定・カスタマイズ方法を規定します。引数 args はキーワードと値のペアです。重要なキーワードとその値の一部を以下に示します。
:init formsfeature が読み込まれる前に実行する forms を指定します。
:config formsfeature の読み込み後に実行する forms を指定します。
:defer conditioncondition が nil 以外の場合、feature の自動ロードされるコマンドまたは変数のいずれかが最初に使用されるまで、feature のロードを延期することを指定します。condition
が数値 n の場合、n 秒間のアイドル時間の後に feature をロードすることを指定します。
:commands commands…自動ロードする feature のコマンドを指定します。
:bind keybindings…featureコマンド用のkeybindingsを指定します。各バインディングは以下の形式となります。
(key-sequence . command)
または
(:map keymap (key-sequence . command))
ここで key-sequence は、kbd
マクロが受け付ける形式になっています(キーシーケンス
を参照)。
use-packageの詳細については、use-package
ユーザーマニュアルを参照してください。