【问题标题】:How to preserve clipboard content in Emacs on Windows?如何在 Windows 上的 Emacs 中保留剪贴板内容?
【发布时间】:2009-05-11 16:33:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    每当您在 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)。

    【讨论】:

    • 简单、轻松、完美。我今天用这个。从浏览器复制了一些文本,然后进入 emacs 将其粘贴到新文件中。没有意识到,我在打开新文件时对文件路径名使用了一些 kill 命令。如果没有这个脚本,剪贴板内容就会消失。但这次它按预期工作了!
    【解决方案2】:

    请注意,最新的 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 thekill-ring' 在后者之前。

    【讨论】:

      【解决方案3】:

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

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

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

      edit:稍微跟踪一下代码,这就是你想要的;你可以把它挂在钥匙上。它将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-ring 中,如果它不存在的话。
      • 我认为我的编辑工作。 before 建议使 yank 命令自动将 windows 剪贴板保存到 kill ring。
      • 我认为您的代码无法在该场景中运行:在非 emacs 窗口中选择文本(例如“XYZ”)现在在 emacs 中删除一些文本(例如“ABC”)Cy My My .. . XYZ 不会被发现 b/c 选择在第一次杀戮时丢失,在第一个 yank 可以将其添加到杀戮环之前。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 您无需使用我的解决方案检查杀伤环上的内容,因为当您抓取剪贴板时,它会清除它,因此后续调用只会得到 nil,并且不会将其添加到杀伤环中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-16
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 2013-07-23
        相关资源
        最近更新 更多