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

10. Вставка текста обратно

Когда вы вырезаете текст из буфера с помощью команды `kill', то вы можете вернуть его обратно с помощью команды `yank'. Текст, который вырезается из буфера помещается в список уничтожений (kill ring) и различные команды могут вставить соответствующее содержимое из списка уничтожений обратно в буфер (Не обязательно в тот же буфер).

Просто команда C-y (yank) вставляет в текущий буфер первый элемент из списка уничтожений. Если за командой C-y сразу следует M-y, то первый элемент замещается вторым элементом. Последующие команды M-y замещают второй элемент третьим, четвертым, пятым и так далее. Когда достигается последний элемент, то он замещается первым элементом и цикл повторяется. (Поэтому список уничтожений полностью называется кольцевым списком уничтожений (`kill ring'), но мы сокращаем его название. Однако на самом деле текст хранится в списке. See section B. Обработка списка удалений, для получения дополнительной информации о том, каким образом список может выглядеть как кольцо).

10.1 Обзор списка уничтожений  
10.2 Переменная kill-ring-yank-pointer  
10.3 Упражнения с yank и nthcdr  


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

10.1 Обзор списка уничтожений

Список уничтожений --- это список текстовых строк. Он может выглядеть следующим образом:

 
("некоторый текст" "другой кусок текста" "еще немного текста")

Если бы это было содержимым моего текущего списка уничтожений, и я бы нажал C-y, то в буфер на место курсора вставилась бы строка символов `некоторый текст'.

Команду yank можно также использовать для повторения текста не копируя его. Скопированный текст не вырезается из буфера, но его копия помещается в список уничтожений и впоследствии ее можно будет вернуть назад.

Для возвращения текста из списка уничтожений используются всего три функции --- yank, которая обычно связана с сочетанием клавиш C-y; yank-pop, которая обычно связана с M-y; и rotate-yank-pointer, которая используется двумя другими функциями.

Эти функции соотносятся со списком уничтожений через переменную kill-ring-yank-pointer. В самом деле вставка текста для обоих из них --- и для yank и для yank-pop реализуется следующим образом:

 
(insert (car kill-ring-yank-pointer))

Чтобы начать понимать как работают функции yank и yank-pop, вначале необходимо взглянуть на переменную kill-ring-yank-pointer и функцию rotate-yank-pointer.


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

10.2 Переменная kill-ring-yank-pointer

kill-ring-yank-pointer --- это переменная, точно такая же, как и kill-ring. Она указывает на что-то, с чем связано какое-нибудь значение, как и любая переменная Лисп.

Так, если бы значением списка уничтожений было бы:

 
("некоторый текст" "другой кусок текста" "еще немного текста")

и kill-ring-yank-pointer указывал бы на второй элемент, то его значением было бы:

 
("другой кусок текста" "еще немного текста")

Как объяснялось в предыдущей главе (see section 9. Как реализованы списки), компьютер на самом деле не хранит две одинаковые копии текста на который указывают kill-ring и kill-ring-yank-pointer. Слова "другой кусок текста" и "еще немного текста" не повторяются. Вместо этого две переменные Лиспа указывают на один и тот же текст. Ниже приведена поясняющая диаграмма:

 
kill-ring     kill-ring-yank-pointer
    |               |
    |      ___ ___  |     ___ ___      ___ ___ 
     ---> |   |   |  --> |   |   |    |   |   |
          |___|___|----> |___|___|--> |___|___|--> nil
            |              |            |      
            |              |            |
            |              |             --> "еще немного текста"
            |              |
            |               --> "другой кусок текста
            |
             --> "некоторый текст"

Обе переменные --- kill-ring и kill-ring-yank-pointer являются указателями. Но список уничтожений обычно описывают как будто он фактически является тем, на что он указывает. Говорят, что kill-ring --- это список, а не указатель на список. И наоборот говорят, что kill-ring-yank-pointer --- это указатель на список.

Эти два способа говорить об одном и том же, могут вначале выглядеть довольно путано, но все же имеют определенный смысл. Список уничтожений вообще рассматривается как завершенная структура данных, которая содержит информацию недавно вырезанную из буферов Emacs. С другой стороны kill-ring-yank-pointer служит для обозначения --- `указывает на' ту часть списка уничтожений, где находится первый элемент (the CAR), который будет вставлен первым.

Функция rotate-yank-pointer изменяет значение kill-ring-yank-pointer таким образом, чтобы он указывал на другой элемент списка уничтожений; если kill-ring-yank-pointer указывает на последний элемент списка уничтожений, то следующее обращение к функции rotate-yank-pointer сделает полный оборот, kill-ring-yank-pointer снова будет указывать на первый элемент списка уничтожений. Таким образом список ведет себя как кольцо. Сама функция rotate-yank-pointer не очень сложна, но все же содержит множество деталей. Она, и намного более простые функции yank и yank-pop, описаны в приложении. See section B. Обработка списка удалений.


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

10.3 Упражнения с yank и nthcdr


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

This document was generated on March, 10 2004 using texi2html