Вы можете сделать символы невидимыми, чтобы они не отображались на экране, с помощью свойства invisible. Это может быть свойство текста (см. Свойства текста) или свойство наложения (см. Наложения). Перемещение курсора также частично игнорирует эти символы; если цикл команд обнаруживает, что точка находится внутри диапазона невидимого текста после команды, он перемещает точку на другую сторону текста.
В самом простом случае любое свойство invisible, отличное от nil, делает символ невидимым. Это вариант по умолчанию — если вы не измените значение buffer-invisibility-spec по умолчанию, так работает свойство invisible. Обычно вы должны использовать t в качестве значения свойства invisible, если вы не планируете устанавливать buffer-invisibility-spec самостоятельно.
Более обобщенно вы можете использовать переменную buffer-invisibility-spec для управления тем, какие значения свойства invisible делают текст невидимым. Это позволяет вам заранее классифицировать текст на различные подмножества, присваивая им разные значения invisible, а затем делать различные подмножества видимыми или невидимыми, изменяя значение 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 и удаления элементов из него специально предусмотрены две функции.
Эта функция добавляет элемент element в buffer-invisibility-spec. Если buffer-invisibility-spec был t, он изменяется на список (t), чтобы текст, чье свойство invisible равно t, оставался невидимым.
Эта функция удаляет элемент 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)
Вы можете проверить невидимость с помощью следующей функции:
Если 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 пропускают текст, не обрабатывая его свойства. См. Спецификации отображения, заменяющие текст.