r03*_*r03 5 ssh clipboard tmux neovim
我在这里找到了一个类似的问题,但没有一个可行的答案: System Clipboard Vim inside TMUX inside SSH session
我正在使用 Gnome 终端启动 ssh 会话,并将 X 转发到 Debian 10。如果我启动 neovim 并复制(复制)文本,则该文本将被复制到 Gnome 剪贴板,一切正常。
这是 .ssh/config 的内容:
Host nuc
ForwardX11 yes
Run Code Online (Sandbox Code Playgroud)
我在 .vimrc 中有这个:
set clipboard^=unnamed,unnamedplus
Run Code Online (Sandbox Code Playgroud)
但是当我在 tmux 中启动 neovim 时,这不起作用。
我有 tmux 和 tmux-yank 插件,这很有效,因为当我从 tmux 内的 neovim 复制然后退出 tmux 时,我可以看到所选文本xsel -o
如何将选择转发到我的系统剪贴板?
Vim 和 NeoVim 对剪贴板的支持使用到 X11 服务器的连接。要连接的地址可从$DISPLAY
环境变量中获取。
X11 和终端多路复用器或会话管理器(例如 tmux 或 screen)的问题在于,shell 和在其中运行的程序的环境将是首次创建 tmux 会话时的环境。这包括$DISPLAY
变量。因此,这意味着 tmux 内的 vim 将尝试使用创建 tmux 会话时的 X11 服务器地址,而不是您现在刚刚连接的地址。
一个肮脏但简单的解决方法是在重新连接到 tmux 时更新$DISPLAY
变量,以确保您将连接到正确的 X11 服务器。请注意,您需要对 tmux 内运行的每个shell 或程序执行此操作,因为每个 shell 或程序都有自己的环境变量的不同步副本。
类似于以下内容的作品:
$ ssh -X nuc
nuc$ echo $DISPLAY
:1234.1
nuc$ tmux attach
tmux$ export DISPLAY=:1234.1
tmux$ vim
Run Code Online (Sandbox Code Playgroud)
这应该使剪贴板适用于该特定的 Vim。
如前所述,如果您有许多 tmux 窗口和窗格,则必须更新$DISPLAY
所有这些窗口和窗格。另外,如果您创建新的窗口或窗格,它们也会以错误的设置开始(尽管您也可以更新tmux 环境中$DISPLAY
的值来修复新的窗口和窗格,请参阅 tmux 的命令。)$DISPLAY
set-environment