【问题标题】:How to stop Emacs from "contaminating" the clipboard?如何阻止 Emacs “污染”剪贴板?
【发布时间】:2014-08-03 11:08:30
【问题描述】:

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

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

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

为了确保在 Emacs 之外复制的内容在 kill-ring 中仍然可用,并且有类似问题的人似乎对此解决方案感到满意。困扰我的是,我必须输入 Cy ,然后重复一次或多次 My 才能访问我要粘贴的内容.

所以我的问题是:当我杀死/删除内容时,如何阻止 Emacs 将内容复制到剪贴板(不包括使用 C-w 删除区域的情况)?

【问题讨论】:

  • 在过去的 2 到 3 周内,有两个线程处理了类似的问题,但 OSX 与其他系统的处理方式似乎有所不同。请问您使用的是什么操作系统。
  • 例如,您按 M-d 删除一个单词,这个删除的单词被复制到剪贴板,您想防止这种情况发生,对吗?还是您按退格键并将已删除的文本复制到剪贴板?
  • 我只能说你可以使用TinyEat 女巫具有删除功能而不保存其他你可能觉得有用的东西,所以我有(global-set-key "\M-d" 'tinyeat-forward-preserve)(global-set-key (kbd "C-k") 'tinyeat-kill-line) 但对于按下的情况退格键和被删除的文本被复制到剪贴板对我来说这很奇怪,因为我的 Emacs 不会发生这种情况
  • 澄清一下:save-interprogram-paste-before-kill 解决方案让您烦恼的是,如果您在 Emacs 之外复制一些内容 X,然后删除一些单词/行/等。在 Emacs 中在粘贴之前,您必须输入C-y 然后重复一次或多次 M-y 才能到达X。对吗?
  • 使用剪贴板管理器,将内容复制到剪贴板也没问题,因为您可以从菜单中检索过去的剪贴板项目

标签: emacs editor clipboard copy-paste


【解决方案1】:

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

要确保系统剪贴板始终包含您在 Emacs 外部复制的最新内容,请添加

(setq x-select-enable-clipboard nil)

到您的.emacs 文件。根据 Emacs manual,这将

防止 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 键,所以我可以在剪贴板中剪切选定的文本。
  • 有趣的是:内部 Emacs 文档根本不知道 x-clipboard-yank,但它仍然可以工作......
  • clipboard-kill-region(用于杀戮)和clipboard-kill-ring-save(用于复制)应该可以工作。您可以通过C-h f x-clipboard-yank RET 访问x-clipboard-yank 的内置文档。
  • 太棒了!所以,总结一下:我最终得到以下配置:(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)
  • 一段时间后我回来补充一下,现在我还添加了一个键绑定(global-set-key (kbd "s-y") 'yank)。它是从杀戮环中猛拉出来的。我发现 kill-ring 有时很有用,它当然值得一个单独的键绑定。
【解决方案2】:

这两个设置可防止 X 剪贴板受到污染。 Emacs 中的所有杀伤环都完好无损。

  (setq x-select-enable-clipboard nil)
  (setq x-select-enable-primary nil)

【讨论】:

  • 我只是在设置此配置后尝试使用 m-d 删除文本。唉,文本还是被复制到了剪贴板中。
  • @YagamyLight 您是如何“设置此配置”的?我在 KDE 系统上测试了此答案中提供的代码,(setq x-select-enable-clipboard nil) 成功防止已删除的内容存储在剪贴板中。
  • @itsjeyd 嗯...奇怪,但这对我根本不起作用。我尝试用 m-w 复制内容,然后 m-d 和 m-backspace 组合都会覆盖复制的文本。这是我的 .emacs 配置:pastebin.com/GCRxngrG
  • @itsjeyd 我刚刚发现了一件有趣的事情。这现在并没有真正覆盖剪贴板,如果我尝试将文本从那里粘贴到任何其他应用程序中,文本仍然是旧的!问题仅存在于 Emacs 中:c-y 键仅粘贴我删除的最后一个文本,而不是剪贴板中的那个...
  • @YagamyLight Emacs 有自己的内部“剪贴板”,称为"kill ring",它与系统剪贴板是分开的。这就是为什么您在输入 C-y 时会看到上次删除的文本。
【解决方案3】:

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

【讨论】:

  • 但是我失去了各种好的键绑定来删除。正如我刚刚查看的文档,这里有几个命令,在这些名称中有一个“删除”。
【解决方案4】:

要解决在替换文本中粘贴之前需要删除某些内容的具体问题,只需使用delete-selection-mode。这样可以在粘贴时删除该区域。

【讨论】:

  • 是的,它可能会起作用,⁺¹。虽然不是一个可扩展的解决方案,因为例如在evil-mode 中,我非常广泛地使用了kill-ring,但是当我真正需要系统剪贴板中被杀死的内容的时候却少了一个数量级。而且我还使用klipper (剪贴板管理器),并且更喜欢剪贴板历史记录有一些有用的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多