[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6. Сужение и расширение

Сужение --- это возможность 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] [ ? ]

6.1 Особая форма 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] [ ? ]

6.2 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] [ ? ]

6.3 Упражнения на сужение

Напишите функцию которая отображает первые 60 символов в текущем буфере, даже если вы сузили буфер в его второй половине, так что первые строки не видны. Восстановите точку, метку и сужение. Для этого примера вам понадобятся функции save-restriction, widen, goto-char, point-min, buffer-substring, message, и некоторые другие, целый набор.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on March, 10 2004 using texi2html