emacs overlay automatically merged when created in a loop
I am not sure whether this is just a simple mistake of my code. But I just cannot figure out what's the problem开发者_StackOverflow is, so please point it out.
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) )
Put the above code snippet at the beginning your "lisp-mode" buffer, and eval (C-x C-e) each progn
section.
On my emacs, the first code section will make the "aaaaa" to "Xa". But I think the result should be "XXXXa". So where is the problem?
See the Emacs Lisp manual, section 38.15.1:
For replacing display specifications, “the text that has the property” means all the consecutive characters that have the same Lisp object as their display property; these characters are replaced as a single unit.
The manual goes on to explain how to do what you want. You need to allocate a different string for each overlay. Something like this:
(overlay-put ol 'display (concat "X"))
I also have a couple of suggestions to make your code more Lisp-like:
There's no need to put closing parentheses on their own line (see this answer). Emacs shows you matching parentheses, and does automatic indentation, so just leave the closing parentheses where they fall.
Your loops will look nicer if you use the
loop
facility andmapcar
respectively.
(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)
精彩评论