Next: defun Exercises, Previous: save-excursion, Up: Writing Defuns [Contents][Index]
最後のいくつかのチャプターではマクロ、多くの関数、それにスペシャルフォームを紹介してきました。ここではそれらとともに、まだ述べていない同じような関数も併せて簡単に振り返ることにします。
eval-last-sexpポイントのカレント位置の前にある式を象徴するものを評価する。引数なしで呼び出された場合には値をエコーエリアにプリントする。引数ありの場合には出力はカレントバッファーにプリントされる。このコマンドは通常ならC-x C-eにバインドされている。
defun関数を定義する。このマクロには名前、その関数に渡される引数のための雛形、ドキュメント、オプションでinteractive宣言、そして関数のbodyという5つのパーツがある。
たとえば以下はEmacsのdired-unmark-all-marksの関数定義。
(defun dired-unmark-all-marks () "Remove all marks from all files in the Dired buffer." (interactive) (dired-unmark-all-files ?\r))
interactiveその関数が対話的(interactive)に使用できることをインタープリターに宣言する。このスペシャルフォームの後には、関数の引数情報を順に渡すための、1つ以上のパーツからなる文字列が続くかもしれない。またこれらのパーツは情報を与えるためのプロンプトをインタープリターに伝えることもできる。この文字列のパーツは改行‘\n’によって区切られる。
以下はよく使用されるコード文字:
b既存のバッファーの名前。
f既存のファイルの名前。
p数値のプレフィックス引数(pは小文字であることに注意)。
rポイントとマークを小さい順の数値引数として渡す。これは単一ではなく2つの連続する引数を指定する唯一のコード文字である。
コード文字の完全なリストについてはCode Characters for ‘interactive’ in The GNU Emacs Lisp Reference Manualを参照のこと。
let変数のリストにたいして、それらがletのbody内で使用される変数であることを宣言するとともにnilまたは指定した値を初期値として与える。その後にletのbody内にある残りの式を評価して、最後の式の値をリターンする。letのbody内側では、Lispインタープリターはletの外側でバインドされた同じ名前の変数の値を認知しない。
たとえば
(let ((foo (buffer-name))
(bar (buffer-size)))
(message
"This buffer is %s and has %d characters."
foo bar))
save-excursionこのスペシャルフォームのbodyを評価する前のポイント値とカレントバッファーを記録しておいて、後でそのポイント値とバッファーをリストアする。
たとえば
(message "We are %d characters into this buffer."
(- (point)
(save-excursion
(goto-char (point-min)) (point))))
ifこの関数にたいする1つ目の引数を評価してtrueなら2つ目の引数を評価する。trueでない場合には、3つ目の引数があれば評価する。
ifは条件(conditional)と呼ばれるスペシャルフォームである。Emacs
Lispには他にも条件があるが、恐らくもっとも一般的に使用されているのはifだろう。
たとえば
(if (= 22 emacs-major-version)
(message "This is version 22 Emacs")
(message "This is not version 22 Emacs"))
<><=>=関数<は1つ目の引数が2つ目の引数より小さいかどうかをテストする。反対に>は1つ目の引数が2つ目の引数より大きいかどうかをテストする。同様に<=は1つ目の引数が2つ目の引数以下かどうか、>=は1つ目の引数が2つ目の引数以上かどうかをテストする。すべての場合において、引数はいずれも数値かマーカーでなければならない(マーカーはバッファー内での位置を示す)。
=関数=は2つの引数(数値かマーカー)が等しいかどうかをテストする。
equaleq2つのオブジェクトが同一かどうかをテストする。equalとeqにおける“同一”という単語の意味は異なる。equalは同一の本の2つのコピーのように、同じような構造および内容のオブジェクトならtrueをリターンする。一方でeqは2つの引数が実際に同一オブジェクトならtrueをリターンする。
string<string-lesspstring=string-equal関数string-lesspは1つ目の引数が2つ目の引数より小さいかどうかをテストする。同じ関数のもっと短い別名(defalias)はstring<。
string-lesspの引数は文字列かシンボルでなければならない。順序は辞書順であり大文字と小文字は区別される。シンボル自体のかわりにシンボルのプリント名が使用される。
中に何の文字も含まない空文字列‘""’は、他のどの文字列よりも小さい。
string-equalは同一性に相当するテストを提供する。より短い別名はstring=。>、>、<=に相当するテスト用の関数はない。
messageエコーエリアにメッセージをプリントする。1つ目の引数は文字列で、この文字列に後続する引数の値をプリントするために‘%s’、‘%d’、‘%c’を含めることができる。‘%s’をプリントに用いる引数は文字列かシンボル、‘%d’をプリントに用いる引数は数値でなければならない。‘%c’をプリントに用いる引数はASCIIコードナンバーでなければならない。この場合には、そのASCIIコードをもつ文字がプリントされる(それ以外にもさまざまな%シーケンスが存在するがここでは省いた)。
setqsetsetqは1つ目の引数の値に2つ目の引数の値をセットするスペシャルフォーム。1つ目の引数はsetqによって自動的にクォートされる。後続する引数ペアーも同様。他にも引数を2つだけ受け取り、両方を評価した後に2つ目の引数がリターンした値を1つ目の引数がリターンした値にセットするsetという関数がある。
buffer-name引数なしならそのバッファーの名前を文字列としてリターンする。
buffer-file-name引数なしならそのバッファーがvisitしているファイルの名前をリターンする。
current-bufferEmacsで現在アクティブなバッファーをリターンする。これはスクリーンに表示されていないバッファーかもしれない。
other-bufferもっとも最近に選択されたバッファーをリターンする(引数としてother-bufferに渡すバッファーとカレントバッファーを除く)。
switch-to-bufferEmacsにおいてアクティブとするバッファーを選択して、ユーザーが見れるようにカレントウィンドウに表示する。通常はC-x bにバインドされている。
set-bufferEmacsの注意をプログラムが実行されるバッファーに向けさせる。ウィンドウに表示されているバッファーは変更しない。
buffer-sizeカレントバッファー内の文字数をリターンする。
pointカーソルのカレント位置をバッファー先頭から数えた文字数(整数)としてリターンする。
point-minカレントバッファーで許されるポイントの最小値をリターンする。ナローイング(narrowing)が効力をもたなければ1。
point-maxカレントバッファーで許されるポイントの最大値をリターンする。ナローイング(narrowing)が効力をもたなければバッファー終端。