Programming in Emacs Lisp笔记(十)Yanking Text Back

本文详细介绍了Emacs编辑器中的'yank'命令使用方法,包括如何利用该命令恢复被剪切的文本,以及如何通过'yank'、'yank-pop'等命令在killring中切换和重复使用被剪切的文本片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Yanking Text Back

当使用'kill'命令剪切文本时,可以用'yank'命令恢复它。被剪切的文本被放到kill ring,yank命令可以将文本恢复。

C-y(yank)命令插入kill ring中的第一个元素到缓冲区。如果C-y命令后立即跟一个M-y,则插入的文本将被替换为kill ring的第二个元素。连续的按M-y,将使用kill ring中更靠后的文本替换前一次操作插入的文本。当到达最后一个元素时,又将从第一个元素开始。(这也是kill ring被称作ring而不是list的原因)然而实际上保存了文本的数据结构是list。

Kill Ring Overview

kill ring是被删除字符串的列表。例如:

("some text" "a different piece of text" "yet more text")
按C-y字符串some text将插入当前缓冲区的光标位置。

yank命令也可以用于复制文本。复制文本而不从缓冲区剪切文本,文本被复制一份放到kill ring中。

有三个函数可以将文本从kill ring上恢复:yank,通常被绑定在C-y上;yank-pop,通常绑定在M-y;rotate-yank-pointer它使用了另外两个函数。

这些函数通过变量kill-ring-yank-pointer指向kill ring。实际上yank和yank-pop插入文本的代码都是:

(insert (car kill-ring-yank-pointer))
为了弄清楚yank和yank-pop是如何工作的,先需要了解kill-ring-yank-pointer变量和rotate-yank-pointer函数。

变量kill-ring-yank-pointer

kill-ring-yank-pointer是与kill-ring类似的变量。

如果kill ring的内容如下:

("some text" "a different piece of text" "yet more text")
kill-ring-yank-pointer将指向list第二个部分开始的list,kill-ring-yank-pointer是:
("a different piece of text" "yet more text")
前面关于List实现的章节曾说过:计算机并不会为kill-ring和kill-ring-yank-pointer分别保存拷贝。两个Lisp变量指向同一片文本,下面是图示:
kill-ring     kill-ring-yank-pointer
| |
| ___ ___ | ___ ___ ___ ___
---> | | | --> | | | | | |
|___|___|----> |___|___|--> |___|___|--> nil
| | |
| | |
| | --> "yet more text"
| |
| --> "a different piece of text
|
--> "some text"

变量kill-ring和kill-ring-yank-pointer都是指针。kill-ring常被称作列表而不是说指向列表,而kill-ring-yank-pointer被称为指向列表。

rotate-yank-pointer函数修改kill-ring-yank-pointer指向的元素;当指针指向元素的第二个元素为kill ring的结束位置时,它将自动指向kill ring的第一个元素。这也展示了如何将一个list转变为ring。rotate-yank-pointer函数虽然看起来不复杂,但它实际包含了很多 细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值