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
中写得一样。该表达式将光标移动到缓冲区的最小点,即缓冲区的开头(或者可访问部分的开头)。因此,点被放置在缓冲区的开头,标记被设置在缓冲区的末尾。整个缓冲区因此成为了一个区域。