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

如何在Windows上的Emacs中保留剪贴板内容?,emacs,elisp,Emacs,Elisp,这是我几次遇到的情况: 我从其他程序复制一些文本。在粘贴/拉入文本之前,请转到Emacs并进行一些编辑。C-y向yank和瞧。。。不是我想粘贴的文本。然后我意识到当我移动东西的时候,我使用了像kill line和backward kill word这样的命令,而那些被杀死的行和单词现在占据了杀环。但是键入M-y不会将原始复制的文本带回来,因此我需要返回原始程序再次复制文本。即使最糟糕的是,如果原来的程序关闭了,那么我完全丢失了复制的文本 Kill line等都是这样的基本命令(比如几乎按dele

这是我几次遇到的情况:

我从其他程序复制一些文本。在粘贴/拉入文本之前,请转到Emacs并进行一些编辑。C-y向yank和瞧。。。不是我想粘贴的文本。然后我意识到当我移动东西的时候,我使用了像kill line和backward kill word这样的命令,而那些被杀死的行和单词现在占据了杀环。但是键入M-y不会将原始复制的文本带回来,因此我需要返回原始程序再次复制文本。即使最糟糕的是,如果原来的程序关闭了,那么我完全丢失了复制的文本


Kill line等都是这样的基本命令(比如几乎按delete键),虽然我不介意Kill环会因为使用这些命令而变得有点混乱,但我希望我的原始文本会留在Kill环的某个地方,这样我最终可以通过键入几次M-y来找到它。如何使Emacs在覆盖剪贴板内容之前自动将当前剪贴板内容保留到kill环中

我认为问题在于,当你从emacs外的剪贴板中拉出时,你没有保存到杀人环

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

或者更好地编写一个函数剪贴板保存到杀死环和猛拉,它将剪贴板保存到杀死环,然后猛拉它

编辑:通过代码跟踪一点,这就是你想要的;你可以把它挂在钥匙上。它将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)

我猜你可以破解各种kill命令,不将文本放入剪贴板,然后将剪贴板拖动到另一个键,不知道这是否有效。

我只是通过拖动文本然后重新删除来解决这个问题,当我在另一个windows应用程序中复制或剪切后弹出emacs时


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

当您在Emacs中执行kill时,此代码应自动将选择(来自外部Emacs)放到kill环上。它已经在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))))

如果您发现自己经常这样做,那么查看一下软件包可能会很有用,它可以让您清楚地看到压井环(而不是重复键入
M-y
)。

请注意,最新的Emacs CVS版本具有变量save interprogram paste before kill,该变量在文件中执行以下操作:

**当
在kill之前保存程序间粘贴'
如果为非零,emacs将不会对
当有东西时,程序间会粘贴
是因为救了前者才被杀死的
在后者之前的
压井环中


这很好,但我需要一些自动的东西(以防我忘记!),这样每当我杀死某样东西时,剪贴板上的任何东西都会保留到杀死戒指上,如果它还不在那里的话。我想我的编辑工作正常。before建议使yank命令自动将windows剪贴板保存到kill环。我认为您的代码在以下情况下无法工作:在非emacs窗口中选择文本(如“XYZ”)现在在emacs中杀死一些文本(如“ABC”)C-y M-y M-y。。。XYZ找不到b/c在第一次击杀时选择丢失,然后第一个yank可以将其添加到击杀环中。你不需要用我的解决方案检查击杀环上的内容,因为当你抓取剪贴板时,它会将其清除,因此后续调用只会得到零,而不会将其添加到击杀环中。简单、简单、完美。我今天用这个。从浏览器复制了一些文本,然后进入emacs将其粘贴到新文件中。在打开新文件时,我不知不觉地对文件路径名使用了一些kill命令。如果没有此脚本,剪贴板内容将消失。但这一次,一切如期而至!