刚才不小心又踩到一个坑,在 noninteractive 模式下执行 (line-move 1)
竟然跑偏了:
f[o]o
|
/ (line-move 1)
|
v
[b]ar
qux
代码:
(defun test-line-move--dump-buffer (current-pos)
(dotimes (i (buffer-size))
(let* ((pos (1+ i))
(msg (format "point: %2d, char: %s" pos (char-to-string (char-after pos)))))
(message (concat msg (if (= pos current-pos) " <-- (point)"))))))
(with-temp-buffer
(insert "fo0\nbar\nqux\n")
(goto-char 2)
(message ">>> Initial:")
(test-line-move--dump-buffer (point))
(line-move 1)
(message ">>> After (line-move 1):")
(test-line-move--dump-buffer (point)))
不同版本的测试结果:
Emacs 24.4 | Emacs 24.5+
----------------------------------------+------------------------------------
>>> Initial: | >>> Initial:
point: 1, char: f | point: 1, char: f
point: 2, char: o <-- (point) | point: 2, char: o <-- (point)
point: 3, char: 0 | point: 3, char: 0
point: 4, char: | point: 4, char:
|
point: 5, char: b | point: 5, char: b
point: 6, char: a | point: 6, char: a
point: 7, char: r | point: 7, char: r
point: 8, char: | point: 8, char:
|
point: 9, char: q | point: 9, char: q
point: 10, char: u | point: 10, char: u
point: 11, char: x | point: 11, char: x
point: 12, char: | point: 12, char:
|
>>> After (line-move 1): | >>> After (line-move 1):
point: 1, char: f | point: 1, char: f
point: 2, char: o | point: 2, char: o
point: 3, char: 0 | point: 3, char: 0
point: 4, char: | point: 4, char:
|
point: 5, char: b <-- (point) | point: 5, char: b
point: 6, char: a | point: 6, char: a <-- (point)
point: 7, char: r | point: 7, char: r
point: 8, char: | point: 8, char:
|
point: 9, char: q | point: 9, char: q
point: 10, char: u | point: 10, char: u
point: 11, char: x | point: 11, char: x
point: 12, char: | point: 12, char:
解决之道就是给 line-move 写个 advice 把位置纠正过来。正常模式不存在这个问题,所以 advice 只是为了保证 ert 测试顺利进行,不影响正常使用。