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