4.3.1 mark-whole-buffer 函数体

mark-whole-buffer 函数的主体由三行代码组成:

(push-mark (point))
(push-mark (point-max) nil t)
(goto-char (point-min))

这些行中的第一行是表达式 (push-mark (point))

这行与 simplified-beginning-of-buffer 函数体的第一行 (push-mark) 完全相同。在这两种情况下,Lisp解释器在光标的当前位置设置一个标记。

我不知道为什么 mark-whole-buffer 中的表达式写为 (push-mark (point)),而在 beginning-of-buffer 中的表达式写为 (push-mark)。也许编写代码的人不知道 push-mark 的参数是可选的,如果 push-mark 没有传递参数,该函数默认会在点的位置自动设置标记。或者也许该表达式是为了与下一行的结构相呼应而写的。无论如何,这行使Emacs确定点的位置并在那里设置一个标记。

在GNU Emacs的早期版本中,mark-whole-buffer 的下一行是 (push-mark (point-max))。此表达式在缓冲区中具有最大编号的地方设置一个标记。这将是缓冲区的末尾(或者,如果缓冲区被缩小,缓冲区的可访问部分的末尾。有关缩小的更多信息,请参见 See Narrowing and Widening.)设置了此标记后,前一个标记(在点处设置的标记)不再设置,但Emacs记住了其位置,就像始终记住所有其他最近的标记一样。这意味着您可以通过键入 C-u C-SPC 两次返回到该位置,如果您愿意的话。

在GNU Emacs 22中,(point-max) 稍微复杂一些。该行读取

(push-mark (point-max) nil t)

该表达式几乎与之前相同。它在缓冲区中具有最大编号的位置设置一个标记。然而,在此版本中,push-mark 有两个额外的参数。push-mark 的第二个参数是 nil。这告诉函数在推送标记时应显示一个消息,该消息说“标记已设置”。第三个参数是 t。这告诉 push-mark 在启用瞬时标记模式时激活标记。瞬时标记模式突出显示当前活动的区域。通常情况下会关闭它。

最后,函数的最后一行是 (goto-char (point-min)))。这与 beginning-of-buffer 中写得一样。该表达式将光标移动到缓冲区的最小点,即缓冲区的开头(或者可访问部分的开头)。因此,点被放置在缓冲区的开头,标记被设置在缓冲区的末尾。整个缓冲区因此成为了一个区域。