Loops 在循环中创建时,emacs覆盖将自动合并
我不确定这是否只是我代码中的一个简单错误。但我就是想不出问题出在哪里,所以请指出Loops 在循环中创建时,emacs覆盖将自动合并,loops,emacs,overlay,elisp,Loops,Emacs,Overlay,Elisp,我不确定这是否只是我代码中的一个简单错误。但我就是想不出问题出在哪里,所以请指出 aaaaa (progn (setq ol-list nil) (dolist (pos '(1 2 3 4)) (let ( (ol (make-overlay pos (1+ pos) (current-buffer))) ) (overlay-put ol 'display "X") (print ol) (setq ol-list
aaaaa
(progn
(setq ol-list nil)
(dolist (pos '(1 2 3 4))
(let ( (ol (make-overlay pos (1+ pos) (current-buffer))) )
(overlay-put ol 'display "X")
(print ol)
(setq ol-list
(nconc ol-list (list ol)))
);; let
) ;; dolist
)
(progn
(dolist (ol ol-list)
(delete-overlay ol))
(setq ol-list nil) )
将上述代码片段放在“lisp模式”缓冲区的开头,并对每个progn
部分求值(C-x C-e)
在我的emacs上,第一个代码段将“aaaaa”改为“Xa”。但我认为结果应该是“XXXXa”。那么问题出在哪里呢?请参阅:
对于替换显示规范,“具有属性的文本”指具有与其显示属性相同Lisp对象的所有连续字符;这些字符将作为单个单元替换
手册继续解释如何做你想做的事。您需要为每个覆盖分配不同的字符串。大概是这样的:
(overlay-put ol 'display (concat "X"))
我还提出了一些建议,使您的代码更像Lisp:
- 没有必要在它们自己的行()上加上右括号。Emacs显示匹配的括号,并自动缩进,因此只需将右括号保留在其所在位置即可
- 如果分别使用和
,您的循环看起来会更好mapcar
(需要“cl”)
(setq ol列表
(位置从1到4的循环
收集(让((ol(制作叠加位置(1+pos)))
(叠加显示(concat“X”))
(l))
(mapcar#'删除-覆盖ol列表)
好的,非常感谢您的回答和真诚的建议。我以前不知道“更换显示器”的规则。这对我帮助很大。