42.9.3 搜索覆盖层

Function: overlays-at pos &optional sorted

该函数返回当前缓冲区中覆盖位置 pos 处字符的所有覆盖层列表。如果 sortednil, 列表按优先级降序排列,否则顺序无特定规则。一个覆盖层包含位置 pos,当且仅当其起始位置小于等于 pos,且结束位置大于 pos

为说明用法,以下是一个 Lisp 函数,它返回为点所在字符指定属性 prop 的覆盖层列表:

(defun find-overlays-specifying (prop)
  (let ((overlays (overlays-at (point)))
        found)
    (while overlays
      (let ((overlay (car overlays)))
        (if (overlay-get overlay prop)
            (setq found (cons overlay found))))
      (setq overlays (cdr overlays)))
    found))
Function: overlays-in beg end

该函数返回与区域 begend 存在重叠的覆盖层列表。一个覆盖层与区域重叠,是指其包含 区域内的一个或多个字符;空覆盖层(see empty overlay)在位于 beg、 严格介于 begend 之间,或位于 end(当 end 表示缓冲区可访问部分末尾位置时) 的情况下视为重叠。

Function: next-overlay-change pos

该函数返回 pos 之后下一个覆盖层起始或结束的缓冲区位置。若无此类位置,则返回 (point-max)

Function: previous-overlay-change pos

该函数返回 pos 之前上一个覆盖层起始或结束的缓冲区位置。若无此类位置,则返回 (point-min)

举个例子,以下是原语函数 next-single-char-property-change(see 文本属性搜索函数) 的简化(且低效)版本。它从位置 pos 向前搜索,查找给定属性 prop(取自覆盖层或文本属性) 值发生变化的下一个位置。

(defun next-single-char-property-change (position prop)
  (save-excursion
    (goto-char position)
    (let ((propval (get-char-property (point) prop)))
      (while (and (not (eobp))
                  (eq (get-char-property (point) prop) propval))
        (goto-char (min (next-overlay-change (point))
                        (next-single-property-change (point) prop)))))
    (point)))