ダイナミックEmacsモジュール(dynamic Emacs module: 動的Emacsモジュール)とは、Emacs Lispで記述されたパッケージのように、Emacs Lispプログラムで使用するための追加機能を提供する共有ライブラリーです。
Emacs Lispパッケージをロードする関数は、ダイナミックモジュールのロードもできます。これらの関数はファイル名の拡張子、いわゆる“サフィックス”を調べることによってダイナミックモジュールを認識します。
この変数はモジュールファイルにたいするシステム依存なファイル名拡張子を保持する。POSIXホストでは.so、macOSでは.dylib 、MS-Windowsでは.dll。
macOSではダイナミックモジュールは.dylibに加えて、サフィックス.soをもつこともできます。
すべてのダイナミックモジュールはemacs_module_init
という名前のCから呼び出し可能な関数をエクスポートする必要があります。Emacsはそのモジュールをロードするload
やrequire
の呼び出しの一部として、その関数を呼び出します。自身のコードがGPLまたは互換ライセンスの下にリリースされていることを示すために、plugin_is_GPL_compatible
という名前のシンボルもエクスポートするべきです。このようなシンボルをエクスポートしないモジュールをプログラムがロードしようとすると、Emacsはエラーをシグナルするでしょう。
あるモジュールがEmacsの関数の呼び出しを必要とするなら、Emacsディストリビューションに同梱されているヘッダーファイルemacs-module.hで定義および文書化されたAPI (Application Programming Interface)を介して行う必要があります。独自モジュールを記述する際におけるこのAPI使用の詳細は動的にロードされるモジュールの記述を参照してください。
モジュールはモジュールが定義するC構造体への埋め込みポインターとなるLispオブジェクトuser-ptr
を作成できます。これはモジュールが作成する複雑なデータ構造を維持してモジュールの関数に渡して戻す場合に有用です。user-ptrオブジェクトはそれに関連付けられるファイナライザー(finalizer:
オブジェクトがガーベージコレクトされる際に呼び出される関数)をもつこともできます。これはメモリー、オープンしたファイル記述子等のデータ構造の背後に割り当てられたリソースの解放に有用です。Lisp・モジュール間の値変換を参照してください。
この関数は引数がuser-ptr
オブジェクトならt
をリターンする。
Emacsは指定されたfileからモジュールをロードして、そのモジュールに必要な初期化えを行うために、この低レベルのプリミティブを呼び出す。これはモジュールがシンボルplugin_is_GPL_compatible
をエクスポートすることを保証して、モジュールのemacs_module_init
関数を呼び出し、その関数のリターン値がエラーを示したりユーザーが初期化中にC-gをタイプしたらエラーをシグナルする。初期化が成功するとmodule-load
はt
をリターンする。この関数はload
とは異なり既知の拡張子をもつファイルの検索を試みないので、fileは正確なファイル名拡張子をもたなければならないことに注意。
load
とは異なり、module-load
はload-history
にモジュールを記録せず、何もメッセージをプリントしないし、再帰ロードにたいする保護も行わない。したがってほとんどのユーザーはmodule-load
のかわりにload
、load-file
、load-library
、require
を使用するべきである。
Emacsのロード可能モジュールは、configure時にオプション--with-modulesを使用することにより有効になります。