请删除带有变量值的after-string
叠加层的正确方法是什么?
使用C-u C-x =
时,它只会显示为after-string
,而不说明该值是什么。
例如,一旦我使用(overlay-put (make-overlay (point) (point)) 'after-string my-concatenated-string)
放置叠加层,我希望能够删除它而无需编程Emacs来记住之前在缓冲区中使用的每个my-concatenated-string
- 可能每一行都有几个不同的?
使用是否足够?:(remove-overlays (window-start) (window-end)) 'after-string)
或者,使用它是否更好?:(remove-overlays (window-start) (window-end)) 'after-string t)
或者,还有另一种方法可以解决所有问题吗?
编辑(2014年3月17日):我的困惑显然来自对象和属性之间的误解。
通常,覆盖属性的创建方式如下:
(overlay-put (make-overlay (point) (point)) 'my-property 'property-number-one )
通常,覆盖对象的创建方式如下:
(overlay-put (make-overlay (point) (+ (point) 1))
'face '(:background "gray50" :foreground "black"))
这是一种独特的情况,'after-string
闻起来像对象。我的假设是:如果它闻起来像对象,那么在尝试删除它时可能需要包含值以便我不会留下 >已断开连接 'after-string
:
(save-excursion
(end-of-line)
(let ((eol-floating-column (+ (current-column) 10)))
(overlay-put (make-overlay (point) (point))
'after-string
(concat
(propertize (char-to-string ?\uE001)
'display
`((space :align-to ,eol-floating-column)
(space :width 0)))
(propertize (char-to-string ?\u00B6)
'face '(:background "gray50" :foreground "black")
'cursor t) ))))
答案 0 :(得分:2)
编写代码的方式,如果省略最后一个参数,只有当值为“nil”时才会删除叠加(在您的情况下看起来似乎不是这样)。
由于您不知道该属性的值,我认为您不能使用该功能。但是,您可以简单地编写类似的内容(假设after-string
的值永远不会为零):
(dolist (o (overlays-in (window-start) (window-end)))
(when (overlay-get o 'after-string)
(delete-overlay o))
另请注意,如果从命令后挂钩执行此操作,window-end
可能无法反映真实值。为了安全起见,您可以执行(window-end nil t)
,但这可能会慢一些。
答案 1 :(得分:1)
当您放置叠加层时,请添加其他属性(例如(overlay-put ol 'lawlist t)
),之后您可以使用(remove-overlays BEG END 'lawlist t)
删除这些叠加层。
答案 2 :(得分:0)
(defun lawlist-remove-overlays (beg end name val)
"Remove the overlays."
;; DEBUGGING
;; (unless (and beg end name val)
;; (message "ERROR -- beg: %s | end: %s | name: %s | val: %s" beg end name val))
(let* (
(point-max (point-max))
(point-min (point-min))
(narrowed-p (not (equal (- point-max point-min) (buffer-size))))
(beg (if beg beg point-min))
(end
(cond
((and
(not narrowed-p)
end)
end)
((and
(not narrowed-p)
(null end))
point-max)
((and
narrowed-p
end
(< end point-max))
end)
((and
narrowed-p
end
(= end point-max))
(1+ end))
((and
narrowed-p
(null end))
(1+ point-max)) )))
(when (and beg end name val)
(overlay-recenter end)
(dolist (o (overlays-in beg end))
(when (eq (overlay-get o name) val)
(delete-overlay o))))))
(dolist (description `(
,fci-pre-limit-string
,fci-pre-limit-active-region-string
,fci-at-limit-string
,fci-post-limit-string
,fci-wrapped-limit-string
,fci-cursor-at-eol-string
,fci-tab-text-left
,fci-tab-text-right
,fci-tab-sandwiched))
(lawlist-remove-overlays nil nil 'after-string description))
另请参阅此相关主题,该主题处理包含文本属性值的目标叠加层: