[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Сужение --- это возможность Emacs, с помощью которой вы можете сосредоточиться на какой-либо части буфера, и редактировать не боясь, что случайно измените другие части буфера. Сужение обычно запрещено, так как эта возможность может смутить начинающих пользователей Emacs.
Преимущества сужения 6.1 Особая форма save-restriction
6.2 what-line
Номер строки на которой находиться курсор. 6.3 Упражнения на сужение
При сужении, оставшиеся части буфера делаются невидимыми, как будто бы их и нет. Например это удобно, если вы хотите, например, заменить какое-нибудь слово только в одной части буфера; вы сужаете буфер к этой части и замена выполняется только в том разделе, а не во всем буфере. Команды поиска также работают только на видимом на экране суженном регионе, а не вне его, так что, если вы сузили документ к какой-нибудь части, то вы найдете только то что вам нужно в этой части.
Однако, сужение делает весь остальной буфер невидимым, а это может
испугать людей, которые случайно включили сужение и думают, что они
удалили часть своего файла. Более того команда undo
(откат)
(которая обычно привязана к C-x u) не выключает сужение, так что
люди могут совсем отчаяться если они не знают что они снова могут
сделать оставшийся буфер видимым с помощью команды widen
. (В
версии Emacs 18, с widen
связана клавиша C-x w; в версии
19 C-x n w).
Сужение полезно не только людям, но интерпретатору Лиспа. Часто
функции Emacs Лиспа созданы для работы только на части буфера; или
наоборот функция должна работать на всем буфере, который был
сужен. Например, функция what-line
, выключает сужение в буфере,
если оно включено и когда закончит свою работу, восстанавливает
сужение как оно было. С другой стороны, функция count-lines
,
которую вызывает what-line
, использует сужение чтобы ограничить
себя только той порцией буфера в которой она заинтересована и затем
восстанавливает прежнюю ситуацию.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
save-restriction
В Emacs Лиспе вы можете использовать особую форму
save-restriction
, чтобы запомнить состояние сужения, если оно
было включено. Когда интерпретатор Лиспа встречает
save-restriction
, он выполняет инструкции в теле выражения
save-restriction
, и затем отменяет все изменения сужения,
которые могли произойти в этом коде. Если например буфер был сужен и
код который следовал за save-restriction
избавился от сужения,
то save-restriction
снова восстанавливает сужение после
выполнения своих команд. В команде what-line
, любое сужение
буфера можно отменить с помощью команды widen
, которая следует
сразу за командой save-restriction
. Первоначальное сужение
будет восстановлено, сразу после завершения выполнения функции.
Шаблон для формы save-restriction
очень прост:
(save-restriction тело... ) |
Тело save-restriction
содержит одно или несколько выражений
которые интерпретатор Лиспа будет вычислять последовательно.
Последнее замечание: если вам надо использовать обе формы и
save-restriction
и save-excursion
одну сразу после
другой, то вначале вы должны использовать save-excursion
. Если
вы запишите наоборот, то вам может не удастся записать сужение в
буфере в который Emacs переключится после вызова
save-excursion
. То есть, если их надо использовать вместе, то
это будет выглядеть следующим образом:
(save-excursion (save-restriction тело...)) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
what-line
Команда what-line
возвращает номер строки в которой находится
курсор. Эта функция демонстрирует использование команд
save-excursion
и save-restriction
. Ниже приведен полный
текст функции:
(defun what-line () "Напечатать номер текущей строки в буфере." (interactive) (save-restriction (widen) (save-excursion (beginning-of-line) (message "Line %d" (1+ (count-lines 1 (point))))))) |
У функции есть строка документации и она интерактивна, как мы этого
ожидали. Затем следуют две строки, где используются функции
save-restriction
и widen
.
Особая форма save-restriction
запоминает сужение, если оно было
включено в текущем буфере и восстанавливает его после вычисления тела
формы save-restriction
.
За особой формой save-restriction
следует вызов widen
(расширение). Эта функция отменяет сужение в текущем буфере, если оно
было включено на момент вызова what-line
. (Если буфер был
сужен, то эти установки запомнила функция save-restriction
).
Это расширение позволяет для команд считающих строки считать от начала
буфера. В противном случае они были бы ограничены только видимой
областью буфера. Любое сужение будет восстановлено, сразу после
завершения функции, с помощью особой формы save-restriction
.
За вызовом widen
следует save-excursion
, которая
запоминает местоположение курсора (то есть точки) и метки, и
восстанавливает их после того как инструкции в теле
save-excursion
перемещают точку с помощью функции
beginning-of-line
.
(Заметим что выражение (widen)
находится между функциями
save-restriction
и save-excursion
. Когда вы пишете два
выражения save- ...
последовательно, то сначала записывайте
save-excursion
).
Последние две строки функции what-line
--- это функции
которые вычисляют номер строки в буфере и затем отображают сообщение в
эхо-области
(message "Line %d" (1+ (count-lines 1 (point))))))) |
Функция message
печатает однострочное сообщение в низу экрана
Emacs. Первым аргументом этой функции являляется строка внутри двойных
кавычек, которая печатается как есть. Однако, если она содержит
символы `%d', `%s' и `%c', то на их место вставляет
аргументы которые следуют за этой строкой. `%d' печатает аргумент
как десятичное число, поэтому сообщение в эхо-области будет следующим:
`Line 345'.
Число которое будет напечатано на месте `%d', вычисляется в последней строке функции:
(1+ (count-lines 1 (point))) |
Все что делает это код --- это считает строки от первой позиции в
буфере, отмеченной 1
, до точки (point)
, и затем
прибавляет единицу к этому числу. (Функция 1+
добавляет единицу
к своему аргументу). Мы добавляем единицу, поскольку
count-lines
считает только строки перед текущей линией.
После того как count-lines
завершит свою работу, и в эхо-области
будет напечатано сообщение, save-excursion
восстановит точку и
метку к их первоначальным значениям; а save-restriction
восстановит первоначальный вид экрана если было сужение.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Напишите функцию которая отображает первые 60 символов в текущем
буфере, даже если вы сузили буфер в его второй половине, так что
первые строки не видны. Восстановите точку, метку и сужение. Для этого
примера вам понадобятся функции save-restriction
, widen
,
goto-char
, point-min
, buffer-substring
,
message
, и некоторые другие, целый набор.
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |