ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我建议您阅读以下内容:CopyAndPaste-Emacs Wiki。这很好地解释了旅游问题。

T
Trey Jackson

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

Emacs 副本是命令 kill-ring-save(通常绑定到 Mw)。

系统副本是您通常通过按抄送(或在应用程序窗口中选择“编辑->复制”)获得的。

X 副本是用鼠标光标“物理地”突出显示文本。

Emacs 粘贴是命令 yank(通常绑定到 Cy)。

系统粘贴通常是通过按 Cv(或在应用程序窗口中选择“编辑粘贴”)获得的。

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


This is confusing terminology。您所谓的“X 复制/粘贴”的标准且不那么容易混淆的名称是 X 主要选择。你所说的“系统复制/粘贴”就是 X 剪贴板。
谢谢...看起来变量自编写以来已重命名。 META-X set-variable RET select-enable-clipboard RET t(setq select-enable-clipboard t)
T
Trey Jackson

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

(setq x-select-enable-clipboard t)

不啰嗦,告诉你你需要知道的。优秀的答案。
完美运行,我使用 Ubuntu 12.04。谢谢
很好很简单,但这在终端中不起作用。没有理由为什么相同的快捷方式在终端和免费窗口中都不能工作,下面的一些答案同时解决了这两个问题。
当我运行 emacs -nw 时,我使用终端自己的快捷方式; Shift-Ctrl-X 剪切(杀死)文本,Shift-Ctrl-C 复制。
当您在水平拆分的 tmux 窗口中运行 emacs -nw 时,这是行不通的。
t
tshepang

在 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(文本和可选推送)”。这对我有用:D
它可以工作,但是粘贴操作很慢,可以将其连接到网络吗?
非常感谢,它对我来说就像一个魅力,在 Ubuntu 20.04 上在终端中使用 DoomEmacs(尽管没有 X 支持)。
N
Nizam Mohamed

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

祝你好运!


此解决方案适用于 X Window 中的 emacs,即如果您在命令行中运行 emacs,则 emacs 正在窗口内运行,您需要的是:stackoverflow.com/questions/5288213/…
Symbol’s function definition is void: x-cut-buffer-or-selection-value
p
pdq

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

有两种方法:

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

可用的剪贴板操作:

clipboard-kill-ring-save -- 将选择从 Emacs 复制到剪贴板

clipboard-kill-region -- 将选择从 Emacs 剪切到剪贴板

clipboard-yank -- 从剪贴板粘贴到 Emacs


t
tshepang

an EmacsWiki article 解释了 copy & 的一些问题。在 X 下粘贴以及如何将其配置为工作。


有一个 emacs wiki 条目可以复制和粘贴。那是多么糟糕。
c
cevaris

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


啊,我明白了,它还使用 this interprogram-cut-function 内置功能,旨在解决这个问题。
a
asmeurer

根据此处的其他答案,我使用以下内容在 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)))

实际上,您也可以使用 xclip 粘贴剪贴板内容,也可以使用 xclip -o。这对于已经拥有 xclip 并且不想安装另一个程序来进行复制和粘贴的人很有用。
请注意,这会覆盖 write-file (Cx Cw) 的默认键绑定。
u
user1404316

下面的代码受@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)

是否有任何理由不覆盖标准键绑定?
@Paul:“标准键绑定”用于“emacs 内部剪贴板”,与 X 剪贴板不同。我引用了术语“emacs 内部剪贴板”,因为 emacs 术语不同 - 请参阅上面 Chris Conway 的出色解释。
k
kfh

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

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


c
cannam

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

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


M
Mats Fredriksson

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

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

所以,请具体说明。


w
warren

我所做的是使用一个内置复制工具的好的终端工具(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 快捷方式有效。