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

时间:2010-07-09 19:53:14

标签: linux emacs copy-paste gnome

我的.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复制的内容。

有没有办法让这项工作?是否有其他命令可用于访问系统的复制粘贴缓冲区?

5 个答案:

答案 0 :(得分:27)

我遇到了同样的问题。我把它添加到我的.emacs文件中:

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

现在,Emacs和其他应用程序之间的Ctrl-C和Ctrl-v工作正常。 资料来源:Ubuntu Forums

答案 1 :(得分:15)

请参阅手册clipboard部分中的clipboard-yankclipboard-kill-region

答案 2 :(得分: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))))

答案 3 :(得分:4)

也许此EmacsWiki页面会有所帮助,尤其是提及clipboard-kill-regionclipboard-kill-ring-saveclipboard-yank的部分。

答案 4 :(得分:0)

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

  autocutsel - keep the X clipboard and the cutbuffer in sync

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

autocutsel -fork
autocutsel -fork -selection PRIMARY

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

  

autocutsel跟踪[X11]服务器的剪切缓冲区和剪贴板选择中的更改。当剪贴板是   改变了,它更新了cutbuffer。切换缓冲区更改后,它拥有剪贴板选择。该   cutbuffer和剪贴板选择始终是同步的。

然而,通常会有第三个剪贴板,名为PRIMARYautocutsel的第二个实例用于与其他两个实例同步。

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

这种方法的主要缺点是任何文本的自动突出显示(例如双击以突出显示emacs中的单词,或单击StackOverflow编辑字段中的BlockQuote图标)都会立即消除您的复制缓冲区。为了解决这个问题,我使用了一个剪贴板历史记录器,例如glipper,它还可以方便地记录所有剪贴板内容,并允许我在这种情况下检索丢失的剪贴板内容。它可能需要一点点习惯,对我来说效果很好。作为替代方案,您可以尝试-pause选项,该选项在进行选择之前会等待一段时间,这可能足以取消选择或删除任何自动选择的文本。不过,我无法获得足够好的结果。

请注意,此解决方案不需要任何特殊的emacs配置,我在启用cua模式时使用该配置。