以下は幅広いユーザーを意図したEmacs Lispコードを記述する際にしたがうべき慣習です:
この慣習はカスタム定義を含むすべてのファイルに必須である。そのようなファイルを慣習にしたがうために修正するのが非互換の変更を要するなら、構うことはないから非互換の修正を行うこと。先送りにしてはならない。
ユーザーの使用を意図したコマンド名では、何らかの単語がそのパッケージ名のプレフィクスの前にあると便利なことがある。たとえばわたしちの慣習ではオブジェクトをリストするコマンドの名前なら‘list-something’、すなわち‘frob’と呼ばれるパッケージのグローバルシンボルが‘frob-’で始まれば‘list-frobs’というコマンドをもつかもしれない。さらに関数や変数等を定義する構文が‘define-’で始まればより良く機能するので、名前内でそれらの後に名前プレフィクスを置くこと。
この勧告はcopy-list
のようなEmacs
Lisp内のプリミティブではなく、伝統的なLispプリミティブにさえ適用される。信じようと信じまいとcopy-list
を定義する尤もらしい方法は複数あるのだ。安全第一である。かわりにfoo-copy-list
やmylib-copy-list
のような名前を生成するために、あなたの名前プレフィクスを追加しよう。
twiddle-files
のような特定の名前でEmacsに追加されるべきだと考えている関数を記述する場合には、プログラム内でそれを名前で呼び出さないこと。プログラム内ではそれをmylib-twiddle-files
で呼び出して、わたしたちがそれをEmacsに追加するため提案メールを、‘bug-gnu-emacs@gnu.org’に送信すること。もし追加することになったときに、わたしたちは十分容易にその名前を変更できるだろう。
1つのプレフィクスで十分でなければ、それらに意味があるかぎり、あなたのパッケージは2つか3つの一般的なプレフィクス候補を使用できる。
lexical-binding
を有効にすること、まだ有効にされていない既存のEmacs
Lispコードではlexical-binding
を有効にするよう変換することを推奨する。Lisp方言の選択を参照のこと。
provide
呼出を配置すること。名前つき機能を参照のこと。
require
を使用すること。名前つき機能を参照のこと。
(eval-when-compile (require 'bar))
これはfooのバイトコンパイル直前にbarをロードするようEmacsに告げるので、そのマクロはコンパイル中は利用可能になる。eval-when-compile
の使用によりコンパイル済みバージョンのfooが中古ならbarのロードを避けられる。これはファイル内の最初のマクロ呼び出しの前に呼び出すこと。マクロとバイトコンパイルを参照のこと。
require
してこれを行うこと。しかしあなたのファイルがいくつかの独立した機能を含み、それらの1つか2つだけが余分なライブラリーを要するなら、トップレベルではなく関連する関数内部へのrequire
の配置を考慮すること。または必要時に余分のライブラリーをロードするためにautoload
ステートメントを使用すること。この方法ではあなたのファイルの該当部分を使用しない人は、余分なライブラリーをロードする必要がなくなる。
cl
ライブラリーではなく、cl-lib
ライブラリーを使うこと。cl
ライブラリーは非推奨であり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内ではそれが見えず、その挙動を変更するために不明瞭になる。これは別のパッケージ内の関数へのadviseと同様にデバッグの障害になる。
path
を使うことを避けて、かわりにfile
、file-name
、directory
を優先して使用すること。なぜならGNUコーディング規約では検索パス(ディレクトリー名のリスト)だけにpathという用語を用いることになっており、Emacsはそれを遵守するからである。