ssh下通过osc52使用nvim剪切板
本文旨于记录作者利用
lazy.nvim
插件管理器安装ojroques/nvim-osc52
到neovim的过程
参考:
https://github.com/ojroques/vim-oscyank
https://github.com/ojroques/nvim-osc52
https://www.reddit.com/r/vim/comments/k1ydpn/a_guide_on_how_to_copy_text_from_anywhere/
没想到围绕一个剪切板转发能记录这么多次….
之前的做法是透过x11转发xclip剪切板到本地x服务器,这种做法我认为不太好。除了有潜在的安全问题 外,还有一个就是为了个剪切板搬来整个x11。无论怎么说都不是个优雅的方案ojroques/vim-oscyank
和ojroques/nvim-osc52
分别是vim和neovim下的插件,目的是在vim和neovim下实现osc52转义序列以将文本从终端复制到系统剪切板
osc52是ansi下的转义序列,可以实现将文本从终端复制到系统剪切板而不考虑其他东西,详见A guide on how to copy text from anywhere, including through SSH, with OSC52
neovim 10.0版本 官方支持osc52了
UPDATE 2024.5.28:
插件还没用上一个星期就用上10.0了…….
先决条件
1、终端支持osc52
2、使用neovim
笔者配置:
实践
1-配置终端
笔者使用的终端是suckless的st
,但是并非默认开启osc52功能,需要修改源码重新编译以开启功能 。对于其他终端,vim-oscyank的作者给了一份表以参考
Terminal | OSC52 support |
---|---|
alacritty | yes |
contour | yes |
far2l | yes |
foot | yes |
gnome terminal (and other VTE-based terminals) | not yet |
hterm | yes |
iterm2 | yes |
kitty | yes |
konsole | not yet |
qterminal | not yet |
rxvt | yes |
st | yes (but needs to be enabled, see here) |
terminal.app | no, but see workaround |
tmux | yes |
urxvt | yes (with a script, see here) |
wezterm | yes |
windows terminal | yes |
xterm.js (Hyper terminal) | not yet |
zellij | yes |
hexo的表格…晚点研究一下
照着各家终端配置完测试功能:
1 | echo -ne "\033]52;c;$(echo -n hello | base64)\a" |
复制以下命令到终端并执行,检查粘贴结果是否为hello,否则步骤未完成
2-配置lazy.nvim
lazy.nvim
是neovim的插件管理器,并非那个vim发行版,注意分别
安装很简单,只需要在nvim的配置文件~/.config/nvim/init.lua
或~/.config/nvim/init.vim
加上那么一段代码就能完成安装并配置(前提是有可用的网络):
1 | local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" |
当然也能提前把这个仓库克隆到对应路径或者使用包管理例如AUR相关的工具安装到相应路径,这个路径得翻翻XDG定义和neovim的文档
重新打开nvim后等待一会,弹出正常界面:checkhealth lazy
即可验证插件工作情况
3-安装插件
安装插件这一步可以非常简单,前提是科学上网,比如说lazy.nvim仓库md的例子。编辑上一节配置文件的最后一行:
1 | require("lazy").setup({ |
自动安装插件过程:
手动安装当然也可以,只要nvim能找到对应位置,并且按照插件手册写好在配置文件中写好该插件的配置;下面演示手动安装
以nvim-osc52 为例,这是仓库的目录结构:
1 | ➜ nvim-osc52 git:(main) tree . |
很明显,这里面的文件能全部直接放进~/.config/nvim/
这个目录(当然许可证、md、git文件可以忽略),这样nvim就知道这里有插件了
这种做法自己瞎折腾的,直接把插件当作模块,详见
:h lua-guide-modules
使用
:h packadd
参考官方手册受动安装插件正解
但是这样似乎就把lazy.nvim晾在一边了,所以可以在刚刚写好的nvim配置文件中添加一行:
1 | require("lazy").setup({ |
然后把整个插件仓库放在刚刚指明的插件目录的位置中即可识别:
1 | ➜ nvim tree . |
之后执行:Lazy
检查该路径是否被加载
记得依插件说明修改或添加配置文件
3.1-部署nvim-osc52
假设上一步只是放置了这个仓库到nvim配置文件中lazy.nvim指明的插件目录而并没有对其配置,那插件自然是没办法常运行的,这时候就要把插件的配置写进nvim的配置文件中
首先在init.lua添加这一段:
1
2
3vim.keymap.set('n', '<leader>c', require('osc52').copy_operator, {expr = true})
vim.keymap.set('n', '<leader>cc', '<leader>c_', {remap = true})
vim.keymap.set('v', '<leader>c', require('osc52').copy_visual)添加完毕即可使用nvim-osc52这个插件。使用方法为命令模式中按顺序按下
\cc
复制当前行,视图模式中按顺序按下\c
复制选定文本还能指定将复制内容放到nvim的
+
寄存器:1
2
3
4
5
6
7function copy()
if vim.v.event.operator == 'y' and vim.v.event.regname == '+' then
require('osc52').copy_register('+')
end
end
vim.api.nvim_create_autocmd('TextYankPost', {callback = copy})当然也能将osc52作为nvim的剪切板,但是要先注释掉上面**
+
寄存器**的相关内容:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17local function copy(lines, _)
require('osc52').copy(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},
}
-- Now the '+' register will copy to system clipboard using OSC52
vim.keymap.set('n', '<leader>c', '"+y')
vim.keymap.set('n', '<leader>cc', '"+yy')这时候就能愉快地使用vim命令复制到osc52的剪切板了,缺点是nvim外部复制的内容需要在插入模式下
shift+control+c
才能粘贴进nvim。用vim命令能够复制线面会弹出osc52的提示
4-重新规划配置文件(可选)
所有插件的配置全扔一起感觉有点乱。笔者眼有点花所以需要做点特别的配置
首先是目录结构:
1 | ➜ nvim tree . |
init.lua
仅仅声明后续用到的文件:
1 | require('lazy_conf') |
lazy_conf.lua
包含lazy.nvim本身的配置和声明各个插件的配置:1 | local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" |
opt.lua
包含nvim的option:1 | vim.opt.number = true |
对于其他插件各自的配置文件统一放在
nvim/lua/individual/
文件夹。虽然配置完得去lazy_conf.lua
声明一下,但是不会眼花(感觉可以用lua写脚本实现自动声明)
- 标题: ssh下通过osc52使用nvim剪切板
- 作者: 7cmb
- 创建于 : 2024-05-21 13:43:41
- 更新于 : 2024-10-12 23:07:35
- 链接: https://7cmb.com/ssh下通过osc52使用nvim剪切板/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。