31.4 Ограничение видимости

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

Ограничение видимости задается двумя позициями в буфере, которые становятся началом и концом доступной части. Для большинства команд редактирования и примитивов эти позиции заменяют значения начала и конца буфера. Пока действует ограничение видимости, текст вне доступной части не отображается, и точка не может перемещаться за пределы доступной части. Обратите внимание, что ограничение видимости не изменяет фактические позиции в буфере (см. Точка); оно только определяет, какие позиции считаются доступной частью буфера. Большинство функций отказываются работать с текстом, находящимся вне доступной части.

Команды сохранения буферов не зависят от ограничения видимости; они сохраняют весь буфер независимо от любого ограничения.

Если вам нужно отобразить в одном буфере несколько очень разных типов текста, рассмотрите возможность использования альтернативного средства, описанного в Обмен текстом между двумя буферами.

Команда: narrow-to-region начало конец

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

При интерактивном вызове начало и конец устанавливаются в границы текущей области (точка и метка, сначала меньшая).

Однако, когда ограничение было установлено с помощью with-restriction с аргументом-меткой (см. ниже), narrow-to-region может использоваться только в пределах этого ограничения. Если начало или конец выходят за эти пределы, вместо них используется соответствующий предел, установленный with-restriction. Чтобы получить доступ к другим частям буфера, используйте without-restriction с той же меткой.

Команда: narrow-to-page &optional число-страниц

Эта функция устанавливает доступную часть текущего буфера так, чтобы она включала только текущую страницу. Необязательный первый аргумент число-страниц, отличный от nil, означает переход вперед или назад на число-страниц страниц и последующее ограничение одной страницей. Переменная page-delimiter определяет, где начинаются и заканчиваются страницы (см. Стандартные регулярные выражения, используемые при редактировании).

При интерактивном вызове число-страниц устанавливается в числовой префиксный аргумент.

Команда: widen

Эта команда отменяет любое ограничение видимости в текущем буфере, делая доступным всё содержимое. Это называется расширением. Она эквивалентна следующему выражению:

(narrow-to-region 1 (1+ (buffer-size)))

Однако, когда ограничение было установлено с помощью with-restriction с аргументом-меткой (см. ниже), восстанавливаются пределы, установленные with-restriction, вместо отмены ограничения. Чтобы получить доступ к другим частям буфера, используйте without-restriction с той же меткой.

Функция: buffer-narrowed-p

Эта функция возвращает не nil, если буфер ограничен, и nil в противном случае.

Специальная форма: save-restriction тело…

Эта специальная форма сохраняет текущие границы доступной части, вычисляет формы тела и, наконец, восстанавливает сохраненные границы, восстанавливая таким образом то же состояние ограничения (или его отсутствие), которое действовало ранее. Состояние ограничения восстанавливается даже в случае аварийного выхода через throw или ошибку (см. Нелокальные выходы). Поэтому эта конструкция является чистым способом временного ограничения буфера.

Эта конструкция также сохраняет и восстанавливает ограничения, установленные with-restriction с аргументом-меткой (см. ниже).

Значение, возвращаемое save-restriction, — это значение, возвращенное последней формой в теле, или nil, если формы тела не заданы.

Внимание: легко ошибиться при использовании конструкции save-restriction. Прочтите все описание здесь, прежде чем пытаться ее использовать.

Если тело изменяет текущий буфер, save-restriction все равно восстанавливает ограничения в исходном буфере (том буфере, ограничения которого она сохранила), но не восстанавливает идентичность текущего буфера.

save-restriction не восстанавливает точку; для этого используйте save-excursion. Если вы используете save-restriction и save-excursion вместе, save-excursion должна идти первой (снаружи). В противном случае старое значение точки будет восстановлено при все еще действующем временном ограничении. Если старое значение точки окажется вне пределов временного ограничения, это приведет к неточному восстановлению.

Вот простой пример правильного использования save-restriction:

---------- Буфер: foo ----------
This is the contents of foo
This is the contents of foo
This is the contents of foo∗
---------- Буфер: foo ----------

(save-excursion
  (save-restriction
    (goto-char 1)
    (forward-line 2)
    (narrow-to-region 1 (point))
    (goto-char (point-min))
    (replace-string "foo" "bar")))

---------- Буфер: foo ----------
This is the contents of bar
This is the contents of bar
This is the contents of foo∗
---------- Буфер: foo ----------
Специальная форма: with-restriction начало конец [:label метка] тело

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

(save-restriction
  (narrow-to-region начало конец)
  тело)

Когда присутствует необязательный аргумент метка, который вычисляется для получения используемой метки и должен давать значение, отличное от nil, ограничение называется меченым. Меченое ограничение отличается от немеченого несколькими способами:

  • Во время вычисления формы тела narrow-to-region и widen могут использоваться только в пределах начала и конца.
  • Чтобы снять ограничение, введенное with-restriction, и получить доступ к другим частям буфера, используйте without-restriction с тем же аргументом метка. (Другой способ получить доступ к другим частям буфера — использовать косвенный буфер (см. Косвенные буферы).)
  • Меченые ограничения могут быть вложенными.
  • Меченые ограничения могут использоваться только в Lisp-программах: они никогда не видны на экране и никогда не мешают ограничениям, установленным пользователем.

Если вы используете with-restriction с необязательным аргументом метка, мы рекомендуем документировать метку в строке документации функций, которые ее используют, чтобы другие Lisp-программы, вызываемые вашим кодом, могли снять меченое ограничение, если это необходимо.

Специальная форма: without-restriction [:label метка] тело

Эта специальная форма сохраняет текущие границы доступной части буфера, расширяет буфер, вычисляет формы тела и восстанавливает сохраненные границы. В этом случае она эквивалентна

(save-restriction
  (widen)
  тело)

Когда присутствует необязательный аргумент метка, снимается ограничение, установленное with-restriction с тем же аргументом метка.