5.3.3 完整的beginning-of-buffer

下面是beginning-of-buffer函数的完整文本:


(defun beginning-of-buffer (&optional arg)
  "将点移到缓冲区的开头;在先前位置留下标记。
使用 \\[universal-argument] 前缀时,不在先前位置设置标记。
使用数值参数 N 时,将点设置为从开头开始的 N/10 处。

如果缩小了缓冲区,
此命令使用缓冲区的可访问部分的开头和大小。

不要在Lisp程序中使用这个命令!
\(goto-char (point-min))更快
且不会破坏标记。"
  (interactive "P")
  (or (consp arg)
      (and transient-mark-mode mark-active)
      (push-mark))
  (let ((size (- (point-max) (point-min))))
    (goto-char (if (and arg (not (consp arg)))
                   (+ (point-min)
                      (if (> size 10000)
                          ;; 避免大缓冲区大小的溢出!
                          (* (prefix-numeric-value arg)
                             (/ size 10))
                        (/ (+ 10 (* size (prefix-numeric-value arg)))
                           10)))
                 (point-min))))
  (if (and arg (not (consp arg))) (forward-line 1)))

除了文档字符串中的一个细节和函数的最后一行之外,前面的讨论展示了这个函数的工作原理。

在文档字符串中,有一个表达式的引用:

\\[universal-argument]

在这个表达式的第一个方括号之前使用了‘\\’。这个‘\\’告诉Lisp解释器替换当前绑定到‘[…]’的键。在universal-argument的情况下,通常是C-u,但也可能不同。有关更多信息,See (GNU Emacs Lisp参考手册)文档字符串提示.

最后,beginning-of-buffer命令的最后一行指示,如果带有参数调用命令:

(if (and arg (not (consp arg))) (forward-line 1))

如果使用C-u指定命令,但没有数字,也就是说,原始前缀参数只是一个cons单元,该命令将光标放在第二行的开头。