Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用 OSC52 实现 wezterm 远程拷贝 #85

Open
hanxi opened this issue Nov 11, 2022 · 2 comments
Open

使用 OSC52 实现 wezterm 远程拷贝 #85

hanxi opened this issue Nov 11, 2022 · 2 comments

Comments

@hanxi
Copy link
Owner

hanxi commented Nov 11, 2022

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

参考

@doodleEsc
Copy link

neovim可以使用一个二进制的provider来提供复制粘贴的功能,同样tmux也可以通过这个provider来进行复制粘贴,这样就可以通过这个provider来打通所有的粘贴板,可以看一下这个provider,https://github.com/doodleEsc/doodleVim/blob/master/bin/clipboard-provider

@hanxi
Copy link
Owner Author

hanxi commented Jun 28, 2023

neovim可以使用一个二进制的provider来提供复制粘贴的功能,同样tmux也可以通过这个provider来进行复制粘贴,这样就可以通过这个provider来打通所有的粘贴板,可以看一下这个provider,https://github.com/doodleEsc/doodleVim/blob/master/bin/clipboard-provider

看上去很不错,有空我也换上。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants