Сужение
Сужение означает ограничение текста, на который распространяются команды редактирования Emacs, до ограниченного диапазона символов в буфере. Текст, который остается доступным, называется доступной частью буфера.
Сужение задаётся двумя позициями в буфере, которые становятся началом и концом доступной части. Для большинства команд и примитивов редактирования эти позиции заменяют значения начала и конца буфера. Пока сужение активно, текст за пределами доступной части не отображается, а точка не может перемещаться за пределы доступной части. Обратите внимание, что сужение не изменяет фактические позиции в буфере (см. Точку); оно только определяет, какие позиции считаются доступной частью буфера. Большинство функций отказываются от работы с текстом, находящимся за пределами доступной части.
Команды сохранения буферов не затрагиваются сужением; они сохраняют весь буфер независимо от любого сужения.
Если вам нужно отобразить в одном буфере несколько очень разных типов текста, рассмотрите использование альтернативного механизма, описанного в Замене текста.
- Команда: narrow-to-region start end
-
Эта функция устанавливает доступную часть текущего буфера, начиная с start и заканчивая end. Оба аргумента должны быть позициями символов.
В интерактивном вызове start и end устанавливаются в границы текущей области (точка и метка, с наименьшей вначале).
- Команда: narrow-to-page &optional move-count
-
Эта функция устанавливает доступную часть текущего буфера, чтобы она включала только текущую страницу. Необязательный первый аргумент move-count non-
nilозначает перемещение вперёд или назад на move-count страниц, а затем сужение до одной страницы. Переменнаяpage-delimiterопределяет, где начинаются и заканчиваются страницы (см. Стандартные регулярные выражения).В интерактивном вызове move-count устанавливается в числовой префиксный аргумент.
- Команда: widen
-
Эта функция отменяет любое сужение в текущем буфере, так что весь контент становится доступным. Это называется расширением. Оно эквивалентно следующему выражению:
(narrow-to-region 1 (1+ (buffer-size)))
- Функция: buffer-narrowed-p
Эта функция возвращает не-
nilесли буфер сужен, иnilв противном случае.
- Специальная форма: save-restriction body…
-
Эта специальная форма сохраняет текущие границы доступной части, вычисляет формы body и, наконец, восстанавливает сохранённые границы, тем самым восстанавливая то же состояние сужения (или его отсутствие), которое было ранее в действии. Состояние сужения восстанавливается даже в случае ненормального выхода через
throwили ошибки (см. Нелокальные выходы). Поэтому эта конструкция является чистым способом временного сужения буфера.Значение, возвращаемое
save-restriction, это значение, возвращаемое последней формой в body, илиnilесли форм body не было.Внимание: легко допустить ошибку при использовании конструкции
save-restriction. Прочитайте всё описание здесь перед тем, как попробовать.Если body изменяет текущий буфер,
save-restrictionвсё равно восстанавливает ограничения исходного буфера (буфера, ограничения которого были сохранены), но не восстанавливает идентичность текущего буфера.save-restrictionне восстанавливает точку; используйтеsave-excursionдля этого. Если вы используете одновременноsave-restrictionиsave-excursion,save-excursionдолжно стоять первым (снаружи). В противном случае старое значение точки будет восстановлено с временным сужением, всё ещё действующим. Если старое значение точки было за пределами границ временного сужения, это приведёт к некорректному восстановлению.Вот простой пример правильного использования
save-restriction:---------- Buffer: foo ---------- This is the contents of foo This is the contents of foo This is the contents of foo∗ ---------- Buffer: foo ----------
(save-excursion (save-restriction (goto-char 1) (forward-line 2) (narrow-to-region 1 (point)) (goto-char (point-min)) (replace-string "foo" "bar"))) ---------- Buffer: foo ---------- This is the contents of bar This is the contents of bar This is the contents of foo∗ ---------- Buffer: foo ----------
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/Narrowing.html