Ограничение области
Ограничение области означает ограничение текста, доступного для команд редактирования Emacs, заданным диапазоном символов в буфере. Оставшийся доступным текст называется доступной частью буфера.
Ограничение области задаётся двумя позициями в буфере, которые становятся началом и концом доступной части. Для большинства команд и примитивов редактирования эти позиции заменяют значения начала и конца буфера. Пока действует ограничение области, текст за пределами доступной части не отображается, а точка не может перемещаться за её пределы. Обратите внимание, что ограничение области не изменяет фактические позиции в буфере (см. Точка); оно лишь определяет, какие позиции считаются доступной частью буфера. Большинство функций отказываются работать с текстом за пределами доступной части.
Ограничение области не влияет на команды сохранения буферов: они сохраняют весь буфер независимо от любых ограничений области.
Если вам нужно отображать в одном буфере несколько существенно различающихся типов текста, рассмотрите альтернативный способ, описанный в разделе Перемещение текста между двумя буферами.
- Команда: narrow-to-region start end
-
Эта функция задаёт доступную часть текущего буфера так, чтобы она начиналась в позиции start и заканчивалась в позиции end. Оба аргумента должны быть позициями символов.
При интерактивном вызове start и end задаются границами текущей области (точкой и меткой, причём сначала указывается меньшая позиция).
Однако, если ограничение области было установлено с помощью
with-restrictionс аргументом-меткой (см. ниже),narrow-to-regionможно использовать только в пределах этого ограничения. Если start или end выходят за эти границы, вместо них используется соответствующая граница, заданная посредствомwith-restriction. Чтобы получить доступ к другим частям буфера, используйтеwithout-restrictionс той же меткой.
- Команда: narrow-to-page &optional move-count
-
Эта функция задаёт доступную часть текущего буфера так, чтобы она включала только текущую страницу. Необязательный первый аргумент move-count, не равный
nil, означает, что нужно перейти на move-count страниц вперёд или назад, а затем ограничить область одной страницей. Переменнаяpage-delimiterзадаёт, где начинаются и заканчиваются страницы (см. Стандартные регулярные выражения, используемые при редактировании).При интерактивном вызове move-count задаётся числовым аргументом-префиксом.
- Команда: widen
-
Эта функция отменяет любое ограничение области в текущем буфере, делая доступным всё его содержимое. Это называется расширением области. Эквивалентное выражение:
(narrow-to-region 1 (1+ (buffer-size)))
Однако, если ограничение области было установлено с помощью
with-restrictionс аргументом-меткой (см. ниже), восстанавливаются границы, заданные посредствомwith-restriction, а ограничение области не отменяется. Чтобы получить доступ к другим частям буфера, используйтеwithout-restrictionс той же меткой.
- Функция: buffer-narrowed-p
Эта функция возвращает значение, отличное от
nil, если область буфера ограничена, иnilв противном случае.
- Специальная форма: save-restriction body…
-
Эта специальная форма сохраняет текущие границы доступной части, вычисляет формы body и затем восстанавливает сохранённые границы, возвращая тем самым прежнее состояние ограничения области (или его отсутствие). Состояние ограничения области восстанавливается даже при аварийном выходе через
throwили ошибке (см. Нелокальные выходы). Поэтому эта конструкция позволяет безопасно временно ограничить область буфера.Эта конструкция также сохраняет и восстанавливает ограничения области, установленные посредством
with-restrictionс аргументом-меткой (см. ниже).Значение, возвращаемое
save-restriction, совпадает со значением последней формы в body или равноnil, если формы тела не указаны.Внимание: при использовании конструкции
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 ----------
- Специальная форма: with-restriction start end [:label label] body
-
Эта специальная форма сохраняет текущие границы доступной части буфера, задаёт доступную часть, начинающуюся в позиции start и заканчивающуюся в позиции end, вычисляет формы body и восстанавливает сохранённые границы. В этом случае она эквивалентна выражению
(save-restriction (narrow-to-region start end) body)
Если присутствует необязательный аргумент label, который вычисляется для получения метки и должен возвращать значение, отличное от
nil, ограничение области считается помеченным. Помеченное ограничение области отличается от обычного несколькими особенностями:- Во время вычисления формы body использовать
narrow-to-regionиwidenможно только в пределах позиций start и end. - Чтобы снять ограничение, введённое посредством
with-restriction, и получить доступ к другим частям буфера, используйтеwithout-restrictionс тем же аргументом label. (Другой способ получить доступ к другим частям буфера — использовать косвенный буфер (см. Косвенные буферы).) - Помеченные ограничения области можно вкладывать друг в друга.
- Помеченные ограничения области можно использовать только в программах на Lisp: они не отображаются на экране и никогда не мешают ограничениям области, установленным пользователем.
Если вы используете
with-restrictionс необязательным аргументом label, рекомендуем описать эту метку в строках документации функций, которые её используют, чтобы другие вызываемые вашим кодом программы на Lisp могли снять помеченное ограничение области при необходимости. - Во время вычисления формы body использовать
- Специальная форма: without-restriction [:label label] body
-
Эта специальная форма сохраняет текущие границы доступной части буфера, расширяет область буфера, вычисляет формы body и восстанавливает сохранённые границы. В этом случае она эквивалентна выражению
(save-restriction (widen) body)
Если присутствует необязательный аргумент label, снимается ограничение области, установленное посредством
with-restrictionс тем же аргументом label.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Narrowing.html