Spec-Zone.ru › Elisp

Ограничение области

Ограничение области означает ограничение текста, доступного для команд редактирования 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 могли снять помеченное ограничение области при необходимости.

Специальная форма: 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API