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

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

В самом простом случае любое свойство invisible, отличное от nil, делает символ невидимым. Это вариант по умолчанию — если вы не измените значение 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:

;; Если вы хотите отобразить эллипсис:
(add-to-invisibility-spec '(my-symbol . t))
;; Если вы не хотите эллипсиса:
(add-to-invisibility-spec 'my-symbol)

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

;; Когда не нужно невидимости:
(remove-from-invisibility-spec '(my-symbol . t))
;; Или соответственно:
(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. Значение свойства должно быть функцией, которая будет вызвана с наложением в качестве аргумента. Эта функция должна сделать наложение видимым навсегда; она используется, когда совпадение перекрывает наложение при выходе из поиска.

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

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