Emacsがバイトコンパイル済みファイルから関数や変数を読み込む際、通常はそのドキュメント文字列をメモリに読み込みません。各ドキュメント文字列は、必要になった時点で初めてバイトコンパイル済みファイルから動的に読み込まれます。これによりメモリが節約され、ドキュメント文字列の処理を省略することで読み込みが高速化されます。
この機能には欠点があります。コンパイル済みファイルを削除、移動、または変更(新しいバージョンをコンパイルするなど)すると、Emacsが以前にロードされた関数や変数のドキュメント文字列にアクセスできなくなる場合があります。このような問題は通常、Emacsを自前でビルドし、たまたまLispソースファイルを編集および/または再コンパイルした場合にのみ発生します。これを解決するには、再コンパイル後に各ファイルを再読み込みしてください。
バイトコンパイル済みファイルからのドキュメント文字列の動的読み込みは、コンパイル時に各バイトコンパイル済みファイルごとに決定されます。この機能は、オプション
byte-compile-dynamic-docstrings で無効化できます。
これが non-nil
の場合、バイトコンパイラはドキュメント文字列の動的ロードに対応したコンパイル済みファイルを生成します。
特定のファイルに対して動的読み込み機能を無効にするには、そのヘッダー行でこのオプションを nil
に設定します(The GNU Emacs Manual の Local
Variables in Files を参照)。以下のように設定します。
-*-byte-compile-dynamic-docstrings: nil;-*-
これは主に、ファイルを変更することが想定されており、すでにそのファイルを読み込んだEmacsセッションが、変更後も引き続き動作することを望む場合に有用です。
内部的には、ドキュメント文字列の動的ロードは、特殊なLispリーダー構文である‘#@count’を用いてコンパイル済みファイルを書き出すことで実現されています。この構文は、続くcount文字をスキップします。また、このファイルの名前を表す‘#$’構文を文字列として使用します。これらの構文をLispソースファイル内で使用しないでください。ファイルを読む人間にとって分かりやすくなるよう設計されていないためです。