広く利用されることを想定した Emacs Lisp コードを記述する際に従うべき規約を以下に示します。
この規約は、カスタム定義を含むすべてのファイルにおいて必須となります。このようなファイルを本規約に準拠させるために非互換な変更が必要な場合は、迷わずその変更を行ってください。先延ばしにしてはいけません。
ユーザー向けのコマンド名の場合、パッケージ名のプレフィックスよりも前にいくつかの単語を置いた方が便利なことがあります。例えば、オブジェクトを ‘list-something’ という名前で列挙するコマンドを設けるのが我々の慣習です。具体的には、‘frob’ というパッケージがあり、他のグローバルシンボルが ‘frob-’ で始まる場合、‘list-frobs’ というコマンドを設けることができます。また、関数や変数などを定義する構文も、‘define-’ で始まる方がうまく機能する場合があるため、名前のプレフィックスを後方に配置しても問題ありません。ただし、こうした確立されたケースを除き、基本的には名前のプレフィックスを先頭に付けるようにしてください。
twiddle-files のように、ある名称で Emacs
に追加すべきだと考える関数を書いたとしても、プログラム内ではその名称で呼ばないでください。プログラム内では mylib-twiddle-files と呼び、‘bug-gnu-emacs@gnu.org’ 宛てに、Emacs
への追加を提案するメールを送ってください。もし実際に追加されることになれば、名称は十分簡単に変更できます。
プレフィックスが1つでは不十分な場合、意味が通じる限り、パッケージでは2つまたは3つの代替の共通プレフィックスを使用できます。
lexical-binding を有効にし、既存の Emacs Lisp コードで
lexical-binding
がまだ有効になっていない場合は、それを有効にするよう変換することをお勧めします。Lisp 方言の選択 を参照してください。
provide への呼び出しを記述してください。Features を参照してください。
require を使用してください。Features を参照してください。
(eval-when-compile (require 'bar))
これにより、Emacsはfooをバイトコンパイルする直前にbarをロードし、コンパイル中にマクロ定義が利用可能になります。eval-when-compileを使用することで、fooのコンパイル済みバージョンが使用される際にbarをロードせずに済みます。これは、ファイル内でそのマクロが最初に使用される前に呼び出す必要があります。マクロとバイトコンパイルを参照してください。
require指定して済ませてください。しかし、ファイルに複数の独立した機能が含まれており、そのうち1つか2つだけが追加ライブラリを必要とする場合は、トップレベルではなく、該当する関数内にrequireステートメントを配置することを検討してください。あるいは、必要に応じてautoloadステートメントを使用して追加ライブラリを読み込んでください。こうすることで、ファイルのそれらの部分を使用しない人が、追加ライブラリを読み込む必要がなくなります。
clライブラリではなく、cl-libライブラリを使用してください。後者のライブラリは非推奨となっており、今後のEmacsのバージョンで削除される予定です。
framep や frame-live-p
が挙げられます。ブール型変数の名前にこの -p
という接尾辞を使用することは、変数が述語関数にバインドされている場合を除き、避けることを推奨します。代わりに -flag という接尾辞や、is-foo
のような名前を使用してください。
unload-feature
を使用すると、通常フィーチャーのロード時に行われる変更(フックへの関数追加など)が取り消されます。ただし、feature のロードによって通常とは異なる複雑な処理が行われる場合は、feature-unload-function
という名前の関数を定義して、そうした特殊な変更を取り消すことができます。その場合、unload-feature は当該関数が存在すれば自動的に実行します。アンローディングを参照してください。
(defalias 'gnus-point-at-bol
(if (fboundp 'point-at-bol)
'point-at-bol
'line-beginning-position))
eval-after-load や with-eval-after-load を使用することは避けてください(読み込み用フックを参照)。この機能は個人のカスタマイズを目的としたものであり、Lispプログラム内で使用することは、別のLispファイルの動作をそのファイルからは見えない形で変更するため、不作法な手法となります。これは、別のパッケージにある関数に助言を与えるのと同様に、デバッグの妨げとなります。
definition-name または find-function-type-alist
を付与することで、これらのツールが定義箇所の呼び出しを特定できるようにできます。定義の検索を参照してください。
path
を使用することを避け、代わりに file、file-name、または directory
を優先してください。これは、Emacs が GNU の慣習に従い、path
という用語をディレクトリ名のリストである検索パスにのみ使用しているためです。