42.7 Выборочный вывод

Выборочный вывод относится к паре связанных функций для сокрытия определенных строк на экране.

Первый вариант, явный выборочный вывод, был разработан для использования в программе Lisp: он контролирует, какие строки скрыты путем изменения текста. Этот вид сокрытия теперь устарел и считается нежелательным; вместо этого следует использовать свойство invisible (см. Невидимый текст), чтобы получить тот же эффект.

Во втором варианте выбор строк для сокрытия осуществляется автоматически на основе отступов. Этот вариант предназначен для использования на уровне пользователя.

Способ управления явным выборочным выводом заключается в замене символа новой строки (control-j) символом возврата каретки (control-m). Текст, который ранее был строкой после этой новой строки, теперь скрыт. Строго говоря, он временно перестает быть строкой, поскольку только новые строки могут разделять строки; теперь он является частью предыдущей строки.

Выборочный вывод не влияет напрямую на команды редактирования. Например, C-f (forward-char) без колебаний перемещает курсор в скрытый текст. Однако замена символов новой строки на символы возврата каретки влияет на некоторые команды редактирования. Например, next-line пропускает скрытые строки, поскольку ищет только новые строки. Режимы, использующие выборочный вывод, также могут определять команды, учитывающие новые строки, или контролировать, какие части текста скрыты.

Когда вы записываете буфер с выборочным выводом в файл, все символы control-m выводятся как новые строки. Это означает, что при следующем чтении файла он выглядит нормально, без скрытого текста. Эффект выборочного вывода виден только внутри Emacs.

Переменная: selective-display

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

  • Если значение selective-display равно t, то символ control-m отмечает начало скрытого текста; control-m и остальная часть строки после него не отображаются. Это явный выборочный вывод.
  • Если значение selective-display является положительным целым числом, то строки, начинающиеся с более чем этого количества столбцов отступа, не отображаются.

Когда часть буфера скрыта, команды вертикального перемещения работают так, как если бы эта часть не существовала, что позволяет одной команде next-line пропустить любое количество скрытых строк. Однако команды перемещения символов (например, forward-char) не пропускают скрытую часть, и возможно (хотя и сложно) вставить или удалить текст в скрытой части.

В приведенных ниже примерах мы показываем внешний вид отображения буфера foo, который меняется в зависимости от значения selective-display. Содержимое буфера не меняется.

(setq selective-display nil)
     ⇒ nil

---------- Buffer: foo ----------
1 on this column
 2on this column
  3n this column
  3n this column
 2on this column
1 on this column
---------- Buffer: foo ----------

(setq selective-display 2)
     ⇒ 2

---------- Buffer: foo ----------
1 on this column
 2on this column
 2on this column
1 on this column
---------- Buffer: foo ----------
Пользовательский вариант: selective-display-ellipses

Если эта буферная переменная не равна nil, то Emacs отображает «…» в конце строки, за которой следует скрытый текст. Этот пример является продолжением предыдущего.

(setq selective-display-ellipses t)
     ⇒ t

---------- Buffer: foo ----------
1 on this column
 2on this column ...
 2on this column
1 on this column
---------- Buffer: foo ----------

Вы можете использовать таблицу отображения для замены другого текста для многоточия («…»). См. Таблицы отображения.