当我在 Emacs 22.1.1 中剪切(杀死)文本时(在 X 上的自己的窗口中,在 KDE 中,在 Kubuntu 上),我无法将它粘贴(拉动)到任何其他应用程序中。
13 回答
让我们在这里小心我们的定义
- 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 缓冲区一样。
将以下内容插入到您的.emacs
文件中:
(setq x-select-enable-clipboard t)
我把它放在我的 .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。
祝你好运!
在 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 是指 X 下的 Emacs(即不在终端窗口内)。
有两种方法:
- (仅适用于 unix 操作系统)用鼠标突出显示所需的文本(这会将其复制到 X 剪贴板),然后单击鼠标中键进行粘贴。
- 突出显示所需的文本,然后选择“Mx clipboard-kill-ring-save”(请注意,您可以将其绑定到更简单的键)。然后只需在您喜欢的应用程序中“编辑->粘贴”即可。
可用的剪贴板操作:
- clipboard-kill-ring-save -- 将选择从 Emacs 复制到剪贴板
- clipboard-kill-region -- 将选择从 Emacs 剪切到剪贴板
- clipboard-yank -- 从剪贴板粘贴到 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)
根据此处的其他答案,我使用以下内容在 Mac 和 Linux 上进行复制C-x C-w
和C-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)))
下面的代码受@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)
嗯,你使用的是什么平台和什么版本的 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 或终端)。
在 PuTTY 中,您可以使用鼠标突出显示所需的文本,然后将其粘贴到其他位置。在 PuTTY 窗口中单击鼠标右键将粘贴 Windows 复制/粘贴缓冲区的内容。
在 Linux 上的 Konsole 或终端中,突出显示所需内容,然后按 Shift+Ctrl+C 进行复制,按 Shift+Ctrl+V 进行粘贴。
在 emacs 的 win32 编译中,提取文本确实将其放在复制/粘贴缓冲区中.. 大多数时间。
在 Mac OS X 上,Apple 键的快捷键可以正常工作,因为终端会捕获它们。
没有直接在命令行上执行此操作的方法,因为 shell 不会为每个应用程序维护一个复制/粘贴缓冲区。bash确实为自己维护了一个复制/粘贴缓冲区,并且默认情况下,emacs ^k/^y 快捷方式有效。