16

这是我遇到过几次的场景:

我从其他程序中复制了一些文本。转到 Emacs 并在我粘贴/拉入文本之前进行了一些编辑。Cy 拉出并瞧……不是我打算粘贴的文本。然后我意识到,当我四处移动时,我使用了诸如 kill- 之类的命令line 和 back-kill-word,那些被杀死的行和单词现在占据了 kill-ring。但是输入 My 并没有带回原来复制的文本,所以我需要回到我原来的程序再次复制文本。更糟糕的是,如果原始程序被关闭,那么我完全丢失了复制的文本。

杀戮线等是这样的基本命令(几乎就像按下删除键),虽然我不介意使用这些命令使杀戮环有点混乱,但我希望我的原始文本留在某处kill-ring 以便我最终可以通过键入 My 几次来找到它。在覆盖剪贴板内容之前,如何使 Emacs 自动将当前剪贴板内容保存到 kill-ring 中?

4

5 回答 5

12

每当您在 Emacs 中执行 kill 操作时,此代码应自动将选择(从 Emacs 外部)放到 kill-ring 上。它已经在 Linux 上进行了测试,但不应仅限于 Linux。

(defadvice kill-new (before kill-new-push-xselection-on-kill-ring activate)
  "Before putting new kill onto the kill-ring, add the clipboard/external selection to the kill ring"
  (let ((have-paste (and interprogram-paste-function
                         (funcall interprogram-paste-function))))
    (when have-paste (push have-paste kill-ring))))

如果您发现自己经常这样做,查看包browse-kill-ring可能会很有用,它可以让您很好地了解 kill ring(而不是重复键入M-y)。

于 2009-05-11T20:32:05.893 回答
3

请注意,最新的 Emacs CVS 版本具有变量 save-interprogram-paste-before-kill ,这正是来自etc/NEWS文件的 cf:

** 当save-interprogram-paste-before-kill' is non-nil, emacs will not clobber the the interprogram paste when something is killed in it by saving the former in thekill-ring' 在后者之前。

于 2009-09-10T07:48:17.757 回答
2

我认为问题在于,当您从 emacs 外部的剪贴板中拉出时,您并没有保存到 kill ring 中。

您需要的是使用函数剪贴板-yank 插入区域,然后以某种方式选择它并将其保存到终止环,就像函数 kill-ring-save 一样。

或者甚至更好地编写一个函数clipboard-save-to-kill-ring-and-yank,它将剪贴板保存到kill ring,然后猛拉它。

编辑:稍微跟踪一下代码,这就是你想要的;你可以把它挂在钥匙上。它将windows剪贴板内容保存到kill ring。

(defun clipboard-to-kill-ring()
  "save the external clipboard contents to the kill ring"
  (interactive)
    (let ((clip (funcall interprogram-paste-function)))
      (when clip
        (kill-new clip)))

(defadvice yank (before maybe-copy-windows-clipboard (arg))
    (clipboard-to-kill-ring))

(ad-activate 'yank)
于 2009-05-11T16:40:34.040 回答
0

我猜您可以破解各种 kill 命令以不将文本放入剪贴板,然后将剪贴板拉动绑定到不同的键,不知道这是否可行。

于 2009-05-11T16:42:11.837 回答
0

当我在完成复制或剪切另一个 Windows 应用程序后弹出到 emacs 时,我只是通过猛拉文本然后重新杀死它来解决这个问题。

更好的方法是破解 emacs,这样当你杀死某些东西时,它会将现有剪贴板与 kill ring 中的最顶部条目进行比较,如果不同,它将剪贴板内容推送到 kill ring,然后再执行你明确请求的 kill .

于 2009-05-11T18:11:30.130 回答