如何在Windows上的Emacs中保留剪贴板内容?

时间:2009-05-11 16:33:03

标签: emacs elisp

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

我从其他程序中复制了一些文字。转到Emacs并进行一些编辑,然后我将文本粘贴/抽出.Cy to yank and voila ...而不是我打算粘贴的文本。然后我意识到当我移动东西时,我使用了像kill这样的命令line和backward-kill-words,那些被杀死的行和单词现在占据了杀戮戒指。但是输入M-y并没有带回原始复制的文本,所以我需要回到原始程序再次复制文本。如果原始程序关闭,甚至最糟糕的是,我完全丢失了复制的文本。

Kill-line等是这样的基本命令(比如几乎点击删除键),虽然我不介意使用这些命令使kill-ring变得有点混乱,但我希望我的原始文本留在杀戮戒指的某个地方,这样我最终可以通过键入My几次找到它。在覆盖剪贴板内容之前,如何让Emacs自动将当前剪贴板内容保留到kill-ring中?

5 个答案:

答案 0 :(得分: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可能会很有用,它可以让你看到杀戮戒指的一个很好的视图(而不是重复输入M-y )。

答案 1 :(得分:3)

请注意,最新的Emacs CVS版本具有变量save-interprogram-paste-before-kill,它完全符合以下条件:来自etc/NEWS文件:

  

** 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 the在后​​者之前杀死戒指。

答案 2 :(得分:2)

我认为问题是当你从emacs外面的剪贴板中猛拉时,你不会保存到杀戮戒指。

你需要的是使用功能clipboard-yank插入区域,然后以某种方式选择它并将其保存到kill ring,就像kill-ring-save函数一样。

甚至可以更好地编写一个函数clipboard-save-to-kill-ring-and-yank,它将clipboad保存到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)

答案 3 :(得分:0)

我猜你可以破解各种kill命令,不将文本放入剪贴板,然后将clipboard-yank绑定到另一个键,dunno,如果可行的话。

答案 4 :(得分:0)

当我在完成复制或切入另一个Windows应用程序后弹出emacs时,我只是在解决文本然后重新查杀它。

更好的方法是破解emacs,这样当你杀死某些内容时,它会将现有剪贴板与kill ring中最顶层的条目进行比较,如果不同,它会在执行kill之前将剪贴板内容推送到kill ring你明确要求。