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 равно атому или если это список, содержащий атом в качестве члена; сравнение выполняется с использованием eq.

(atom . t)

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

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

Функция: add-to-invisibility-spec элемент

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

Функция: remove-from-invisibility-spec элемент

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

Конвенция для использования 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. См. Настройка точки.

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

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

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

Spec-Zone.ru

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