Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 在循环中创建时,emacs覆盖将自动合并_Loops_Emacs_Overlay_Elisp - Fatal编程技术网

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列表)

好的,非常感谢您的回答和真诚的建议。我以前不知道“更换显示器”的规则。这对我帮助很大。