[Prev] [Index] [Next] [上端へ移動] [下端へ移動].

4.バッファ関連の関数

更新日時:2008年05月10日

本章では、xyzzyで使われている数個の関数を詳しく調べよう。つまり「ウォークスルー」をしてみよう。 これらの関数はLispコードの例題として取り上げたが、仮想的な例題ではない。xyzzyで実際に使っているコードである。 これらの定義から多くのことを学べるはずである。ここで説明する関数は、すべて、バッファに関連するものである。 それ以外の関数についてはのちほど説明する。

4.1 beginning-of-bufferの定義

コマンドbeginning-of-bufferには十分慣れていて理解しやすいであろうから、この関数から始めよう。 対話的関数として使うと、beginning-of-bufferは、バッファの先頭にカーソルを移動し、 それまでカーソルがあった位置にマークを設定する。一般にはM-<にバインドしてある。

コードを調べるまえに、関数定義には何が含まれるかを考えてみよう。 M-x beginning-of-bufferM-<のようなキー列で関数を呼べるように、関数を対話的にする式を含んでいる必要がある。 バッファのもとの位置にマークを設定するコードが必要である。バッファの先頭にカーソルを移動するコードも必要である。

では、関数のコード全体を示そう。

(defun beginning-of-buffer ()
"バッファの先頭にカーソルを移動し、
それまでカーソルがあった位置にマークを設定する"
  (interactive)
  (set-mark-command)
  (goto-char (point-min)))

すべての関数定義と同様に、この定義でもスペシャルフォームdefunに続けて5つの部分がある。

  1. 名前。ここでは、beginning-of-bufferである。
  2. 引数のリスト。ここでは、空リスト()である。
  3. 説明文の文字列。
  4. 対話的にするための式。
  5. 本体。

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))を使う。

4.2簡略版mark-whole-bufferの定義

簡略版simple-mark-whole-bufferを理解するのはbeginning-of-bufferを理解するのと同じくらい容易である。

関数beginning-of-bufferほどは多用されないが、関数mark-whole-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と同様である。

4.2.1 simple-mark-whole-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まで送って下さい