ここでは、読者が広く使われることを意図した Emacs Lispコードを書く場合に従うべき慣習について述べます。
Emacs Lispでは基本関数ではないがLispの伝統的な基本関数の名前にさえも
この勧告は適用される。
たとえcopy-list
にさえもである。
信じるかどうかは別にして、
copy-list
のもっともらしい定義方法は複数ある。
安全であるためには、読者の接頭辞を付けて
foo-copy-list
やmylib-copy-list
のような名前にする。
読者が、twiddle-files
のような特定の名前でEmacsに
追加すべき関数を書いた場合には、読者のプログラムでは
その名前で呼ばないようにする。
読者のプログラムではmylib-twiddle-files
としておき、
Emacsに名前を追加するように提案するメイルを
‘bug-gnu-emacs@gnu.org’へ送る。
われわれがそのようにすることを決定したときには、
名前をとても簡単に変更できる。
1つの接頭辞では不十分な場合には、 意味がある限りは、 2つか3つの共通する別の接頭辞を読者のパッケージで使ってもよい。
接頭辞とシンボル名の残りの部分とはハイフン‘-’で分ける。 これはEmacs自身やほとんどのEmacs Lispプログラムと一貫性がある。
provide
の呼び出しがあるとしばしば有用である。
require
を使う。
(eval-when-compile (require 'bar))
(さらに、require
が働くように、
ライブラリbarには(provide '
bar)
があること。)
この式により、fooをバイトコンパイルするときに
barをロードすることになる。
さもないと、必要なマクロをロードせずにfooをコンパイルする危険を侵し、
正しく動作しないコンパイル済みコードを生成することになる。
see Compiling Macros。
eval-when-compile
を使うことで、
fooのコンパイル済みの版を使うときには
barをロードしない。
framep
やframe-live-p
である。
かわりに、C-cのあとにコントロール文字か数字文字か特定の句読点文字が続く キー列を定義する。 これらのキー列は、メジャーモード用に予約してある。
Emacsのすべてのモードをこの慣習に従うように変換するのは たいへんな作業量であった。 この慣習を捨てさるとその作業をむだにしてしまい、ユーザーにも不便である。
この規則の理由は、任意の文脈において <ESC>に対するプレフィックスでないバインディングがあることで、 エスケープシーケンスをその文脈におけるファンクションキーと 認識することを防げる。
Emacsの普通のコマンドを受け付ける状態、、あるいは、 より一般的には<ESC>に続けてファンクションキーや矢印キーが 意味を持つ可能性がある任意の状態では、 <ESC>に続くエスケープシーケンスの認識を妨げる <ESC> <ESC>を定義するべきではない。 そのような状態では、脱出手段として<ESC> <ESC> <ESC>を 定義する。 さもなければ脱出手段として<ESC> <ESC>を定義する。
-mode
という
名前のコマンドを用意し、自動ロード(see Autoload)するようにする。
パッケージをロードしただけでは見ためには効果がない、
つまり、その機能をオンにしないようにパッケージを設計すること。
ユーザーはコマンドを起動してその機能をオンにする。
next-line
やprevious-line
を使わないこと。
ほとんどの場合、forward-line
のほうがより便利であり、
予測可能で堅牢でもある。
see Text Lines。
特に、以下のいずれの関数も使わないこと。
beginning-of-buffer
, end-of-buffer
replace-string
, replace-regexp
対話的なユーザー向けの他の機能を必要とせずに 単にポイントを移動したり特定の文字列を置換するには、 これらの関数は1行か2行の単純なLispコードで置き換えられる。
(リストだけが許す)要素を挿入したり削除する必要がないのであれば、 ある程度のサイズがあり (先頭から末尾に向けての探索ではなく)ランダムに参照する表には ベクトルのほうが適している。
princ
ではなく関数message
を使うことである。
see The Echo Area。
error
(あるいはsignal
)を呼び出す。
関数error
は戻ってこない。
see Signaling Errors。
エラーを報告するために、
message
、throw
、sleep-for
、beep
は使わないこと。
...
の周りに空白はなく、末尾にピリオドもない。
edit-options
のようにする。
別のバッファに切り替え、戻るのはユーザーに任せる。
see Recursive Editing。
defvar
の定義を追加して、
コンパイル時の未定義な自由変数に対する警告を避けるように努めること。
ある関数で変数を束縛しその変数を別の関数で使ったり設定すると、 その変数を定義しない限りコンパイラは後者の関数について警告を出す。 しかし、しばしばこれらの変数は短い名前で、 Lispパッケージでそのような変数名を定義すべきかどうか明らかでない。 したがって、そのような変数の名前は、 読者のパッケージの他の関数や変数に使っている接頭辞で 始まる名前に改名すべきである。
indent-sexp
)で字下げすること。
;; Copyright (C) year name ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 2 of ;; the License, or (at your option) any later version. ;; This program is distributed in the hope that it will be ;; useful, but WITHOUT ANY WARRANTY; without even the implied ;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ;; PURPOSE. See the GNU General Public License for more details. ;; You should have received a copy of the GNU General Public ;; License along with this program; if not, write to the Free ;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, ;; MA 02111-1307 USA
読者がフリーソフトウェアファウンデーションに著作権を委譲する契約を 結んでいるときには、 nameとして‘Free Software Foundation, Inc.’を使う。 さもなければ読者自身の名前を使う。