Next: Key Binding Conventions, Up: Tips [Contents][Index]
以下は幅広いユーザーを意図したEmacs Lispコードを記述する際にしたがうべき慣習です:
この慣習はカスタム定義を含むすべてのファイルに必須である。そのようなファイルを慣習にしたがうために修正するのが非互換の変更を要するなら、構うことはないから非互換の修正を行うこと。先送りにしてはならない。
ユーザーの使用を意図したコマンド名では、何らかの単語がそのパッケージ名のプレフィクスの前にあると便利なことがある。たとえばわたしちの慣習ではオブジェクトをリストするコマンドの名前なら‘list-something’、すなわち‘frob’と呼ばれるパッケージのグローバルシンボルが‘frob-’で始まれば‘list-frobs’というコマンドをもつかもしれない。さらに関数や変数等を定義する構文が‘defun’や‘defvar’で始まればより良く機能するので、名前内でそれらの後に名前プレフィクスを置くこと。
この勧告は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
を有効にするよう変換することを推奨する。Using Lexical Bindingを参照のこと。
provide
呼出を配置すること。Named Featuresを参照のこと。
require
を使用すること。Named Featuresを参照のこと。
(eval-when-compile (require 'bar))
これはfooのバイトコンパイル直前にbarをロードするようEmacsに告げるので、そのマクロはコンパイル中は利用可能になる。eval-when-compile
の使用によりコンパイル済みバージョンのfooが中古ならbarのロードを避けられる。これはファイル内の最初のマクロ呼び出しの前に呼び出すこと。Compiling Macrosを参照のこと。
require
してこれを行うこと。しかしあなたのファイルがいくつかの独立した機能を含み、それらの1つか2つだけが余分なライブラリーを要するなら、トップレベルではなく関連する関数内部へのrequire
の配置を考慮すること。または必要時に余分のライブラリーをロードするためにautoload
ステートメントを使用すること。この方法ではあなたのファイルの該当部分を使用しない人は、余分なライブラリーをロードする必要がなくなる。
cl
ライブラリーではなく、cl-lib
ライブラリーを使うこと。後者のcl
ライブラリーはクリーンなネームスペースを使用しない(定義がプレフィックス‘cl-’で始まらない)。実行時にcl
をロードするパッケージは、そのパッケージを使用しないユーザーに名前衝突を引き起こさせるかもしれない。
(eval-when-compile (require
'cl))
でコンパイル時にcl
を使用するのは問題ない。コンパイラーはバイトコードを生成する前にマクロを展開するのでcl
内のマクロを使用するには十分である。ただしこの場合においても現代的なcl-lib
を使用するほうが良い。
framep
やframe-live-p
。変数が述語関数でないなら、この-p
サフィックスの使用を避けるよう推奨する。かわりに-flag
サフィックスやis-foo
のような名前を使用すること。
feature-unload-function
という関数を定義すること。ここでfeatureはパッケージが提供する機能の名前であり、そのような変更をアンドゥするためのフックにする。そのファイルのアンロードにunload-feature
を使用することにより、この関数が実行されるようになる。Unloadingを参照のこと。
(defalias 'gnus-point-at-bol (if (fboundp 'point-at-bol) 'point-at-bol 'line-beginning-position))
eval-after-load
とwith-eval-after-load
の使用を避けること(Hooks for Loadingを参照)。この機能は個人的なカスタマイズを意図している。Lispプログラム内でこれを使用すると別のLisp内ではそれが見えず、その挙動を変更するために不明瞭になる。これは別のパッケージ内の関数へのadviseと同様にデバッグの障害になる。