これらの規約に従うことで、プログラム実行時に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式を用いて引数のリストを生成する場合、region や
position 引数に正しいデフォルト値を指定しようとしないでください。代わりに、それらの引数が指定されていない場合は nil とし、引数が nil
であるときに関数本体でデフォルト値を計算するようにしてください。例えば、次のように記述します。
(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)))
...)
これは、コマンドを再実行した際に、現在の状況に基づいてこれらのデフォルト値を再計算するためです。
インタラクティブな仕様 ‘d’、‘m’、‘r’ を使用する場合、コマンドの繰り返し時に引数の値を再計算するための特別な仕組みが備わっているため、このような対策を講じる必要はありません。