Yank 到系统:neovim inside tmux inside ssh

Yank to system: neovim inside tmux inside ssh

我在这里发现了一个类似的问题,但没有适合我的答案:

我正在使用 Gnome 终端启动 ssh 会话,并将 X 转发到 Debian 10。 如果我启动 neovim 并复制(抽出)文本,那么该文本将被复制到 Gnome 剪贴板,一切都很好。

这是.ssh/config的内容:

Host nuc
    ForwardX11 yes

我在 .vimrc 中有这个:

set clipboard^=unnamed,unnamedplus

但是当我在 tmux 中启动 neovim 时,这不起作用。
我有 tmux 和 tmux-yank 插件,这是有效的,因为当我从 tmux 中的 neovim 复制然后退出 tmux 时,我可以看到带有 xsel -o

的选定文本

如何将所选内容转发到我的系统剪贴板?

Vim 和 NeoVim 支持剪贴板使用到 X11 服务器的连接。要连接的地址可从 $DISPLAY 环境变量中获得。

X11 和终端多路复用器或会话管理器(如 tmux 或屏幕)的问题在于,shells 和其中的程序 运行 的环境将是 tmux 会话时的环境首次创建。这包括 $DISPLAY 变量。因此,这意味着 tmux 内部的 vim 将尝试使用创建 tmux 会话时的 X11 服务器地址,而不是您现在刚刚连接的地址。

一个肮脏但简单的解决方法是在您重新连接到 tmux 时更新 $DISPLAY 变量,以确保您将连接到正确的 X11 服务器。请注意,您需要为 tmux 中的 every shell 或程序 运行 执行此操作,因为它们中的每一个都会有自己的不同步副本环境变量。

类似下面的作品:

$ ssh -X nuc
nuc$ echo $DISPLAY
:1234.1
nuc$ tmux attach
tmux$ export DISPLAY=:1234.1
tmux$ vim

这应该使剪贴板工作 对于那个特定的 Vim

如前所述,如果您有许多 tmux windows 和窗格,则必须更新所有这些 $DISPLAY。此外,如果您创建新的 windows 或窗格,它们也会以错误的 $DISPLAY 设置开始(尽管您也可以在 tmux 的环境中更新 $DISPLAY 的值以修复新的 windows 和窗格,请参阅 tmux 的 set-environment 命令。)