如何将文本从 Emacs 复制到 Linux 上的另一个应用程序
-
09-06-2019 - |
题
当我在 Emacs 22.1.1 中剪切(删除)文本(在 X、KDE 和 Kubuntu 上其自己的窗口中)时,我无法将其粘贴(猛拉)到任何其他应用程序中。
解决方案 2
将以下内容插入到您的 .emacs
文件:
(setq x-select-enable-clipboard t)
其他提示
让我们小心这里的定义
- 一个 Emacs 副本 是命令
kill-ring-save
(通常绑定到 分子量). - A 系统副本 是你通常通过按下得到的 C-c (或在应用程序窗口中选择“编辑->复制”)。
- 一个 X副本 是用鼠标光标“物理”突出显示文本。
- 一个 Emacs粘贴 是命令
yank
(通常绑定到 y). - A 系统粘贴 是你通常通过按下得到的 简历 (或在应用程序窗口中选择“编辑-粘贴”)。
- 一个 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 缓冲区中完全相同。
在 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)
我将其粘贴在我的 .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。
祝你好运!
我假设 emacs 指的是 X 下的 Emacs(即不在终端窗口内)。
有两种方法:
- (仅适用于Unix OS),用鼠标(将其复制到X剪贴板)突出显示所需的文本,然后单击以粘贴。
- 突出显示所需的文本,然后突出显示“ MX剪贴板 - 杀手 - 单元”(请注意,您可以将其绑定到更简单的键)。然后只需在您喜欢的应用中“编辑 - >粘贴”即可。
可用的剪贴板操作:
- 剪贴板 - 杀伤环 - 副本 - 从emacs到剪贴板的复制选择
- 剪贴板 - 杀伤区 - 从emacs到剪贴板切割选择
- 剪贴板 - 粘贴 - 从剪贴板到emacs
有 EmacsWiki 文章 这解释了 X 下复制和粘贴的一些问题以及如何配置它来工作。
这适用于 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)
下面的代码受到 @RussellStewart 上面答案的启发,添加了对 x-PRIMARY 和 x-SECONDARY 的支持,替换 region-active-p
和 use-region-p
覆盖空区域的情况,如果尚未安装 xsel,则不会静默返回(返回错误消息),并且包含“剪切”功能(emacs C-y、windows C-x)。
(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)
嗯,您使用的 emacs 是什么平台和版本?对于 Windows Vista 上的 GNU Emacs 22.1.1,它对我来说工作得很好。
如果万一您通过 RealVNC 查看器从 Windows 到 Linux 执行此操作,请确保您首先在 Linux 机器上运行“vncconfig -iconic”......
我总是使用快速粘贴——在 emacs 中拖动选择,在目标窗口中点击鼠标中键。
(根据 kate 的参考,我认为您使用的是 linux 或类似系统,并且可能以某种方式在 X 中使用 emacs。)
您可能想要指定您正在使用的平台。是在 linux、unix、macosx、windows、ms-dos 上吗?
我相信对于 Windows 来说它应该有效。对于 MacOSX,它将被添加到 x-windows 剪贴板,这与 macosx 剪贴板不同。对于 Linux,这取决于您的窗口管理器风格,但我相信 x-windows 在大多数窗口管理器上都可以很好地处理它。
所以,请具体说明。
我所做的是使用一个好的终端工具(Windows 上的 PuTTY,Linux 上的 Konsole 或 Terminal),它内置了复制功能。
在 PuTTY 中,您可以使用鼠标突出显示所需的文本,然后将其粘贴到其他位置。在 PuTTY 窗口中右键单击可粘贴 Windows 复制/粘贴缓冲区的内容。
在 Linux 上的 Konsole 或终端中,突出显示所需内容,然后按 Shift+Ctrl+C 进行复制,按 Shift+Ctrl+V 进行粘贴。
在 emacs 的 win32 编译中,拉出文本确实会将其放在复制/粘贴缓冲区中..大多数时候。
在 Mac OS X 上,Apple 键快捷键可以正常工作,因为终端会捕获它们。
没有直接的方法在命令行上执行此操作,因为 shell 不为每个应用程序维护复制/粘贴缓冲区。巴什 做 为自己维护一个复制/粘贴缓冲区,并且默认情况下,emacs ^k/^y 快捷键可以工作。