GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/eintr/simplified_002dbeginning_002dof_002dbuffer.html ・ emacs-doc.conao3.com

4.2 簡略化された beginning-of-buffer の定義

beginning-of-buffer コマンドは、馴染み深く理解もしやすいため、入門に適した機能です。インタラクティブコマンドとして使用すると、beginning-of-buffer はカーソルをバッファの先頭に移動させ、マークを直前の位置に残します。通常、これは M-< にバインドされています。

本節では、この関数が最も頻繁に使用される場面を示す短縮版について解説します。この短縮版の関数はそのままでも動作しますが、複雑なオプション用のコードは含まれていません。別の節では、関数全体について説明します。(beginning-of-bufferの完全な定義を参照してください。)

コードを確認する前に、関数定義に何を含めるべきかを考えてみましょう。M-x beginning-of-buffer と入力したり、M-< のようなキーコードを入力したりして呼び出せるよう、関数をインタラクティブにする式を含める必要があります。また、バッファの元の位置にマークを残すコードと、カーソルをバッファの先頭に移動させるコードも含める必要があります。

関数の短縮版の全文は以下の通りです。

(defun simplified-beginning-of-buffer ()
  "Move point to the beginning of the buffer;
leave mark at previous position."
  (interactive)
  (push-mark)
  (goto-char (point-min)))

すべての関数定義と同様に、この定義もマクロ defun に続いて5つの部分で構成されています。

  1. 名前:この例では simplified-beginning-of-buffer。
  2. 引数のリスト:この例では、空のリスト ()、
  3. ドキュメント文字列。
  4. インタラクティブな表現。
  5. 体。

この関数定義では、引数リストが空になっています。これは、この関数が引数を必要としないことを意味します。(関数全体の定義を見ると、オプション引数が渡される可能性があることがわかります。)

インタラクティブな式は、その関数が対話的に使用されることを意図していることをEmacsに伝えます。この例では、simplified-beginning-of-bufferが引数を必要としないため、interactiveに引数はありません。

関数本体は、次の2行で構成されます:

(push-mark)
(goto-char (point-min))

これらの行の1行目は、(push-mark) という式です。この式がLispインタプリタによって評価されると、カーソルの現在位置(それがどこであっても)にマークが置かれます。このマークの位置は、マークリングに保存されます。

次の行は (goto-char (point-min)) です。この式は、カーソルをバッファ内の最小点、すなわちバッファの先頭(バッファが狭められている場合は、アクセス可能な部分の先頭)に移動させます(狭めと広げを参照)。

push-mark コマンドは、(goto-char (point-min)) 式によってカーソルがバッファの先頭に移動される前の位置にマークを設定します。そのため、必要に応じて C-x C-x と入力することで、元の位置に戻ることができます。

関数定義は以上です!

このようなコードを読んでいて、goto-char のような見慣れない関数に出会ったときは、describe-function コマンドを使うことでその機能を確認できます。このコマンドを使用するには、C-h f と入力し、次に関数名を入力して RET を押します。describe-function コマンドを実行すると、その関数のドキュメント文字列が *Help* ウィンドウに表示されます。例えば、goto-char のドキュメントは以下の通りです:

Set point to POSITION, a number or marker.
Beginning of buffer is position (point-min), end is (point-max).

この関数の引数は1つで、指定したい位置です。

(describe-function のプロンプトでは、カーソルの直下または直前にある記号が表示されます。そのため、関数の真上か直後にカーソルを合わせてから C-h f RET と入力すれば、入力の手間を省けます。)

end-of-buffer の関数定義は、関数本体に (goto-char (point-min)) の代わりに式 (goto-char (point-max)) が含まれている点を除けば、beginning-of-buffer の定義と同様に記述されます。