it-swarm.cn

如何将文本从Emacs复制到Linux上的另一个应用程序

当我在Emacs 22.1.1中剪切(杀死)文本时(在X中,在KDE中,在Kubuntu上的自己的窗口中),我无法在任何其他应用程序中粘贴(猛拉)它。

102
memius

将以下内容插入.emacs文件:

(setq x-select-enable-clipboard t)
87
memius

我们在这里要小心我们的定义

  • Emacs副本是命令kill-ring-save(通常绑定到 M-w)。
  • A 系统副本是您通常按下的内容 C-c (或在应用程序窗口中选择“编辑 - >复制”)。
  • X副本是用鼠标光标“物理”突出显示文本。
  • Emacs paste是命令yank(通常绑定到 C-y)。
  • A 系统粘贴是您通常按下的内容 C-v (或在应用程序窗口中选择“编辑 - 粘贴”)。
  • X粘贴按下“鼠标中心”(通过同时按下鼠标左键和鼠标按钮进行模拟)。

就我而言(在GNOME上):

  • Emacs和系统副本通常都可以使用X paste。
  • X副本通常适用于Emacs粘贴。
  • 要使系统复制与Emacs粘贴和Emacs复制一起使用系统粘贴,您需要将(setq x-select-enable-clipboard t)添加到.emacs。或者试试

    META-X set-variable RET x-select-enable-clipboard RET t
    

我认为这是非常标准的现代Unix行为。

同样重要的是要注意(虽然你说你在一个单独的窗口中使用Emacs),当Emacs在控制台中运行时,它完全脱离系统和X剪贴板:在这种情况下剪切和粘贴由终端调解。例如,终端窗口中的“编辑 - >粘贴”应该与将剪贴板中的文本键入Emacs缓冲区的方式完全相同。

118
Chris Conway

在Emacs中复制和粘贴的难点在于你希望它独立于内部kill/yank工作,并且你希望它在终端和gui中都能工作。现有终端或gui的强大解决方案,但不是两者兼而有之。安装xsel之后(例如Sudo apt-get install xsel),这是我为复制和粘贴做的工作:

(defun copy-to-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (message "Yanked region to x-clipboard!")
        (call-interactively 'clipboard-kill-ring-save)
        )
    (if (region-active-p)
        (progn
          (Shell-command-on-region (region-beginning) (region-end) "xsel -i -b")
          (message "Yanked region to clipboard!")
          (deactivate-mark))
      (message "No region active; can't yank to clipboard!")))
  )

(defun paste-from-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (clipboard-yank)
        (message "graphics active")
        )
    (insert (Shell-command-to-string "xsel -o -b"))
    )
  )

(global-set-key [f8] 'copy-to-clipboard)
(global-set-key [f9] 'paste-from-clipboard)
10
RussellStewart

我把它粘在我的.emacs中:

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

我随后在从Emacs中的任何东西到任何其他X11或Gnome应用程序中来回切换和粘贴时基本没有问题。

额外:要在Emacs中完成这些事情而不必重新加载整个.emacs,请在.emacs缓冲区中每个表达式的紧密关注之后用光标执行C-x C-e。

祝好运!

9
jfm3

我假设你通过emacs表示X下的Emacs(即不在终端窗口内)。

有两种方法:

  1. (仅适用于unix OS)用鼠标突出显示所需文本(将其复制到X剪贴板),然后单击鼠标中键粘贴。
  2. 突出显示所需的文本然后“M-x clipboard-kill-ring-save”(请注意,您可以将其绑定到更简单的键)。然后在您喜欢的应用程序中“编辑 - >粘贴”。

可用的剪贴板操作:

  • clipboard-kill-ring-save - 从Emacs到剪贴板的复制选择
  • clipboard-kill-region - 从Emacs切换选择到剪贴板
  • clipboard-yank - 从剪贴板粘贴到Emacs
7
pdq

一篇EmacsWiki文章 解释了在X下复制和粘贴的一些问题以及如何配置它来工作。

6
cschol

这适用于Mac OSX上的M-w。只需添加到您的 .emacs 文件中。

(defun copy-from-osx ()
   (Shell-command-to-string "pbpaste"))
(defun paste-to-osx (text &optional Push)
   (let ((process-connection-type nil))
      (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
         (process-send-string proc text)
         (process-send-eof proc))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)

来源 https://Gist.github.com/the-kenny/267162

4
cevaris

下面的代码受@ RussellStewart上面的回答启发,增加了对x-PRIMARY和x-SECONDARY的支持,将region-active-p替换为use-region-p以覆盖空区域的情况,如果尚未安装xsel则不会以静默方式返回(返回错误消息) ),并包括“剪切”功能(emacs Cy,windows Cx)。

(defun my-copy-to-xclipboard(arg)
  (interactive "P")
  (cond
    ((not (use-region-p))
      (message "Nothing to yank to X-clipboard"))
    ((and (not (display-graphic-p))
         (/= 0 (Shell-command-on-region
                 (region-beginning) (region-end) "xsel -i -b")))
      (error "Is program `xsel' installed?"))
    (t
      (when (display-graphic-p)
        (call-interactively 'clipboard-kill-ring-save))
      (message "Yanked region to X-clipboard")
      (when arg
        (kill-region  (region-beginning) (region-end)))
      (deactivate-mark))))

(defun my-cut-to-xclipboard()
  (interactive)
  (my-copy-to-xclipboard t))

(defun my-paste-from-xclipboard()
  "Uses Shell command `xsel -o' to paste from x-clipboard. With
one prefix arg, pastes from X-PRIMARY, and with two prefix args,
pastes from X-SECONDARY."
  (interactive)
  (if (display-graphic-p)
    (clipboard-yank)
   (let*
     ((opt (prefix-numeric-value current-prefix-arg))
      (opt (cond
       ((=  1 opt) "b")
       ((=  4 opt) "p")
       ((= 16 opt) "s"))))
    (insert (Shell-command-to-string (concat "xsel -o -" opt))))))

(global-set-key (kbd "C-c C-w") 'my-cut-to-xclipboard)
(global-set-key (kbd "C-c M-w") 'my-copy-to-xclipboard)
(global-set-key (kbd "C-c C-y") 'my-paste-from-xclipboard)
1
user1404316

嗯,你使用什么平台和什么版本的emacs?在Windows Vista上使用GNU Emacs 22.1.1,它对我来说很好。

如果你有任何机会通过RealVNC查看器从windows到linux这样做,请确保你首先在linux机器上运行“vncconfig -iconic”.....

0
kfh

我总是在emacs中使用快速粘贴 - 拖动选择,在目标窗口中点击鼠标中键。

(从参考kate,我认为你是在Linux或类似的,并可能在X中以某种方式使用emacs。)

0
cannam

您可能想要指定您正在使用的平台。它是在linux,unix,macosx,windows,ms-dos上吗?

我相信对于Windows它应该工作。对于MacOSX,它将被添加到x-windows剪贴板,这与macosx剪贴板不同。对于Linux,它取决于你的窗口管理器的风格,但我相信x-windows在大多数情况下以一种不错的方式处理它。

所以,请说明。

0
Mats Fredriksson