将Emacs的复制/粘贴与系统的复制/粘贴集成

32
我在我的.emacs文件中设置了(cua-mode t),这样C-c就是复制,C-v就是粘贴,和我的桌面上大多数其他程序一样(Ubuntu,Gnome,Linux)。但是,Emacs似乎不与其他程序共享剪贴板/复制缓冲区。
例如,如果我在Firefox中按C-c,我可以使用S-C-v将其粘贴到终端中或使用C-v将其粘贴到gedit中。但是,如果我在emacs中按C-v(或C-y),我得不到从Firefox复制的内容。
有没有办法让这个工作?是否有另一个命令可以用来访问系统的复制粘贴缓冲区?

顺便提一下,它确实与系统共享剪贴板,但仅限于鼠标选择(即您可以在其他地方使用中键粘贴的内容)。 - user319799
这个问题应该放在superuser.com上吧? - Vitor Py
1
Vim和Emacs的问题通常被认为是适合在SO上讨论的,因为它们是程序员的工具。请参阅已经在Meta上进行的各种讨论。 - jamessan
@jamessan 好的,我同意 :) - Vitor Py
@doublep 是的,它似乎使用了 X11 选择缓冲区,但默认情况下似乎不使用剪贴板。因此,选择和中键单击可以工作,但复制粘贴快捷键不能使用。 - sligocki
5个回答

27

我曾经也遇到过同样的问题。我将以下代码添加到了我的 .emacs 文件中:

(setq x-select-enable-clipboard t)
(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)

现在,在Emacs和其他应用程序之间使用Ctrl-C和Ctrl-v可以正常工作。 来源:Ubuntu论坛

啊,太好了。我只有第一个命令。但第二个命令解决了我遇到的一个问题,在emacs中选择文本并使用中键点击无法正确复制。谢谢! - sligocki
我是新手。我第一次创建了/.emacs文件。我将你的代码添加到了/.emacs中,它可以正常工作。谢谢。 - kenu.heo
1
这似乎在Mac OSX上无法工作;出现以下错误:current-kill: Symbol's function definition is void: x-cut-buffer-or-selection-value - cevaris
当我将这两行添加到emacs.el时,它们之前都缺少了' - somethingSomething
在我的Ubuntu 16.04和Emacs 24上,这并不起作用。即使启用了此功能,在终端Emacs之外复制文本,然后粘贴(或剪贴板粘贴)到Emacs中也无法检索正确的文本。 - ely

15

请参见手册的 剪贴板 部分中的 clipboard-yankclipboard-kill-region


1
太好了,这正是我在寻找的。我将(x-select-enable-clipboard t)添加到我的.emacs文件中,现在一切都像我预期的那样工作。谢谢。 - sligocki
1
嗯,实际上,这并不完全正确。这将从X11选择中粘贴。但比以前好多了。 - sligocki
有时候这只能绑定到“粘贴”(至少在Ubuntu中)。 - Hut8

12

这在我的电脑上可以运行:

;; CUA OS copypasta even in ncurses mode
(case system-type
  ('darwin (unless window-system
             (setq interprogram-cut-function
                   (lambda (text &optional push)
                     (let* ((process-connection-type nil)
                            (pbproxy (start-process "pbcopy" "pbcopy" "/usr/bin/pbcopy")))
                       (process-send-string pbproxy text)
                       (process-send-eof pbproxy))))))
  ('gnu/linux (progn
                (setq x-select-enable-clipboard t)
                (defun xsel-cut-function (text &optional push)
                  (with-temp-buffer
                    (insert text)
                    (call-process-region (point-min) (point-max) "xsel" nil 0 nil "--clipboard" "--input")))
                (defun xsel-paste-function()

                  (let ((xsel-output (shell-command-to-string "xsel --clipboard --output")))
                    (unless (string= (car kill-ring) xsel-output)
                      xsel-output )))
                (setq interprogram-cut-function 'xsel-cut-function)
                (setq interprogram-paste-function 'xsel-paste-function))))

不错!这对于C-c/C-x/C-v有效,但现在中键单击不再与系统共享。你的中键单击还能用吗? - sligocki
这只在emacs窗口模式下工作,而不是终端(-nw)模式下,对吧? - galactica

4
也许这个EmacsWiki页面会有所帮助,特别是涉及clipboard-kill-regionclipboard-kill-ring-saveclipboard-yank的部分。

谢谢@danlei,维基提供了一些有用的建议。 - sligocki
不用谢。EmacsWiki是关于Emacs的一切的绝佳资源。 - danlei

0

我使用 autocutsel 解决了这个问题,它可以与 emacs 和我 Ubuntu 系统的其他部分一起使用。

  autocutsel - keep the X clipboard and the cutbuffer in sync

我使用以下命令(运行一次,通常由我的窗口管理器的“启动”机制或~/.xsession调用):

autocutsel -fork
autocutsel -fork -selection PRIMARY

autocutsel 的第一个实例执行以下操作:

autocutsel 跟踪 [X11] 服务器的剪贴板和选择缓冲区的更改。当剪贴板发生更改时,它会更新选择缓冲区。当选择缓冲区发生更改时,它拥有剪贴板选择权。剪贴板和选择缓冲区始终保持同步。

然而,通常还有第三个剪贴板,称为 PRIMARY,第二个 autocutsel 实例用于与其他两个同步。

这样做的优点是三个主要剪贴板被统一,因此通过中键单击或使用 CTRL-C 和 CTRL-V 进行 CUA 样式复制/粘贴来粘贴当前选择都可以一起工作。

这种方法的主要缺点是,任何文本的自动高亮(例如在emacs中双击单词以进行高亮显示,或在StackOverflow编辑字段中单击BlockQuote图标)都会立即清除您的剪贴板。为了解决这个问题,我使用剪贴板历史记录器,例如glipper,它还方便地记录所有剪贴板内容,并允许我在这种情况下检索丢失的剪贴板内容。这可能需要一些时间来适应,但对我很有效。作为替代方案,您可以尝试-pause选项,在选择之前等待一段时间,这可能足够长,以取消选择或删除任何自动选择的文本。然而,我无法得到对我足够好的结果。
请注意,此解决方案不需要任何特殊的emacs配置,我使用启用了cua-mode。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接