我正在寻找一些帮助,请调试第二个例子-它应该只有一(1)个字符宽,但最终是两(2)个字符宽。
WORKING示例:下面的代码创建了一个只有一(1)个字符宽的覆盖,这是正确的:
(let ((my-column (current-column)))
(overlay-put
(make-overlay
(save-excursion (beginning-of-line) (+ (point) my-column))
(+ 1 (save-excursion (beginning-of-line) (+ (point) my-column)) ) )
'face '(background-color . "pink")))
破碎示例:下面的代码创建了一个两(2)个字符宽的覆盖,这是不正确的:
(let ((my-column (current-column)))
(save-excursion
(goto-char (point-min))
(while (re-search-forward "n" nil t)
(overlay-put
(make-overlay
(save-excursion (beginning-of-line) (+ (point) my-column))
(+ 1 (save-excursion (beginning-of-line) (+ (point) my-column)) ) )
'face '(background-color . "pink"))) ))
EDIT - FIXED EXAMPLE:根据@Lindydancer在下面的回答中的有益指导,这里是修改后的例子,现在可以工作了——也许它可以简化,但至少我现在理解了这个概念:
(let* (
(my-column (current-column))
my-line-beginning
my-line-ending
my-line-length)
(save-excursion
(goto-char (point-min))
(while (re-search-forward "n" nil t)
(setq my-line-beginning (point))
(end-of-line)
(setq my-line-ending (point))
(setq my-line-length (- my-line-ending my-line-beginning))
(when (< my-column my-line-length)
(overlay-put
(make-overlay
(save-excursion (beginning-of-line) (+ (point) my-column))
(+ 1 (save-excursion (beginning-of-line) (+ (point) my-column)) ) )
'face '(background-color . "pink"))) )))
我认为问题是你添加了覆盖到所有的行。如果一行比my-column
短,覆盖将溢出下面的行,给人的印象是一些覆盖是两个字符宽,而实际上是两个一个字符的重叠放在一起。
尝试限制代码只在至少my-overlay
长的行上放置覆盖