2014-05-11 21 views
2

我有大約20個疊加標記與t標記不同 - 例如'ov-one; 'ov-two; 'ov-three。我正在尋找一些幫助,請刪除整個疊加列表,而不是每個疊加有不同的mapc條目。當前的方法是如下:Emacs - 如何刪除疊加(以列表的形式)

(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)) 
+0

我不會說emacs lisp,但是什麼阻止你編寫相應的映射函數?在非常簡單的Scheme中,它可能看起來像'(define(iter fl)(if(null?l)l(begin(f(car l))(iter f(cdr l))))',你可以推測在emacs lisp中做一些類似的事情 – dfeuer

+0

也就是說,你可能想看看'do'形式,它甚至可能在emacs lisp中可用,儘管我不確定這個.emacs lisp是舊的並且相當有毛病。 – dfeuer

回答

2

一個簡單的方法來完成(我覺得)你想是添加一個額外的覆蓋性能,例如,my-overlay,給每個組疊加的。那麼你只需要測試那個屬性,因爲它們都會擁有它。不需要爲不同的屬性分別測試每個疊加層。

例如,給定的覆蓋圖將具有屬性ov-two,但它也將具有屬性my-overlay。另一個覆蓋圖將具有屬性ov-three,但它也可以具有屬性my-overlay

這是一個非常標準的方法,國際海事組織。

請注意,如果你這樣做,你不需要保留一個單獨的覆蓋列表。 (但是也不排除你這樣做。)就像創建列表是記錄集合的一種方式一樣,將屬性放在對象上也是用來記錄集合的方式,即具有該屬性的對象。

+0

謝謝 - 那就是我要採取的方法。不勝感激! – lawlist

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)))) 
+0

是否可以嵌套另一個dolist或mapcar/mapc,並有一個單獨的疊加列表 - 例如'(defvar list of-overlays'(ov-one ov-two ov-three))'?除了使用一個覆蓋列表,我希望將它們全部刪除到它們存在的範圍 – lawlist

+0

當然,請注意,您的'覆蓋列表'不是*覆蓋*列表,而是(覆蓋)*屬性列表*。 – Stefan

+0

謝謝你教我* *對象*和*屬性*之間的區別。:) – lawlist