小缓冲区的处理逻辑

如果缓冲区字符数少于 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,光标随之移动到该位置。