| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Когда вы вырезаете текст из буфера с помощью команды `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-pointer10.3 Упражнения с yankиnthcdr
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Список уничтожений --- это список текстовых строк. Он может выглядеть следующим образом:
("некоторый текст" "другой кусок текста" "еще немного текста")
|
Если бы это было содержимым моего текущего списка уничтожений, и я бы нажал 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] | [ ? ] |
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] | [ ? ] |
yank и nthcdr
describe-variable), посмотрите что
сейчас находится в вашем списке уничтожений. Удалите что-нибудь из
буфера `*scratch*'; и снова посмотрите на список уничтожений. С
помощью M-y (yank-pop), пройдите по всему кольцу
уничтожений. Сколько элементов в нем? Найдите значение
kill-ring-max. Заполнено ли ваше кольцо уничтожений, или вы
можете добавить туда еще несколько элементов?
nthcdr и car, напишите несколько выражений для
извлечения первого, второго, третьего и четвертого элементов списка.
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |