0%

终端nvim配置

尽可能地在无法使用vscode remote-ssh的服务器上配置类ide的nvim


动机

在不久前薅到了一台双卡a800的服务器, 但非常非常非常遗憾的是这台服务器上安装了老旧的Ubuntu 18.04系统, 无法跟笔者当前的vscode版本适配, 想要通过vscode的remote-ssh使用这台服务器就需要对vscode版本进行降级或者使用别的支持远程的ide, 由于笔者还需要使用vscode高强度远程连接其他服务器, 同时这台服务器经常处于显存闲置的状态(极有可能是因为其他用户也不方便使用vscode远程), 此外笔者一直希望学习使用vim编程与开发, 因此决定在这台服务器上配置nvim, 使之满足基本的代码开发需求.

准备

为了实现类现代的ide配置, 笔者选择了Neovim, 并通过Lua对其进行相应的配置, 期望的功能包括侧边栏文件树, 代码高亮和自动补全, 内置terminal终端以及对文件的快速搜索. 同时结合Vim的语法, 在写代码的过程中可以更大程度地减小对鼠标的依赖. 对于具体的各类插件配置, 则选择了LazyVim. LazyVim是基于nvim的预配置框架, 通过lazy.nvim插件管理器提供开箱即用的IDE功能,同时保持高度可定制性. 相较于在Neovim中单独配置各个插件, Lazyvim的核心优势是可以最大限度地规避各个插件之间的潜在冲突并避免了手动安装的繁琐. 我所采用的插件生态和对应的插件下所示:

功能 插件
LSP nvim-lspconfig
LSP 安装管理 mason.nvim
语法树 nvim-treesitter
自动补全 blink.cmp
代码格式化 conform.nvim
Git 行级 diff gitsigns.nvim
状态栏 lualine.nvim
主题 tokyonight.nvim
注释增强 todo-comments.nvim
Python venv 管理 venv-selector.nvim

最终实现的代码界面如图所示:

安装过程

安装Neovim并验证

1
2
3
4
5
6
7
8
9
10
11
sudo apt update
sudo apt install -y git curl unzip build-essential

cd ~
wget https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
chmod u+x nvim.appimage
./nvim.appimage --appimage-extract
sudo mv squashfs-root /opt/nvim
sudo ln -s /opt/nvim/AppRun /usr/local/bin/nvim

nvim --version

第二步是安装对应依赖

1
2
sudo apt install -y ripgrep fd-find nodejs npm python3-pip
sudo ln -s $(which fdfind) /usr/bin/fd

接着安装LazyVim

1
2
3
4
5
mv ~/.config/nvim ~/.config/nvim.bak
mv ~/.local/share/nvim ~/.local/share/nvim.bak

git clone https://github.com/LazyVim/starter ~/.config/nvim
rm -rf ~/.config/nvim/.git

然后只需要启动nvim并等待插件的自动安装即可. 此外需要额外启用Python模块, 编辑~/.config/nvim/lazyvim.json并向其中写入以下内容:

1
2
3
4
5
{
"extras": [
"lazyvim.plugins.extras.lang.python"
]
}

通过lazyvim的默认插件即可实现绝大部分的IDE功能.

问题解决: 无法使用粘贴板

我在使用当前nvim时遇到的一个主要的问题是无法将远程服务器中的内容复制到本地, 虽然nvim提供了鼠标右键菜单并支持copy选项, 但由于服务器本身是docker容器的原因常用的x11等服务无法正常运行, 这对调试代码造成了极大的困扰(但粘贴选项是支持的)了.

在尝试复制服务器中的代码内容时发生以下报错:

1
clipboard: No provider. Try ":checkhealth" or ":h clipboard"

该问题发生的主要原因是当前的Neovim找不到系统的剪贴板接口. 解决该问题需要安装X11 clipboard工具. 然而, 由于所使用的服务器类似docker容器, 直接下载xclip也无法使用剪贴板, 更合适的方案是在LazyVim中配置OSC52, 使远程SSH复制内容自动同步到本地剪贴板. 然而, 由于学校网络的原因, 当前服务器无法访问GitHub, 测试的多个镜像网站也都无法正常访问. 因此只能手动下载osc52的repo内容为zip, 解压缩后整理成git clone后的文件树排布, 然后尝试手动将文件复制到lazyvim的插件路径下. 这里的主要问题是lazyvim在进入nvim后会自动下载osc52的repo, 最终的解决思路是在复制的osc52文件夹下手动创建空的.git, 具体的操作步骤如下:

首先下载对应repo并整理成git clone的相应文件树分布, 项目地址为https://github.com/ojroques/nvim-osc52, 接着将其放置于对应的路径下:~/.local/share/nvim/lazy/, 最后将其伪装成git仓库, 进入路径cd ~/.local/share/nvim/lazy/nvim-osc52, 接着执行git初始化:

1
2
3
git init
git add .
git commit -m "manual install"

此外, 还需要修改Lazyvim的相应配置以实现对手动复制的模块的识别. 在~/.config/nvim/lua/plugins/路径下创建osc52.lua文件并写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
return {
{
"ojroques/nvim-osc52",
-- 1. 强制指向手动存放的路径
dir = "~/.local/share/nvim/lazy/nvim-osc52",
-- 2. 开启开发模式,这是禁止自动删除的关键
dev = true,
config = function()
local osc52 = require("osc52")
osc52.setup({
max_length = 0,
silent = true,
trim = false,
})

-- 方案 2 的核心:鼠标右键点击选中区域时执行 OSC52 复制
vim.keymap.set("v", "<RightMouse>", function()
osc52.copy_visual()
-- 复制后退出视觉模式
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("<Esc>", true, false, true), "n", true)
print("已通过 OSC52 复制到本地")
end)

-- 接管剪贴板
vim.g.clipboard = {
name = "osc52",
copy = {
["+"] = function(lines) osc52.copy(table.concat(lines, "\n")) end,
["*"] = function(lines) osc52.copy(table.concat(lines, "\n")) end,
},
paste = {
["+"] = function() return { vim.fn.getreg('"'), vim.fn.getregtype('"') } end,
["*"] = function() return { vim.fn.getreg('"'), vim.fn.getregtype('"') } end,
},
}
end,
},
}

完成上述步骤后即可实现使用右键进行内容的复制, 效果如下:

1

小结

人生苦短, 我用VIM.