Spec-Zone.ru › Elisp

Управление накладками

В этом разделе описаны функции для создания, удаления и перемещения накладок, а также для проверки их содержимого. Изменения накладок не записываются в список отмены/повтора буфера, так как накладки не являются частью содержимого буфера.

Функция: overlayp объект

Эта функция возвращает t если объект является накладкой.

Функция: make-overlay начало конец &optional буфер перед-сдвиг зад-сдвиг

Эта функция создаёт и возвращает накладку, принадлежащую буферу и охватывающую область от начала до конца. И начало, и конец должны указывать на позиции в буфере; они могут быть целыми числами или метками. Если буфер опущен, накладка создаётся в текущем буфере.

Накладка, у которой начало и конец указывают на одну и ту же позицию в буфере, называется пустой. Непустая накладка может стать пустой, если текст между началом и концом будет удалён. В этом случае накладка по умолчанию не удаляется, но можно заставить её удалить, присвоив ей свойство «evaporate» (см. свойство evaporate).

Аргументы перед-сдвиг и зад-сдвиг задают тип вставки маркера для начала накладки и для конца накладки соответственно. См. Типы вставки маркеров. Если оба они nil, по умолчанию, то накладка включает в себя любой текст, вставленный в начало, но не текст, вставленный в конец. Если перед-сдвиг не nil, текст, вставленный в начало накладки, исключается из накладки. Если зад-сдвиг не nil, текст, вставленный в конец накладки, включается в накладку.

Функция: overlay-start накладка

Эта функция возвращает позицию, с которой начинается накладка, как целое число.

Функция: overlay-end накладка

Эта функция возвращает позицию, на которой заканчивается накладка, как целое число.

Функция: overlay-buffer накладка

Эта функция возвращает буфер, которому принадлежит накладка. Возвращает nil если накладка была удалена.

Функция: delete-overlay накладка

Эта функция удаляет накладку. Накладка продолжает существовать как объект Lisp, и её список свойств не изменяется, но она перестаёт быть прикреплённой к буферу, к которому она принадлежала, и перестаёт оказывать какое-либо влияние на отображение.

Удаленная накладка не отсоединяется окончательно. Её можно снова разместить в буфере, вызвав move-overlay.

Функция: move-overlay накладка начало конец &optional буфер

Эта функция перемещает накладку в буфер и устанавливает её границы в начало и конец. И начало, и конец должны указывать на позиции в буфере; они могут быть целыми числами или метками.

Если буфер опущен, накладка остаётся в том же буфере, к которому она уже была связана; если накладка была удалена, она попадает в текущий буфер.

Возвращаемым значением является накладка.

Это единственный корректный способ изменить конечные точки накладки. Не пытайтесь изменять маркеры в накладке вручную, так как это не обновляет другие важные структуры данных и может привести к потере некоторых накладок.

Функция: remove-overlays &optional начало конец имя значение

Эта функция удаляет все накладки между началом и концом, у которых свойство имя имеет значение значение. Она может перемещать конечные точки накладок в области или разделять их.

Если имя опущено или nil, это означает удаление всех накладок в указанной области. Если начало и/или конец опущены или nil, это означает начало и конец буфера соответственно. Поэтому, (remove-overlays) удаляет все накладки в текущем буфере.

Функция: copy-overlay накладка

Эта функция возвращает копию накладки. Копия имеет те же конечные точки и свойства, что и накладка. Однако тип вставки маркера для начала накладки и для конца накладки устанавливаются в их значения по умолчанию (см. Типы вставки маркеров).

Вот некоторые примеры:

;; Create an overlay.
(setq foo (make-overlay 1 10))
     ⇒ #<overlay from 1 to 10 in display.texi>
(overlay-start foo)
     ⇒ 1
(overlay-end foo)
     ⇒ 10
(overlay-buffer foo)
     ⇒ #<buffer display.texi>
;; Give it a property we can check later.
(overlay-put foo 'happy t)
     ⇒ t
;; Verify the property is present.
(overlay-get foo 'happy)
     ⇒ t
;; Move the overlay.
(move-overlay foo 5 20)
     ⇒ #<overlay from 5 to 20 in display.texi>
(overlay-start foo)
     ⇒ 5
(overlay-end foo)
     ⇒ 20
;; Delete the overlay.
(delete-overlay foo)
     ⇒ nil
;; Verify it is deleted.
foo
     ⇒ #<overlay in no buffer>
;; A deleted overlay has no position.
(overlay-start foo)
     ⇒ nil
(overlay-end foo)
     ⇒ nil
(overlay-buffer foo)
     ⇒ nil
;; Undelete the overlay.
(move-overlay foo 1 20)
     ⇒ #<overlay from 1 to 20 in display.texi>
;; Verify the results.
(overlay-start foo)
     ⇒ 1
(overlay-end foo)
     ⇒ 20
(overlay-buffer foo)
     ⇒ #<buffer display.texi>
;; Moving and deleting the overlay does not change its properties.
(overlay-get foo 'happy)
     ⇒ t

Emacs хранит накладки каждого буфера в двух списках, разделённых произвольной центральной позицией. Один список простирается назад через буфер от этой центральной позиции, а другой — вперёд от этой центральной позиции. Центральная позиция может быть где угодно в буфере.

Функция: overlay-recenter позиция

Эта функция переносит центр накладок текущего буфера вокруг позиции позиция. Это ускоряет поиск накладок для позиций, близких к позиции, но замедляет поиск для позиций, удалённых от позиции.

Цикл, который сканирует буфер вперёд, создавая накладки, может работать быстрее, если вы сделаете (overlay-recenter (point-max)) сначала.

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

Spec-Zone.ru

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