[ < ] | [ > ] | [ << ] | [ 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-pointer
10.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] | [ ? ] |