文章

支持 Clipboard 的 Vim

以 CentOS 系统为例,安装支持 Clipboard 的 vim-X11

vim-X11 使用

安装 vim-X11

yum install vim-X11

验证是否支持 Clipboard

# vimx --version | grep clipboard
+clipboard         +jumplist          +popupwin          +user_commands
+ex_extra          -mouse_jsbterm     -sun_workshop      +xterm_clipboard

可知,vim-X11 的命令程序名是 vimx,如何使用通常的 vim 命令操作呢?可以使用别名或软链接解决。

使用别名

将别名添加到 shell 的配置文件中,使其永久生效。

echo "alias vim='vimx'" >> /etc/profile

然后,运行以下命令使其更改立即生效:

source /etc/profile

创建软链接

或者通过软链接来替换系统中的 vim 命令:

ln -sf /usr/bin/vimx /usr/bin/vim

这将 vim 命令永久指向 vimx

同步剪切板和匿名寄存器

Vim 有多个寄存器,ydp 等命令一般使用匿名寄存器 "";支持剪切板的额外选区寄存器有 "*"+

在 X11 系统中(绝大多数带有桌面环境的 Linux 发行版),二者是有区别的:

  • "* 指 X11 中的 PRIMARY 选区,即鼠标选中区域。在桌面系统中可按鼠标中键粘贴。
  • "+ 指 X11 中的 Clipboard 选区,即系统剪切板。在桌面系统中可按 Ctrl+V 粘贴。

为了操作方便,复制内容不用指定寄存器(避免输入 "*"+ ),将剪切板寄存器和匿名寄存器保持同步(即共享剪切板),可以在 /etc/vimrc 中配置。

set clipboard=unnamed
  • 在 Windows 和 macOS 上,使 Vim 的主选区寄存器和匿名寄存器共享,即在 Vim 中复制的内容可以粘贴到其他应用程序中。
  • 在 Linux 上,它主要与 X11 剪贴板(主选区)和鼠标中键(触发粘贴)相关联。
set clipboard=unnamedplus
  • 在 Windows 和 macOS 上,使 Vim 的系统剪切板寄存器 + 和匿名寄存器 "" 共享,即在 Vim 中复制的内容可以粘贴到其他应用程序中。
  • 在 Linux 上,它主要与桌面系统的剪切板(例如 GNOME 的系统剪切板)相关联,支持通过 Ctrl+V 粘贴。

不支持 Clipboard 的场景

Linux 系统本身没有 Clipboard 的概念,Clipboard 只有图形界面才有,而图形界面的 GUI 程序并非 Linux 系统的必要部分。一般命令行界面的主机系统没有 Clipboard。所以,当访问没有桌面环境的 Linux 主机,是没办法直接访问 Clipboard 将内容复制到剪切板上。

可以通过 tmux 工具 或 TCP 通信 或 X11 转发,实现将远程主机内容用命令操作复制出来。

如通过启用 X11 Forwarding, 配置 SSH 客户端,方便在无 GUI 的远程服务器上(X Client)运行并通过 X 协议在本地主机(X Server)显示 GUI 应用,并实现复制粘贴功能。以下是设置步骤:

配置本地 X Server

在 Windows 上 安装和配置 X Server (以 VcXsrv 为例)。

  • VcXsrv 是常用的 X server 工具,安装并启动进入配置向导。
  • 选择 “Multiple windows”(或 “Fullscreen”,取决于你的需求),点击 “Next”
  • “Display settings” 页面,保持默认设置(通常 Display number0),点击 “Next”
  • “Extra settings” 页面,选中 “Disable access control”(允许任何主机连接),点击 “Next”
  • 点击 “Finish” 启动 X Server。

配置 SSH 客户端(以 Xshell 为例)

在 Xshell 中启用 X11 转发功能。

  • 打开 Xshell 并连接到远程主机。
  • 在 Xshell 的连接会话中,选择你要配置的会话。
  • 点击 “属性”,进入会话属性窗口。
  • 在左侧的 “SSH” 的隧道部分,找到 “X11 转发” 选项。
  • 勾选 “启用 X11 转发” 选项。
  • 选择 “X DISPLAY”,并确保你选择的是本地 X server(如 Xming 或 VcXsrv)。
  • 确保 “X DISPLAY” 地址正确,一般可以使用默认设置。
  • 保存并连接。

配置远程主机(无 GUI 的服务器)

确保远程主机上的 SSH 服务允许 X11 Forwarding 转发。在远程主机上编辑 /etc/ssh/sshd_config 文件,确认以下设置:

X11Forwarding yes
X11DisplayOffset 10

保存更改并重启 SSH 服务,例如使用 sudo systemctl restart sshd

安装 X11 相关组件

针对 CentOS Steam 9 系统的安装:

yum install xorg-x11-server-Xorg xorg-x11-xauth xorg-x11-utils
  • xorg-x11-server-Xorg: X Window System 的服务器端实现,用于处理显示和输入。
  • xorg-x11-xauth: X11 认证工具,用于生成和管理 X11 认证文件。

安装 X11 应用程序(测试验证):

yum install xterm

运行 X11 应用程序

确认 DISPLAY 环境变量:

通常,在远程主机上 X11 转发会自动设置,可以手动检查。终端输入 echo $DISPLAY ,返回类似 localhost:10.0

远程主机终端输入 xterm,验证本地 X Server 会启动 xterm 程序。

验证 vim-X11 粘贴操作

在远程主机终端用 vim 打开要编辑的文件并复制内容,在本机计算机上使用 Ctrl + V 或右键点击选择粘贴来将剪贴板内容粘贴到本地应用程序中。

参考

Vim 使用系统剪切板

远程主机与本地共享 clipboard

问题

问题1:vim-X11 编辑文件复制粘贴并未生效,查看 vim --version 有警告信息:

WARNING! The remote SSH server rejected X11 forwarding request.

分析解决:命令行模式的远程主机没有 Clipboard,没法直接命令操作复制内容到剪切板,需要借助 X11 Forwarding 实现内容转发复制。

本文由作者按照 CC BY 4.0 进行授权。