4.2 一个简化的 beginning-of-buffer 定义

beginning-of-buffer 命令是一个很好的起点函数,因为你可能熟悉它,并且它易于理解。作为交互式命令使用时,beginning-of-buffer 将光标移动到缓冲区的开头,同时在先前的位置留下标记。通常绑定到 M-<

在这一节中,我们将讨论该函数的一个简化版本,展示它最常用的形式。这个简化的函数按原样工作,但不包含复杂选项的代码。在另一节中,我们将描述整个函数。(See beginning-of-buffer 的完整定义.)

在查看代码之前,让我们考虑函数定义必须包含的内容:必须包括一个使函数可交互的表达式,以便通过键入 M-x beginning-of-buffer 或键入键序(如 M-<)来调用它;必须包括代码以在缓冲区中原始位置留下一个标记;必须包括将光标移动到缓冲区开头的代码。

以下是该函数简化版本的完整文本:

(defun simplified-beginning-of-buffer ()
  "将光标移动到缓冲区开头;在先前位置留下标记。"
  (interactive)
  (push-mark)
  (goto-char (point-min)))

与所有函数定义一样,此定义在宏 defun 之后有五个部分:

  1. 名称:在这个例子中是 simplified-beginning-of-buffer
  2. 参数列表:在这个例子中是一个空列表,()
  3. 文档字符串。
  4. 交互表达式。
  5. 主体。

在此函数定义中,参数列表为空,这意味着此函数不需要任何参数。 (当我们查看完整函数定义时,我们将看到它可以传递一个可选参数。)

交互式表达式告诉Emacs该函数旨在以交互方式使用。在这个例子中,interactive 没有参数,因为 simplified-beginning-of-buffer 不需要参数。

函数的主体包括两行:

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

这些行中的第一行是表达式 (push-mark)。当Lisp解释器评估此表达式时,它在光标当前位置设置一个标记,无论光标在哪里。该标记的位置保存在标记环中。

接下来的一行是 (goto-char (point-min))。此表达式将光标跳到缓冲区的最小点,即缓冲区的开头(如果缩小了,则是缓冲区的可访问部分的开头。See 缩小和扩大.)

push-mark 命令在光标被 (goto-char (point-min)) 表达式移动到缓冲区开头之前的位置设置一个标记。因此,如果愿意,可以通过键入 C-x C-x 返回到最初的位置。

这就是整个函数定义的全部内容!

当阅读这样的代码并遇到不熟悉的函数时,比如 goto-char,可以使用 describe-function 命令了解它的作用。要使用此命令,输入 C-h f,然后输入函数的名称并按 RETdescribe-function 命令将在 *Help* 窗口中打印函数的文档字符串。例如,goto-char 的文档如下:

将点设置为 POSITION,一个数字或标记。
缓冲区的开头是位置 (point-min),结束是 (point-max)。

函数的一个参数是所需的位置。

(对于 describe-function 的提示将提供光标下或之前的符号,因此您可以通过将光标直接定位到函数上方或之后,然后键入 C-h f RET 以节省输入。)

end-of-buffer 函数定义与 beginning-of-buffer 定义的方式相同,只是函数的主体包含 (goto-char (point-max)) 表达式,而不是 (goto-char (point-min))