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


113

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


我建议您阅读:CopyAndPaste-Emacs Wiki。这很好地解释了游览问题。
El Borito

Answers:


122

让我们小心这里的定义

  • 一个Emacs的拷贝是命令kill-ring-save(通常结合于M-w)。
  • 一个系统副本是你通常从按下获得C-c(或选择“编辑- >复制”在应用程序窗口)。
  • 一个X拷贝是“身体”,突出用鼠标光标文字。
  • 一个Emacs的膏是命令yank(通常结合于C-y)。
  • 一个系统膏是你通常从按下获得C-v(或选择在应用程序窗口中的“编辑-粘贴”)。
  • 一个X膏被按下“中心鼠标按钮”(通过按压左和右鼠标按钮一起模拟的)。

就我而言(在GNOME上):

  • Emacs和系统复制通常都可以使用X粘贴。
  • 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缓冲区中一样。


7
这使术语混乱。X主要选择就是您所称的“ X复制/粘贴”的标准名称,且名称比较容易混淆。您所谓的“系统复制/粘贴”是X剪贴板。
吉尔(Gilles)'所以

谢谢...看起来自编写以来变量已被重命名。META-X set-variable RET select-enable-clipboard RET t要么(setq select-enable-clipboard t)
David McCorrie

95

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

(setq x-select-enable-clipboard t)

3
不罗word,告诉您您需要了解的内容。极好的答案。
JasonFruit 2011年

完美运行,我使用Ubuntu 12.04。谢谢
zhihong

7
漂亮又简单,但这在终端中不起作用。没有理由为什么相同的快捷方式在终端和自由窗口中均不起作用,下面的一些答案同时解决了这两个问题。
RussellStewart 2014年

1
运行时emacs -nw,我使用终端自身的快捷方式。Shift-Ctrl-X剪切(杀死)文本,而Shift-Ctrl-C进行复制。
memius

4
当您emacs -nw在水平拆分的tmux窗口中运行时,此操作将无效。
Sridhar Ratnakumar

11

我将其粘贴在.emacs中:

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

随后,我基本上没有问题,可以从Emacs中的任何内容剪切和来回粘贴到任何其他X11或Gnome应用程序。

奖励:要使这些事情在Emacs中发生而不必重新加载整个.emacs,请在.emacs缓冲区中每个表达式的关闭括号后紧接着用光标执行Cx Ce。

祝好运!


3
该解决方案适用于在X Window即emacs的emacs的一个窗口内运行,如果你在你所需要的命令行运行Emacs是:stackoverflow.com/questions/5288213/...
elviejo79

Symbol’s function definition is void: x-cut-buffer-or-selection-value
alper

10

在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)

因为没有参数,所以我收到错误。我需要将第一行“(defun copy-to-clipboard()”)更改为“(defun copy-from-ubuntu(文本和可选的推送)”。这对我
有用

它可以工作,但是粘贴操作非常慢,可以重新粘贴到网络上吗?
alper

7

我认为emacs是指X下的Emacs(即不在终端窗口内)。

有两种方法:

  1. (仅适用于unix操作系统)用鼠标突出显示所需的文本(这会将其复制到X剪贴板),然后单击鼠标中键进行粘贴。
  2. 突出显示所需的文本,然后突出显示“ Mx剪贴板-kill-ring-save”(注意,您可以将其绑定到更简单的键上)。然后只需在您喜欢的应用程序中“编辑->粘贴”即可。

剪贴板操作可用:

  • 剪贴板-杀死环-保存-将选择从Emacs复制到剪贴板
  • 剪贴板-杀死区域-将选择从Emacs剪切到剪贴板
  • 剪贴板粘贴-从剪贴板粘贴到Emacs


4

这适用于M-wMac OSX上。只需添加到您的.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


1

下面的代码,通过@ RussellStewart的回答上面的启发,增加了对支持X-PRIMARY和X中学,更换region-active-puse-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)

有什么理由不覆盖标准键绑定吗?
Paul Brodersen

@Paul:“标准键绑定”用于“ emacs内部剪贴板”,与X剪贴板不同。我引用了“ emacs内部剪贴板”一词,因为emacs术语有所不同-请参见上面Chris Conway的出色解释。
user1404316 2015年

1

我用下面的基础上,在这里其他的答案,做出C-x C-wC-x C-y被复制和在Mac和Linux上粘贴(如果有人知道的版本的Windows随意添加它)。请注意,在Linux上,您将必须使用软件包管理器安装xsel和xclip。

;; Commands to interact with the clipboard

(defun osx-copy (beg end)
  (interactive "r")
  (call-process-region beg end  "pbcopy"))

(defun osx-paste ()
  (interactive)
  (if (region-active-p) (delete-region (region-beginning) (region-end)) nil)
  (call-process "pbpaste" nil t nil))

(defun linux-copy (beg end)
  (interactive "r")
  (call-process-region beg end  "xclip" nil nil nil "-selection" "c"))

(defun linux-paste ()
  (interactive)
  (if (region-active-p) (delete-region (region-beginning) (region-end)) nil)
  (call-process "xsel" nil t nil "-b"))

(cond
 ((string-equal system-type "darwin") ; Mac OS X
  (define-key global-map (kbd "C-x C-w") 'osx-copy)
  (define-key global-map (kbd "C-x C-y") 'osx-paste))
 ((string-equal system-type "gnu/linux") ; linux
  (define-key global-map (kbd "C-x C-w") 'linux-copy)
  (define-key global-map (kbd "C-x C-y") 'linux-paste)))

1
实际上,您也可以使用xclip来粘贴剪贴板内容xclip -o。这对于已经拥有xclip并不想安装其他程序来执行复制和粘贴操作的人很有用。
Amin NAIRI

0

嗯,您使用的是什么平台和哪个版本的emacs?使用Windows Vista上的GNU Emacs 22.1.1,对我来说很好用。

如果您有机会通过RealVNC查看器从Windows到Linux进行此操作,请确保首先在Linux机器上运行“ vncconfig -iconic”。


0

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

(从参考资料到kate,我认为您使用的是Linux或类似操作系统,并且可能以一种或另一种方式在X中使用emacs。)


0

您可能要指定使用的平台。是在Linux,Unix,MacOSX,Windows,MS-DOS上吗?

我相信对于Windows,它应该可以工作。对于MacOSX,它将添加到x-windows剪贴板中,这与macosx剪贴板不同。对于Linux,这取决于您的窗口管理器风格,但是我相信x-windows在大多数窗口中都可以很好地处理它。

因此,请指定。


-1

我要做的是使用内置复制功能的优质终端工具(在Windows上为PuTTY,在Linux上为Konsole或Terminal)。

在PuTTY中,用鼠标突出显示所需的文本,然后将其粘贴到其他位置。在PuTTY窗口中单击鼠标右键将粘贴Windows复制/粘贴缓冲区的内容。

在Linux上的Konsole或Terminal中,突出显示所需内容,然后按Shift + Ctrl + C进行复制,并按Shift + Ctrl + V进行粘贴。

在emacs的win32编译中,大多数情况下,拖拽文本确实会将其放置在复制/粘贴缓冲区中。

在Mac OS X上,Apple键快捷键可以正常工作,因为Terminal会捕获它们。

在命令行上没有直接的方法,因为Shell不会为每个应用程序维护复制/粘贴缓冲区。bash 确实会为其自身保留一个复制/粘贴缓冲区,并且默认情况下,emacs ^ k / ^ y快捷方式有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.