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