如果缓冲区字符数少于 10,000,会执行略有不同的计算。你可能认为这没有必要,因为第一种计算方式本可完成任务。但在小缓冲区中,第一种方法可能无法将光标精确定位到目标行;第二种方法效果更好。
代码如下:
(/ (+ 10 (* size (prefix-numeric-value arg))) 10)
这段代码需要通过括号嵌套关系来理解执行逻辑。若按表达式嵌套层级缩进排版,可读性会更高:
(/
(+ 10
(*
size
(prefix-numeric-value arg)))
10)
从括号结构可以看出,最内层操作是 (prefix-numeric-value arg),它将原始前缀参数转换为数字。在下一层表达式中,该数字与缓冲区可访问部分的大小相乘:
(* size (prefix-numeric-value arg))
该乘法得到的数值可能大于缓冲区大小 — 例如参数为 7 时就会是缓冲区大小的七倍。随后给该数值加 10,最后整体除以 10,得到的结果会比缓冲区中按百分比计算的位置大一个字符。
最终得到的数值会传递给 goto-char,光标随之移动到该位置。