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单元,该命令将光标放在第二行的开头。