[Prev] [Index] [Next] [上端へ移動] [下端へ移動].
更新日時:2008年05月10日
本章では、xyzzyで使われている数個の関数を詳しく調べよう。つまり「ウォークスルー」をしてみよう。 これらの関数はLispコードの例題として取り上げたが、仮想的な例題ではない。xyzzyで実際に使っているコードである。 これらの定義から多くのことを学べるはずである。ここで説明する関数は、すべて、バッファに関連するものである。 それ以外の関数についてはのちほど説明する。
コマンドbeginning-of-buffer
には十分慣れていて理解しやすいであろうから、この関数から始めよう。
対話的関数として使うと、beginning-of-buffer
は、バッファの先頭にカーソルを移動し、
それまでカーソルがあった位置にマークを設定する。一般にはM-<にバインドしてある。
コードを調べるまえに、関数定義には何が含まれるかを考えてみよう。
M-x beginning-of-buffer
やM-<のようなキー列で関数を呼べるように、関数を対話的にする式を含んでいる必要がある。
バッファのもとの位置にマークを設定するコードが必要である。バッファの先頭にカーソルを移動するコードも必要である。
では、関数のコード全体を示そう。
(defun beginning-of-buffer () "バッファの先頭にカーソルを移動し、 それまでカーソルがあった位置にマークを設定する" (interactive) (set-mark-command) (goto-char (point-min)))
すべての関数定義と同様に、この定義でもスペシャルフォームdefunに続けて5つの部分がある。
beginning-of-buffer
である。interactive式は、関数が対話的に使われることをxyzzyに伝える。beginning-of-buffer
は引数を必要としないので、interactiveに引数はない。
関数の本体はつぎの2行である。
(set-mark-command) (goto-char (point-min))
最初の式は(set-mark-command)
である。 Lispインタープリタがこの式を評価すると、カーソルがどこにあってもその現在位置にマークを設定する。
つぎの行は(goto-char (point-min))
である。この式はバッファで取りえるポイントの最小位置にカーソルを移動する。つまりカーソルの先頭、あるいはナロイングしている場合には、バッファの参照可能な範囲の先頭に移動する。
式(goto-char (point-min))
でカーソルをバッファの先頭に移動するまえに、コマンドset-mark-commandでカーソルの位置にマークを設定する。そのため、必要ならば、C-x C-xとタイプすればもとの位置に戻れる。
以上が関数定義のすべてである。
end-of-bufferの関数定義は、beginning-of-bufferと同じように書けるが、関数の本体には(goto-char (point-min))
のかわりに (goto-char (point-max))
を使う。
簡略版simple-mark-whole-buffer
を理解するのはbeginning-of-buffer
を理解するのと同じくらい容易である。
関数beginning-of-buffer
ほどは多用されないが、関数mark-whole-buffer
も有用である。簡略版mark-whole-buffer
は、
バッファの先頭にポイントを、バッファの最後にマークを置いてバッファ全体をリージョンとする。
関数のコードは次のとおりである。
(defun simple-mark-whole-buffer () "バッファ全体をリージョンにする" (interactive) (goto-char (point-max)) (set-mark-command) (goto-char (point-min)))
ほかのすべての関数定義と同様に、関数simple-mark-whole-buffer
は関数定義の雛型にあてはまる。雛型はつぎのとおりである。
(defun 関数名 (引数リスト) "説明文..." (interactive-expression...) 本体...)
この関数はつぎのように動作する。関数名はsimple-mark-whole-bufferである。空の引数リスト`()'がこれに続き、 関数には引数を必要としないことを意味する。さらに説明文が続く。
つぎの行の式(interactive)は、関数が対話的に使われることをxyzzyに指示する。これらの詳細は、前節で述べた関数beginning-of-bufferと同様である。
関数simple-mark-whole-buffer
の本体は、つぎの3行である。
(goto-char (point-max)) (set-mark-command) (goto-char (point-min))
最初の行は、式(goto-char (point-max))
である。
この式はバッファで取りえるポイントの最大値にカーソルを移動させる。これはバッファの最後である。 (バッファをナロイングしている場合には、バッファの参照可能な部分の最後である。
次の行は(set-mark-command)
である。これはカーソルのある位置にマークを設定する。
前の行(goto-char (point-max))
によってカーソルがバッファの最後に移動しているため、その位置にマークが設定される
関数の最後の行は(goto-char (point-min))
である。この式ではカーソルをバッファの最小ポイント
つまり、バッファの先頭(あるいは、バッファの参照可能な部分の先頭)に移動する。この結果、
バッファの先頭にカーソルがあり、バッファの最後にマークが設定される。したがって、
バッファ全体がリージョンとなる。
[Prev] [Index] [Next] [上端へ移動] [下端へ移動]
このページはMeadow/Emacs memo(http://www.bookshelf.jp/)の
Emacs Lisp プログラミングを改変したものです。
リンクはどのページでも自由にして下さい。
メールはkyupon@gmail.comまで送って下さい。