如何防止Emacs“污染”剪贴板?

15

Emacs总是将被删除/剪切的内容复制到剪贴板中。我经常需要将内容复制并粘贴到Emacs中,但当我在粘贴之前从Emacs中删除现有内容时,我想要粘贴的内容会丢失。

我找到的唯一解决方案是使用

(setq save-interprogram-paste-before-kill t)

为了确保在Emacs外部复制的内容仍然可以在kill-ring中使用,而且有类似问题的人似乎对这个解决方案感到满意。不过让我困扰的是,我必须先键入 C-y然后再重复一次或多次按下 M-y 才能到达我想要粘贴的内容。
所以我的问题是:如何停止Emacs在我删除/剪切内容时将其复制到剪贴板(不包括使用 C-w 删除区域的情况)?

1
在过去的2到3周内,有两个线程处理类似的问题,但OSX处理它与其他系统之间似乎存在差异。请问您使用的是哪个操作系统? - lawlist
1
所以举个例子,你按M-d删除一个单词,这个被删除的单词被复制到剪贴板,而你想要阻止这种情况发生,对吗?还是说你按退格键,然后删除的文本被复制到剪贴板? - Carlo Espino
1
我只能说你可以使用[TinyEat](http://www.emacswiki.org/emacs/TinyEat),它具有删除而不保存等其他可能对你有用的功能,因此我使用了`(global-set-key "\ M-d" 'tinyeat-forward-preserve)(global-set-key (kbd "C-k") 'tinyeat-kill-line)` 。但是,对于按下退格键并将已删除的文本复制到剪贴板的情况,我觉得那很奇怪,因为我的Emacs没有这种情况发生。 - Carlo Espino
1
只是想澄清一下:你对 save-interprogram-paste-before-kill 解决方案的疑虑是,如果你在 Emacs 之外复制了一些内容 X,然后在 Emacs 中删除了一些单词/行等 之后 再粘贴,你必须输入 C-y然后再重复一次或多次 输入 M-y 才能得到 X。这样理解对吗? - itsjeyd
1
使用剪贴板管理器,如果复制了某些内容到剪贴板,你可以从菜单中检索过去的剪贴板项目,这样就不会有问题了。 - Tom
显示剩余4条评论
4个回答

13

首先:Emacs有自己内部的“剪贴板”,称为“kill ring”,它与系统剪贴板是分开的。

为确保系统剪贴板始终具有你在 Emacs 之外复制的最新内容,请添加:

(setq x-select-enable-clipboard nil)

根据Emacs的手册,将以下内容添加到你的.emacs文件中:

这样可以防止“kill”和“yank”命令访问剪贴板[...]。

无论你是否在Emacs内部复制过内容并删除了文本,都可以使用命令x-clipboard-yank将剪贴板的内容插入当前缓冲区。如果需要,你可以设置此命令的全局快捷键绑定。

(global-set-key (kbd "C-c y") 'x-clipboard-yank)

如果需要的话,可以用您选择的键绑定替换C-c y


有没有一条命令可以修改剪贴板的内容,而不受 (setq x-select-enable-clipboard nil) 的影响?我的意思是为了将其绑定到 c-w 键,这样我就可以剪切剪贴板中选定的文本。 - Hi-Angel
有趣的是,Emacs 的内部文档根本不知道 x-clipboard-yank,但它仍然可以正常工作... - Hi-Angel
1
clipboard-kill-region(用于剪切)和clipboard-kill-ring-save(用于复制)应该可以正常工作。您可以通过C-h f x-clipboard-yank RET访问内置文档以了解有关x-clipboard-yank的信息。 - itsjeyd
1
太好了!总结一下,我最终得到了以下配置:`(setq x-select-enable-clipboard nil) (global-set-key (kbd "C-y") 'x-clipboard-yank) (global-set-key (kbd "C-w") 'clipboard-kill-region) (global-set-key (kbd "M-w") 'clipboard-kill-ring-save)` - Hi-Angel
我一段时间后回来补充,现在我还添加了一个键绑定(global-set-key (kbd "s-y") 'yank)。它可以从 kill-ring 中获取复制的内容。我发现有时候 kill-ring 很有用,因此它肯定值得一个单独的键绑定。 - Hi-Angel
2
x- 前缀变量已经过时。请改为使用 select-enable-clipboard 等。 - elig

4
这两个设定可以防止 X 剪贴板的污染,所有的 kill ring 都将保持在 Emacs 中不受影响。
  (setq x-select-enable-clipboard nil)
  (setq x-select-enable-primary nil)

在设置了删除m-d文本的配置后,我刚尝试过。然而,文本仍然被复制到了剪贴板中。 - Hi-Angel
@YagamyLight 你是如何“设置这个配置”的?我在一个KDE系统上测试了这个答案中提供的代码,(setq x-select-enable-clipboard nil) 成功地防止了被删除的内容存储到剪贴板中。 - itsjeyd
@itsjeyd 嗯...奇怪,但这对我根本不起作用。我尝试使用m-w复制内容,之后m-d和m-backspace组合都会覆盖已复制的文本。这是我的.emacs配置:http://pastebin.com/GCRxngrG - Hi-Angel
@itsjeyd 我刚发现了一件有趣的事情。目前这并没有真正覆盖剪贴板,如果我尝试从其他应用程序中粘贴文本,那么文本仍然是旧的!问题仅存在于Emacs中:c-y键只会粘贴我删除的最后一个文本,而不是来自剪贴板的文本... - Hi-Angel
@YagamyLight Emacs有自己的内部“剪贴板”,称为“kill ring”,它与系统剪贴板分开。这就是为什么当您键入“C-y”时,会得到您最后删除的文本。 - itsjeyd
@itsjeyd 如果除了这个答案之外,还有人写了如何强制使用系统剪贴板来使用 c-yc-w 的方法,那么问题就解决了。有趣的是,在评论中 <kbd>smthng</kbd> 标签不起作用... - Hi-Angel

1
使用delete-region命令。通常,名称中带有delete的命令不会将内容存储在kill-ring中。

1
但是我失去了许多好的删除绑定键。我刚刚查看了文档,其中有一些命令的名称中包含“delete”。 - Hi-Angel

1

为了解决在粘贴替换文本之前需要删除某些内容的特定问题,只需使用delete-selection-mode。这将使得当您粘贴时区域被删除。


是的,这可能有效,但不是可扩展的解决方案,因为例如在evil-mode中我非常广泛地使用kill-ring,然而我真正需要将被删除的内容放入系统剪贴板的时刻要少得多。我还使用klipper(一个剪贴板管理器),并且更喜欢剪贴板历史记录有一些有用的东西。 - Hi-Angel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接