Spec-Zone.ru › Elisp

Поиск оверлеев

Функция: overlays-at pos &optional sorted

Эта функция возвращает список всех оверлеев, содержащих символ в позиции pos в текущем буфере. Если sorted не-nil, возвращаемый список упорядочен по убыванию приоритета; в противном случае порядок не определён. Оверлей содержит символ в позиции 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))

Пустые оверлеи (см. пустые оверлеи) не содержат символов, поэтому эта функция их не возвращает. Если вас интересуют пустые оверлеи, используйте вместо неё overlays-in, описанную ниже.

Обратите внимание: эта функция может возвращать оверлеи за пределами текущего сужения буфера (см. Сужение), если pos находится за пределами сужения.

Функция: overlays-in beg end

Эта функция возвращает список оверлеев, пересекающихся с областью от beg до end. Оверлей пересекается с областью, если он содержит один или несколько символов между beg и end; символ в позиции end (то есть после неё) в эту область не входит.

Пустые оверлеи не содержат символов, поэтому правило их включения отличается: считается, что они пересекаются с областью, если находятся в позиции beg, строго между beg и end (не включая end) или в позиции end, когда end обозначает позицию в конце буфера. (Специальная обработка пустых оверлеев в конце буфера позволяет находить и обрабатывать такие оверлеи. Для любого другого значения end вместо этого можно увеличить позицию end.) Обратите внимание: если beg и end совпадают, пустой оверлей в позиции beg также находится в позиции end, поэтому этот случай в некотором смысле похож на пустой оверлей в конце буфера.

Порядок оверлеев в возвращаемом списке не определён.

Обратите внимание: эта функция может возвращать оверлеи за пределами текущего сужения буфера, если beg и/или end находятся за пределами сужения.

Функция: next-overlay-change pos

Эта функция возвращает позицию в буфере, в которой после pos начинается или заканчивается следующий оверлей. Если такой позиции нет, она возвращает (point-max).

Функция: previous-overlay-change pos

Эта функция возвращает позицию в буфере, в которой до pos начинается или заканчивается предыдущий оверлей. Если такой позиции нет, она возвращает (point-min).

В качестве примера приведём упрощённую (и неэффективную) версию примитивной функции next-single-char-property-change (см. Функции поиска свойств текста). Она выполняет поиск вперёд от позиции 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)))

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Finding-Overlays.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API