Emacs - 如何删除叠加层(以列表的形式)

时间:2014-05-11 05:56:48

标签: emacs elisp

我有大约20个与t标记不同的叠加层 - 例如'ov-one; 'ov-two; 'ov-three。我正在寻求一些帮助,请删除整个叠加列表,而不是为每个叠加层添加不同的mapc条目。目前的方法如下:

(defun delete-the-overlays ()

  (mapc #'(lambda (o) (when (overlay-get o 'ov-one)
    (delete-overlay o))) (overlays-in (window-start) (window-end)))

  (mapc #'(lambda (o) (when (overlay-get o 'ov-two)
    (delete-overlay o))) (overlays-in (window-start) (window-end)))

  (mapc #'(lambda (o) (when (overlay-get o 'ov-three)
    (delete-overlay o))) (overlays-in (window-start) (window-end))) )

通过它获得变量列表和mapcar / dolist会更清楚,但我没有找到任何示例。

(defvar list-of-overlays '(ov-one ov-two ov-three))

2 个答案:

答案 0 :(得分:2)

完成所需内容的一种简单方法是为每组叠加层添加额外的叠加属性,例如my-overlay。然后你只需要测试那个属性,因为它们都有它。无需针对不同的属性单独测试每个叠加层。

例如,给定的叠加层将具有属性ov-two,但它也具有属性my-overlay。另一个叠加层会比较属性ov-three,但它也会有属性my-overlay

这是一种非常标准的方法,IMO。

请注意,如果您这样做,则不需要另外保留叠加层的单独列表。 (但是没有什么能阻止你这样做。)就像创建列表是记录集合的一种方法一样,将对象的属性设置为记录集合的方式:即具有该属性的对象。

答案 1 :(得分:1)

如何'回合

(defun delete-the-overlays ()
  (dolist (o (overlays-in (window-start) (window-end)))
    (when (or (overlay-get o 'ov-one)
              (overlay-get o 'ov-two)
              (overlay-get o 'ov-three))
      (delete-overlay o))))