emacs叠加在循环中创建时自动合并

win*_*TTr 2 emacs loops 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
            (nconc ol-list (list ol)))
      );; let
    )  ;; dolist
  ) 


(progn 
  (dolist (ol ol-list)
    (delete-overlay ol))
  (setq ol-list nil) ) 
Run Code Online (Sandbox Code Playgroud)

将上面的代码片段放在"lisp-mode"缓冲区的开头,并将eval(Cx Ce)放在每个progn部分.

在我的emacs上,第一个代码部分将"aaaaa"变为"Xa".但我认为结果应该是"XXXXa".那问题出在哪里?

Gar*_*ees 5

请参阅Emacs Lisp手册,第38.15.1节:

为了替换显示规范,"具有该属性的文本"表示具有与其显示属性相同的Lisp对象的所有连续字符; 这些字符将替换为单个单元.

手册继续解释如何做你想做的事.您需要为每个叠加分配不同的字符串.像这样的东西:

(overlay-put ol 'display (concat "X"))
Run Code Online (Sandbox Code Playgroud)

我也有一些建议让你的代码更像Lisp:

  • 没有必要在自己的行上放置右括号(参见这个答案).Emacs显示匹配的括号,并进行自动缩进,因此只需将右括号保留在它们所在的位置即可.

  • 如果您分别使用loop设施,您的循环将看起来更好mapcar.

(require 'cl)

(setq ol-list
  (loop for pos from 1 upto 4
        collect (let ((ol (make-overlay pos (1+ pos))))
                  (overlay-put ol 'display (concat "X"))
                  ol)))

(mapcar #'delete-overlay ol-list)
Run Code Online (Sandbox Code Playgroud)