Vim

neovim

更现代化的vim https://github.com/neovim/neovim

安装

apt仓库里的版本普遍较旧,建议直接从 GitHub Release 下载最新的预编译包:

# 下载地址:https://github.com/neovim/neovim/releases
# 下载对应平台的压缩包(如 nvim-linux64.tar.gz)后解压,将可执行文件放入 PATH 即可
# 例如:
curl -LO https://github.com/neovim/neovim/releases/download/v0.12.5/nvim-linux-x86_64.tar.gz
tar xzf nvim-linux-x86_64.tar.gz
sudo mv nvim-linux-x86_64/bin/nvim /usr/local/bin/
sudo mv nvim-linux-x86_64/share/* /usr/local/share/ 2>/dev/null || true

配置 — LazyVim

LunarVim 项目已不再活跃,转用社区更活跃的 LazyVim —— 它是基于 lazy.nvim 构建的 Neovim 配置框架,开箱即用、插件齐全且高度可定制。

安装

先备份原有 Neovim 配置:

# required
mv ~/.config/nvim{,.bak}

# optional but recommended
mv ~/.local/share/nvim{,.bak}
mv ~/.local/state/nvim{,.bak}
mv ~/.cache/nvim{,.bak}

克隆 LazyVim Starter:

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

删除 .git 目录,以便后续接入自己的版本控制:

rm -rf ~/.config/nvim/.git

启动 Neovim:

nvim

剪贴板配置

方案一:传统方式(X11 / WSL 转发)

X11 转发在移动网络或弱网环境下有时会有卡顿,且需要后台常驻一个 X11 服务。此方案适合本地 Linux 或 WSL 等有系统剪贴板的环境。

Linux 下:

sudo apt install xclip

在 ~/.config/nvim/init.lua 中加入:

vim.opt.clipboard:append { 'unnamedplus' }
vim.g.clipboard = {
  name = 'xclip',
  copy = {
    ['+'] = 'xclip -selection clipboard',
    ['*'] = 'xclip -selection primary',
  },
  paste = {
    ['+'] = 'xclip -selection clipboard -o',
    ['*'] = 'xclip -selection primary -o',
  },
  cache_enabled = 1,
}

Windows WSL 中:

下载 win32yank 并移动到 /usr/local/bin,然后配置:

vim.opt.clipboard:append { 'unnamedplus' }
vim.g.clipboard = {
  name = 'win32-clipboard',
  copy = {
    ['+'] = 'win32yank.exe -i',
    ['*'] = 'win32yank.exe -i',
  },
  paste = {
    ['+'] = 'win32yank.exe -o',
    ['*'] = 'win32yank.exe -o',
  },
  cache_enabled = 1,
}

方案二:OSC 52 协议(免 X11,更纯粹、无网络延迟)

推荐

现代终端(包括 Termux)和编辑器都原生支持 OSC 52 协议,通过 ANSI 转义序列直接在 SSH 连接中携带剪贴板数据。适合远程开发场景,免去 X11 转发的延迟和带宽问题。

Neovim (>= 0.10) 原生支持 OSC 52。在远端服务器的 ~/.config/nvim/lua/config/options.lua中加入:

vim.g.clipboard = {
  name = 'OSC 52',
  copy = {
    ['+'] = require('vim.ui.clipboard.osc52').copy('+'),
    ['*'] = require('vim.ui.clipboard.osc52').copy('*'),
  },
  paste = {
    ['+'] = require('vim.ui.clipboard.osc52').paste('+'),
    ['*'] = require('vim.ui.clipboard.osc52').paste('*'),
  },
}
vim.opt.clipboard = "unnamedplus"
关于粘贴

OSC 52 的粘贴依赖终端支持,绝大多数现代终端在开启相应权限后可用,但少数终端只允许从本地剪贴板发送、不允许接收。

tmux 下使用 OSC 52

常见坑

tmux 作为终端复用器,默认会拦截并过滤掉内部程序发送的转义字符。Neovim 发出的 OSC 52 剪贴板控制码会被 tmux 吞掉,传不到最外层,导致在 tmux 里复制失效。 解决办法:在远端服务器的 ~/.tmux.conf 中开启剪贴板透传支持。

第一步:编辑 ~/.tmux.conf

# 1. 允许 tmux 读写并向外转发终端剪贴板
set -s set-clipboard on

# 2. 允许转义序列直接透传给外层终端(tmux 3.3+ 强烈建议开启)
# set -g allow-passthrough on

# 3. 告诉 tmux 外部终端支持 OSC 52 剪贴板协议(Ms 扩展)
set -as terminal-overrides ',*:Ms=\E]52;%p1%s;%p2%s\007'

第二步:使配置生效

set -s(server 级别)的选项需要重新加载配置文件或完全重启 tmux 服务才能生效,二选一:

# 方式一:在已打开的 tmux 会话中重新加载(快捷键前缀 C-b : 后输入)
source-file ~/.tmux.conf

# 方式二:彻底重启 tmux(推荐)
tmux kill-server
tmux

第三步:验证

在 tmux 内部打开 Neovim,选中文本执行 yy(或 "+y),切到外部 App 直接粘贴,应该就能正常工作了。

快捷键

# 移动行: alt-j alt-k
# 移动窗口:ctrl+w hjkl

# nvim-tree快捷键见:https://github.com/nvim-tree/nvim-tree.lua/blob/master/doc/nvim-tree-lua.txt