124

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

4

13 回答 13

133

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

  • 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 缓冲区一样。

于 2008-09-15T18:34:52.643 回答
103

将以下内容插入到您的.emacs文件中:

(setq x-select-enable-clipboard t)
于 2008-09-15T16:43:40.193 回答
12

我把它放在我的 .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。

祝你好运!

于 2008-09-16T05:47:56.893 回答
12

在 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)
于 2013-10-27T23:40:41.237 回答
8

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

有两种方法:

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

可用的剪贴板操作:

  • clipboard-kill-ring-save -- 将选择从 Emacs 复制到剪贴板
  • clipboard-kill-region -- 将选择从 Emacs 剪切到剪贴板
  • clipboard-yank -- 从剪贴板粘贴到 Emacs
于 2008-09-15T16:32:33.873 回答
7

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

于 2008-09-15T16:29:22.630 回答
5

这适用M-w于 Mac 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

于 2015-03-06T16:05:39.213 回答
2

根据此处的其他答案,我使用以下内容在 Mac 和 Linux 上进行复制C-x C-wC-x C-y粘贴(如果有人知道 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)))
于 2019-06-13T19:09:34.380 回答
1

下面的代码受@RussellStewart 上面的回答启发,添加了对 x-PRIMARY 和 x-SECONDARY 的支持,替换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)
于 2017-07-31T13:27:16.937 回答
0

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

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

于 2008-09-15T16:25:55.683 回答
0

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

(从对 kate 的引用中,我认为您使用的是 linux 或类似的设备,并且可能以一种或另一种方式在 X 中使用 emacs。)

于 2008-09-15T16:26:49.300 回答
0

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

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

所以,请具体说明。

于 2008-09-15T16:27:11.390 回答
-2

我所做的是使用一个内置复制工具的好的终端工具(Windows 上的 PuTTY、Linux 上的 Konsole 或终端)。

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

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

在 emacs 的 win32 编译中,提取文本确实将其放在复制/粘贴缓冲区中.. 大多数时间。

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

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

于 2008-09-15T16:26:16.710 回答