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

我很难让这个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 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)
结果是:

  • Emacs中的复制/粘贴简单且快速

  • 从其他应用复制到Emacs:Ctrl+Shift+v

  • 从Emacs复制到其他应用程序:鼠标选择现在是X选择,所以右键单击并复制将把文本复制到选择中。请注意,“M-w”现在不会将任何内容复制到所选内容或系统剪贴板中

  • 这也是一种折衷方案,而不是解决方案,但考虑到我复制/粘贴的频率高于应用程序间操作的频率,目前这是可以接受的


    仍然期待着一个好的解决方案!

    您可以通过使用终端转义码来实现这一点! 有一类独特的终端转义代码称为“操作系统控制”(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
  • 确保在终端上启用了对剪贴板的终端访问
  • 然后,要进入emacs,您可以使用如下函数:

    (注意,emptor,我对elisp非常陌生。这会写入/tmp/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"))
      )