Spec-Zone.ru › Elisp

Невидимый текст

Вы можете сделать символы невидимыми, чтобы они не отображались на экране, с помощью свойства invisible. Это может быть свойство текста (см. Свойства текста) или свойство наложения (см. Наложения). Перемещение курсора также частично игнорирует эти символы; если после выполнения команды цикл команд обнаруживает, что точка находится внутри диапазона невидимого текста, он перемещает точку на другую сторону текста.

В простейшем случае любой символ со свойством nil invisible становится невидимым. Это поведение по умолчанию — если вы не измените значение buffer-invisibility-spec по умолчанию, свойство invisible будет работать именно так. Обычно следует использовать t в качестве значения свойства invisible, если вы не собираетесь самостоятельно задавать buffer-invisibility-spec.

В более общем случае можно использовать переменную buffer-invisibility-spec, чтобы управлять тем, какие значения свойства invisible делают текст невидимым. Это позволяет заранее разделить текст на разные подмножества, присвоив им различные значения invisible, а затем делать различные подмножества видимыми или невидимыми, изменяя значение buffer-invisibility-spec.

Управление видимостью с помощью buffer-invisibility-spec особенно полезно в программе для отображения списка записей базы данных. Это позволяет реализовать удобные команды фильтрации, показывающие только часть записей базы данных. Установка этой переменной выполняется очень быстро — гораздо быстрее, чем просмотр всего текста в буфере в поисках свойств, которые нужно изменить.

Переменная: buffer-invisibility-spec

Эта переменная указывает, какие типы свойств invisible фактически делают символ невидимым. При установке этой переменной она становится локальной для буфера.

t

Символ невидим, если его свойство invisible не равно nil. Это значение по умолчанию.

список

Каждый элемент списка задаёт критерий невидимости; если свойство invisible символа соответствует любому из этих критериев, символ невидим. В списке могут быть элементы двух типов:

atom

Символ невидим, если значение его свойства invisible равно atom или если это список, содержащий atom; сравнение выполняется с помощью eq.

(atom . t)

Символ невидим, если значение его свойства invisible равно atom или если это список, содержащий atom; сравнение выполняется с помощью eq. Кроме того, последовательность таких символов отображается как многоточие.

Предусмотрены две функции для добавления элементов в buffer-invisibility-spec и удаления элементов из него.

Функция: add-to-invisibility-spec element

Эта функция добавляет элемент element в buffer-invisibility-spec. Если buffer-invisibility-spec имело значение t, оно преобразуется в список (t), чтобы текст, свойство invisible которого равно t, оставался невидимым.

Функция: remove-from-invisibility-spec element

Эта функция удаляет элемент element из buffer-invisibility-spec. Если element отсутствует в списке, функция ничего не делает.

Согласно принятому соглашению об использовании buffer-invisibility-spec, основной режим должен использовать собственное имя режима в качестве элемента buffer-invisibility-spec и значения свойства invisible:

;; If you want to display an ellipsis:
(add-to-invisibility-spec '(my-symbol . t))
;; If you don’t want ellipsis:
(add-to-invisibility-spec 'my-symbol)

(overlay-put (make-overlay beginning end)
             'invisible 'my-symbol)

;; When done with the invisibility:
(remove-from-invisibility-spec '(my-symbol . t))
;; Or respectively:
(remove-from-invisibility-spec 'my-symbol)

Проверить невидимость можно с помощью следующей функции:

Функция: invisible-p pos-or-prop

Если pos-or-prop — маркер или число, эта функция возвращает значение, не равное nil, если текст в этой позиции в данный момент невидим.

Если pos-or-prop — объект Lisp любого другого типа, он считается возможным значением свойства текста или наложения invisible. В этом случае функция возвращает значение, не равное nil, если это значение сделало бы текст невидимым, исходя из текущего значения buffer-invisibility-spec.

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

Как правило, функции, работающие с текстом или перемещающие точку, не учитывают, является ли текст невидимым: они обрабатывают невидимые и видимые символы одинаково. Пользовательские команды перемещения по строкам, такие как next-line, previous-line, игнорируют невидимые символы новой строки, если line-move-ignore-invisible не равно nil (значение по умолчанию), то есть ведут себя так, как будто этих невидимых символов новой строки нет в буфере, но только потому, что для этого они запрограммированы особым образом.

Если команда завершается, когда точка находится внутри невидимого текста или на его границе, основной цикл редактирования перемещает точку к одному из двух концов невидимого текста. Emacs выбирает направление перемещения так, чтобы оно совпадало с общим направлением перемещения, заданным командой; если выбор неоднозначен, предпочтение отдаётся позиции, в которой вставленный символ не унаследует свойство invisible. Кроме того, если текст не заменяется многоточием и команда лишь перемещала точку внутри невидимого текста, точка перемещается ещё на один символ, чтобы попытаться отразить движение команды видимым перемещением курсора.

Таким образом, если команда переместила точку назад в невидимый диапазон (с обычным поведением приоритета свойств), Emacs возвращает точку к началу этого диапазона. Если команда переместила точку вперёд внутрь невидимого диапазона, Emacs перемещает точку вперёд к первому видимому символу после невидимого текста, а затем ещё на один символ вперёд.

Эти корректировки точки, оказавшейся внутри невидимого текста, можно отключить, присвоив disable-point-adjustment значение, не равное nil. См. раздел Корректировка точки после выполнения команд.

При инкрементальном поиске невидимые наложения могут временно и/или постоянно становиться видимыми, если совпадение включает невидимый текст. Чтобы включить это поведение, наложение должно иметь свойство isearch-open-invisible, значение которого не равно nil. Значением свойства должна быть функция, вызываемая с наложением в качестве аргумента. Эта функция должна сделать наложение видимым на постоянной основе; она вызывается, если при завершении поиска совпадение перекрывает наложение.

Во время поиска такие наложения временно становятся видимыми благодаря временному изменению их свойств invisible и intangible. Если вы хотите изменить это поведение для определённого наложения, задайте ему свойство isearch-open-invisible-temporary, значением которого будет функция. Функция вызывается с двумя аргументами: первый — наложение, а второй — nil, чтобы сделать наложение видимым, или t, чтобы снова сделать его невидимым.

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

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/Invisible-Text.html

Spec-Zone.ru

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