以下の慣習にしたがうことによりあなたのプログラムが実行時によりEmacsに適合するようになります。
next-line
やprevious-line
を使用してはならない。ほとんど常にforward-line
のほうがより簡便であり、より予測可能かつ堅牢である。テキスト行単位の移動を参照のこと。
特に以下の関数は使用しないこと:
beginning-of-buffer
、end-of-buffer
replace-string
、replace-regexp
insert-file
、insert-buffer
インタラクティブなユーザーを意図した別の機能がないのにポイントの移動、特定の文字列の置換、またはファイルやバッファーのコンテンツを挿入したいだけなら単純な1、2行のLispコードでそれらの関数を置き換えられる。
要素の挿入や削除がなく(これはリストだけで可能)、ある程度のサイズがあって、(先頭か末尾から検索しない)ランダムアクセスがあるテーブルではベクターが有利。
princ
ではなくmessage
関数。エコーエリアを参照のこと。
error
(またはsignal
)を呼び出すこと。関数error
はリターンしない。エラーをシグナルする方法を参照のこと。
エラーの報告にmessage
、throw
、sleep-for
、beep
を使用しないこと。
たとえdebug-on-error
がnil
であっても、ユーザーにエラーの発生元を伝えることが有用な場合もある。そのような場合には、エラーメッセージに小文字のLispシンボルを前置できる。たとえばエラーメッセージ“Invalid
input”を“some-function: Invalid input”となるように拡張できる。
yes-or-no-p
かy-or-n-p
で答えを求める質問を行う場合には大文字で始めて‘?’で終わること。
Enter the answer (default 42):
interactive
で引数リストを生成するLisp式を使用する場合には、リージョンやポジションの引数にたいして正しいデフォルト値を生成しようと試みではならない。それらの引数が指定されていなければかわりにnil
を提供して、引数がnil
のときに関数のbodyでデフォルト値を計算すること。たとえば以下のように記述する:
(defun foo (pos) (interactive (list (if specified specified-pos))) (unless pos (setq pos default-pos)) ...)
以下のようにはしない:
(defun foo (pos) (interactive (list (if specified specified-pos default-pos))) ...)
これはそのコマンドを繰り返す場合に、そのときの状況にもとづいてデフォルト値が再計算されるからである。
interactiveの‘d’、‘m’、‘r’指定を使用する際にはコマンドを繰り返すときの引数値の再計算にたいして特別な段取りを行うので、このような注意事項を採用する必要はない。