我很难让这个emacs -nw在终端模式下有效工作(emacs -nw)。 一些设置信息: 工作服务器通过SSH连接,emacs正在服务器上运行。通常我使用SSH连接和“emacs -nw”来处理我的文件。
emacs配置来自:https://hugoheden.wordpress.com/2009/03/08/copypaste-with-emacs-in-terminal/
;; make mouse selection to be emacs region marking
(require 'mouse)
(xterm-mouse-mode t)
(defun track-mouse (e))
(setq mouse-sel-mode t)
;; enable clipboard in emacs
(setq x-select-enable-clipboard t)
;; enable copy/paste between emacs and other apps (terminal version of emacs)
(unless window-system
(when (getenv "DISPLAY")
;; Callback for when user cuts
(defun xsel-cut-function (text &optional push)
;; Insert text to temp-buffer, and "send" content to xsel stdin
(with-temp-buffer
(insert text)
;; I prefer using the "clipboard" selection (the one the
;; typically is used by c-c/c-v) before the primary selection
;; (that uses mouse-select/middle-button-click)
(call-process-region (point-min) (point-max) "xsel" nil 0 nil "--clipboard" "--input")))
;; Call back for when user pastes
(defun xsel-paste-function()
;; Find out what is current selection by xsel. If it is different
;; from the top of the kill-ring (car kill-ring), then return
;; it. Else, nil is returned, so whatever is in the top of the
;; kill-ring will be used.
(let ((xsel-output (shell-command-to-string "xsel --clipboard --output")))
(unless (string= (car kill-ring) xsel-output)
xsel-output )))
;; Attach callbacks to hooks
(setq interprogram-cut-function 'xsel-cut-function)
(setq interprogram-paste-function 'xsel-paste-function)
;; Idea from
;; http://shreevatsa.wordpress.com/2006/10/22/emacs-copypaste-and-x/
;; http://www.mail-archive.com/help-gnu-emacs@gnu.org/msg03577.html
))
有理由:
(require 'mouse)
(xterm-mouse-mode t)
(defun track-mouse (e))
(setq mouse-sel-mode t)
是在文本上启用鼠标选择,使文本区域突出显示为标记区域的“C-x SPC”。然后我可以使用“M-x w”复制和“C-x y”在emacs中以及emacs和其他应用之间粘贴文本。
除了与X相关的任何操作真的很慢之外,一切看起来都很完美!我与远程服务器的连接很顺利 - 延迟通常低于100毫秒。但要使用“C-x k”杀死一行文本,需要约5秒钟!粘贴它需要5秒钟!
有时复制/粘贴频繁,这变得非常烦人。我认为这与X服务器消息传递有关,但不确定是否有好的方法来解决这个问题。
有什么想法吗? 谢谢!
答案 0 :(得分:4)
这本身并不是一个理想的解决方案,但我想出了一种比上一种感觉更好的方法。
我们的想法是摆脱导致严重延迟问题的X,即只保留以下内容:
;; enable clipboard in emacs
(setq x-select-enable-clipboard t)
结果是:
在Emacs中复制/粘贴非常简单快捷。
从其他应用程序复制到Emacs:Ctrl + Shift + v
从Emacs复制到其他应用程序:鼠标选择现在在X Selection上,因此右键单击并复制将文本复制到Selection中。请注意' M-w"现在不会将任何内容复制到选择或系统剪贴板中。
这又是一个妥协而不是解决方案,但考虑到我比应用程序间操作更频繁地复制/粘贴这一事实,目前这是可以接受的。
仍然期待一个好的解决方案!
答案 1 :(得分:1)
您可以使用终端转义码来完成此操作!
有一类独特的终端转义码称为“操作系统控制”(OSC),其中一个序列 (\033]52
) 用于与系统剪贴板进行交互。很棒的是,您的终端并不关心代码来自哪里,因此它也可以在远程会话中工作。
大多数终端模拟器都支持它(iTerm2、OS X 终端,我认为除了 GNOME 之外的所有 Linux 终端)。您可以通过简单地运行来测试您的终端是否支持此序列:
$ printf "\033]52;c;$(printf "Hello, world" | base64)\a"
然后从系统剪贴板粘贴。如果它粘贴“Hello, world”,那么你的终端支持它!
我的 init.el
中有这个函数,所以当我调用 yank-to-clipboard
时,Emacs 会将值从我的终止环中提取到系统剪贴板中:
(defun yank-to-clipboard ()
"Use ANSI OSC 52 escape sequence to attempt clipboard copy"
(interactive)
(send-string-to-terminal
(format "\033]52;c;%s\a"
(base64-encode-string
(encode-coding-string
(substring-no-properties
(nth 0 kill-ring)) 'utf-8) t))))
当我输入这个时,我偶然发现了一个由 Chromium 社区支持的几乎完全相同的脚本:https://chromium.googlesource.com/apps/libapps/+/master/hterm/etc/osc52.el
对于那些在内部 Tmux 运行 Emacs 的人: Tmux 使用序列,因此您需要将序列通过管道传输到 Tmux 活动 tty 以使其工作。我的博客文章中有一个解决方案:https://justinchips.medium.com/have-vim-emacs-tmux-use-system-clipboard-4c9d901eef40
答案 2 :(得分:0)
为了在 tmux 中使用 @justinokamoto 的答案进行扩展,它工作得很好,真的很棒。我还没有调试它,例如流浪汉或其他花哨的 emacs 设置,但要让它工作
tmux.conf
和 ~/bin/yank
然后要进入 emacs,您可以使用如下函数:
(注意空客,我对 elisp 很陌生。这会写入 /tmp/yank 中的临时文件)
(defun custom-terminal-yank (&rest args)
(message "-> CLIP")
;; FOR EVIL MODE: UNCOMMENT SO FIRST YANKS TO KILL RING
;; need to yank first, with all those args
;; ;; https://emacs.stackexchange.com/questions/19215/how-to-write-a-transparent-pass-through-function-wrapper
;; (interactive (advice-eval-interactive-spec
;; (cadr (interactive-form #'evil-yank))))
;; (apply #'evil-yank args)
;; https://stackoverflow.com/questions/27764059/emacs-terminal-mode-how-to-copy-and-paste-efficiently
;; https://sunaku.github.io/tmux-yank-osc52.html
(f-write-text (nth 0 kill-ring) 'utf-8 "/tmp/yank")
(send-string-to-terminal (shell-command-to-string "~/bin/yank /tmp/yank"))
)
如果其他人也使用邪恶模式(只是为了使事情复杂化),您可以取消注释这些行并使用类似
(define-key evil-visual-state-map "Y" 'jonah-terminal-yank)
所以正常的“y”用于视觉模式下的正常猛拉,而“Y”用于跨剪贴板猛拉