emacs终端模式:如何高效复制和粘贴
我很难让这个emacs-nw在终端模式(emacs-nw)下有效工作。 一些设置信息: 工作服务器通过SSH连接,并且emacs正在服务器上运行。通常我使用SSH和“emacs-nw”连接来处理我的文件 emacs配置从以下位置获取: 理由是:emacs终端模式:如何高效复制和粘贴,emacs,copy-paste,Emacs,Copy Paste,我很难让这个emacs-nw在终端模式(emacs-nw)下有效工作。 一些设置信息: 工作服务器通过SSH连接,并且emacs正在服务器上运行。通常我使用SSH和“emacs-nw”连接来处理我的文件 emacs配置从以下位置获取: 理由是: (require 'mouse) (xterm-mouse-mode t) (defun track-mouse (e)) (setq mouse-sel-mode t) 是在文本上启用鼠标选择,使文本区域高亮显示,就像标记区域的“C-x S
(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相关的任何操作都非常慢之外,所有操作看起来都非常完美!我与远程服务器的连接很顺畅——延迟通常在100ms以下。但是使用“C-xk”删除一行文本需要约5秒!要粘贴它,还需要5秒钟
当复制/粘贴有时很频繁时,这就变得很烦人了。我认为这与X服务器消息有关,但不确定是否有好的方法来修复此问题
有什么想法吗?
谢谢 这本身不是一个理想的解决方案,但我找到了一种比前一种更好的方法 这样做的目的是消除导致严重延迟问题的X,即只保留以下内容:
;; enable clipboard in emacs
(setq x-select-enable-clipboard t)
结果是:
仍然期待着一个好的解决方案!您可以通过使用终端转义码来实现这一点! 有一类独特的终端转义代码称为“操作系统控制”(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时,它会将我的kill ring中的值猛拉到系统剪贴板中:
(卸载并拖动到剪贴板()
“使用ANSI OSC 52转义序列尝试剪贴板复制”
(互动)
(向终端发送字符串)
(格式“\033]52;c;%s\a”
(base64编码字符串
(对编码字符串进行编码)
(子字符串没有属性
(第n个压井环)‘utf-8)t))
当我键入此内容时,我偶然发现了Chromium社区支持的一个几乎相同的脚本:
对于在Tmux内部运行Emacs的用户:
Tmux使用该序列,因此您需要将该序列通过管道传输到Tmux活动tty以使其正常工作。我在这里的博客文章中提供了一个解决方案:要扩展@justinokamoto的答案以在Tmux中使用,它工作得很好,真是令人惊讶。我没有使用tramp或其他奇特的emacs设置对其进行调试,而是为了使其正常工作
tmux.conf
和~/bin/yank
(定义关键邪恶视觉状态图“Y”'jonah terminal yank)
因此,正常的“y”表示在视觉模式下的正常拖动,但“y”表示跨剪贴板拖动您尝试过在本地运行emacs并使用tramp模式吗?这是我的第一次尝试——每次保存编辑时,它都与远程服务器上的文件同步,这并不顺利。另外,我不喜欢经常启动emacs(本地机器是笔记本)。出于好奇,(setq程序间粘贴…)行没有运行,您有问题吗?我必须手动运行它们。
$ printf "\033]52;c;$(printf "Hello, world" | base64)\a"
(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"))
)