Наложение emacs автоматически объединяется при создании в цикле - PullRequest
2 голосов
/ 12 июля 2011

Я не уверен, является ли это простой ошибкой моего кода.Но я просто не могу понять, в чем проблема, поэтому, пожалуйста, укажите на это.

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-mode" и eval (Cx Ce) каждый progn section.

В моем emacs, первая секция кода сделает из "aaaaa" значение "Xa".Но я думаю, что результат должен быть "XXXXa".Так в чем же проблема?

1 Ответ

5 голосов
/ 12 июля 2011

См. Руководство Emacs Lisp, раздел 38.15.1 :

Для замены спецификаций отображения «текст, обладающий свойством» означает все последовательные символы, которые имеют тот же объект Лиспа, что и их свойство отображения; эти символы заменяются как единое целое.

В руководстве объясняется, как делать то, что вы хотите. Вам нужно выделить разные строки для каждого наложения. Примерно так:

(overlay-put ol 'display (concat "X"))

У меня также есть пара предложений, чтобы сделать ваш код более похожим на Лисп:

  • Нет необходимости ставить закрывающие скобки в отдельной строке ( см. Этот ответ ). 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)
...