Невидимый текст
Вы можете сделать символы невидимыми, чтобы они не отображались на экране, с помощью свойства 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