Emacs - 使用变量值删除覆盖`after-string`

时间:2014-05-17 05:32:52

标签: emacs elisp

请删除带有变量值的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) ))))

3 个答案:

答案 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))

另请参阅此相关主题,该主题处理包含文本属性值的目标叠加层:

https://emacs.stackexchange.com/a/9847/2287