使用 OSC52 实现 wezterm 远程拷贝

OSC 52 是 ANSI escape code 中的 ESC ] (Operating System Command) 中的52, 它提供了访问访问本地剪贴板的能力。

在没有了解到 OSC52 之前,我使用过 lemonade-command/lemonade 来作为远程粘贴板工具,后面自己也折腾了一个 oclip 。其实我想要的效果很简单,在远程 SSH 的终端里的 Vim 里拷贝某段字符串时,能在本地粘贴。当然使用鼠标选中拷贝是可以实现,但是对于键盘党当然是不想这效果的,在 Vim 里从 yy 命令拷贝一行很快为啥还要用鼠标呢。直到遇到 OSC52 ,超级简单的实现了我想要的效果。

原理就不多说了,参考链接里都有说明,感兴趣的可以去看看。

首先需要选用 SSH 终端工具支持 OSC 52 这个功能,我选用的 wezterm 是支持的。然后就是对远程的 neovim 和 tmux 进行配置了。

配置 neovim

我的 neovim 配置: hanxi/nvim-config , 安装插件 ojroques/vim-oscyank ,如果是使用 [packer] 来管理插件的话,使用下面的命令加入插件。

use({
      "ojroques/vim-oscyank",
      config = [[require("plugins.oscyank")]],
    })

插件的配置我放到 plugins/oscyank.lua 文件了,内容如下:

local function copy(lines, _)
  vim.fn.OSCYankString(table.concat(lines, "\n"))
end

local function paste()
  return {
    vim.fn.split(vim.fn.getreg(''), '\n'),
    vim.fn.getregtype('')
  }
end

vim.g.clipboard = {
  name = "osc52",
  copy = {
    ["+"] = copy,
    ["*"] = copy
  },
  paste = {
    ["+"] = paste,
    ["*"] = paste
  }
}

vim.g.oscyank_term = 'default'
vim.cmd [[
set clipboard+=unnamedplus
]]

这样配置后的效果就是,在 neovim 里使用 y 命令拷贝字符串的时候,字符串会进到本地系统的粘贴板。这个 issues/24 里也有讨论,说这个解决办法并不是非常完美的,比如在 neovim 里粘贴只能使用 Ctrl + Shift + v 来实现,对我来说这也足够了,至少不用使用鼠标选择复制了。

配置 tmux

tmux 配置就更简单了,它是原生就支持 OSC52 的,官方也有详细的文档: tmux配置粘贴板

只需要一行配置开启粘贴板就行:

set -s set-clipboard on

当然,对于 Vim 党来说,设置 Vi 键位来选择和粘贴也是需要的:

# 复制模式中的键盘布局
setw -g mode-keys vi
bind-key -T copy-mode-vi v send-keys -X begin-selection
set -s set-clipboard on
bind-key -T copy-mode-vi y send -X copy-selection-and-cancel

我的 dotfiles

如果你想体验一下效果,可以试试我的 dotfiles:

https://github.com/hanxi/dotfiles

在 Ubuntu22.04 系统上只要一行命令就能部署:

curl https://raw.githubusercontent.com/hanxi/dotfiles/master/bootstrap.sh | bash

参考

点击进入评论 ...