跳过正文
  1. Posts/

Vim 学习笔记 Day 009:Neovim 的定位 + 终端 / 剪贴板 / 配置 / health,把 Vim 语法接到现代宿主环境

·3861 字·8 分钟
📖 阅读 --
DogDu
作者
DogDu
工作结束或者累了, 要不休息一会, 看会动漫吧 ~
目录
Vim 14 天 - 这篇文章属于一个选集。
§ 9: 本文

今日主题
#

  • 主主题:Neovim 的定位 + 终端 / 剪贴板 / 配置 / health
  • 副主题:把前 8 天的 Vim 语法接到更现代的宿主环境

学习目标
#

  • 建立一个稳定判断:
    • Neovim 不是另一套编辑语法。
    • 它是在 Vim 编辑语法之上,提供了更现代的宿主能力。
  • 先把最值得纳入日常工作流的四个入口讲清楚:
    • :terminal
    • 剪贴板
    • 配置入口
    • :checkhealth
  • 为后面的 LazyVim 主线打地基,避免把 NeovimLazyVim 混为一谈。

前置回顾
#

  • Day 001 到 Day 008 已经把 Vim 的高频编辑语法补到比较完整:
    • motion
    • 文本对象
    • .、撤销、寄存器
    • :global
    • 多文件批处理
  • 这些内容在 Neovim 里不会失效。
  • Day 009 的重点不是推翻前面,而是回答:
    • 为什么很多人最后会把日常主力落在 nvim

典型场景
#

  • 你想一边改代码,一边在同一个编辑器里跑命令看结果。
  • 你想把 Vim 里的内容直接复制到系统剪贴板,或者把外部复制内容直接贴回来。
  • 你不想再靠猜去找 Neovim 配置放在哪里。
  • 你碰到 provider、LSP、Tree-sitter、剪贴板之类的问题时,想先有一个统一排查入口。

最小命令集
#

本地事实确认
#

  • nvim --version
    • 确认本地 Neovim 版本
  • :echo has('nvim')
    • 在编辑器内确认运行环境

配置与路径
#

  • :echo stdpath('config')
    • 查看配置目录
  • :echo stdpath('data')
    • 查看数据目录
  • :echo stdpath('state')
    • 查看状态目录
  • :lua print(vim.fn.stdpath('config'))
    • 说明 Lua 是一等入口

终端
#

  • :terminal
    • 打开终端 buffer
  • 终端模式里 Ctrl-\ Ctrl-N
    • 退回普通模式

剪贴板
#

  • :set clipboard?
    • 查看当前剪贴板选项
  • "+yy
    • 复制到系统剪贴板
  • "+p
    • 从系统剪贴板粘贴

健康检查
#

  • :checkhealth
    • 运行整体健康检查
  • :checkhealth vim.provider
    • 先看 provider,尤其适合剪贴板、Python、Node 这一层排查
  • :checkhealth vim.lsp vim.treesitter
    • 只查重点模块

它是怎么用的
#

第一层:Neovim 不是新语法,而是新宿主
#

对当前阶段最重要的结论是:

  • dw
  • ciw
  • :g/TODO/t $
  • :argdo %s/.../.../g
  • q:

这些语法到了 Neovim 里都继续成立。

所以 Day 009 的重点不是“从 Vim 毕业,重学一种编辑器”,而是:

  • 前 8 天学的是共同底层
  • 从今天起,把共同底层接进更现代的宿主环境

第二层:终端 buffer 会把编辑和命令执行接到同一个上下文里
#

本地 terminal.txt 和 Neovim 帮助都明确支持:

  • :terminal
  • terminal-mode
  • Ctrl-\ Ctrl-N

这和 Day 006 的 buffer / window / split 正好接上。

你可以把它理解成:

  • Vim 里也可能有终端能力,但日常主力不一定都围绕它展开
  • 到了 Neovim,这个能力和窗口、buffer、配置、provider 更像一个统一宿主的一部分

真实场景里,这意味着你可以:

  1. 左边写代码
  2. 右边开 :terminal
  3. 跑命令、看输出
  4. Ctrl-WCtrl-\ Ctrl-N 在代码与终端之间切换

第三层:剪贴板要分清寄存器层和 provider 层
#

对于系统剪贴板,最先该抓住的动作其实只有两组:

VIM 代码 · 共 2 行
"+yy
"+p

但真正要理解的是:

  • 寄存器层是 "+ / "*
  • 能不能正常工作,还受 clipboard provider 和配置影响

本机这次额外确认到两个本地事实:

  • has('clipboard') 返回 1
  • 当前 'clipboard' 选项是空值,不是默认就带 unnamedplus

这意味着当前机器上,主线里先用显式的:

VIM 代码 · 共 2 行
"+yy
"+p

是更稳的入口。等你真的想把系统剪贴板变成默认收发路径,再考虑:

VIM 代码 · 共 1 行
:set clipboard+=unnamedplus

所以当你发现系统剪贴板不通时,不要只停在“命令写错了吗”,还要进一步看:

VIM 代码 · 共 3 行
:set clipboard?
:checkhealth vim.provider
:checkhealth

这也是为什么 Day 009 要把剪贴板和 :checkhealth 放在一起讲。

第四层:stdpath() 让配置入口不再靠猜
#

本地实测:

  • stdpath('config')
    • C:\Users\86131\AppData\Local\nvim
  • stdpath('data')
    • C:\Users\86131\AppData\Local\nvim-data
  • stdpath('state')
    • C:\Users\86131\AppData\Local\nvim-data

这件事的意义很实际:

  • 你不用再靠记忆猜配置放在哪
  • 知道 init.lua / init.vim 应该从哪里开始找
  • 以后遇到插件、cache、health、provider 问题时,路径感会清楚很多

第五层::checkhealth 是 Neovim 的第一排查入口
#

本地 health.txt 给出的定位非常明确:

  • :checkhealth
    • 查整体
  • :checkhealth vim.provider
    • 先查 provider
  • :checkhealth vim.lsp vim.treesitter
    • 查特定模块

这比“先搜 issue”更稳,因为它更接近当前机器的真实状态。

这次也已经在本机直接跑过:

BASH 代码 · 共 1 行
nvim --headless "+checkhealth" +qa

当前环境能正常完成 health 检查流程。

所以后面一旦碰到这些问题:

  • 剪贴板不通
  • provider 没接上
  • LSP 没起
  • Tree-sitter 状态不对

第一反应都应该是:

VIM 代码 · 共 2 行
:checkhealth vim.provider
:checkhealth

常见操作套路
#

套路 1:保留原来的 Vim 语法,只把启动入口换成 nvim
#

场景:

  • 你已经会前 8 天的大部分基础编辑动作
  • 不想重新学一套“Neovim 专属语法”

做法:

  1. 继续用原来的 Vim 语法编辑
  2. 逐步把启动入口从 vim 切到 nvim
  3. 新增只先观察四件事:
  • :terminal
  • 剪贴板
  • stdpath()
  • :checkhealth

套路 2:把终端接进 window 工作流
#

场景:

  • 你要边改边跑命令

做法:

  1. :vsplit
  2. 在一个窗口里执行:
VIM 代码 · 共 1 行
:terminal
  1. 在终端里跑命令
  2. Ctrl-\ Ctrl-N 回普通模式
  3. Ctrl-W h/l 在代码和终端之间切换

补一个非常实用的判断:

  • 一次性、非交互的外部命令,:! 仍然够用
  • 需要交互、持续输出、或者本来就想把命令执行留在当前编辑上下文里,优先 :terminal

Neovim 的 vim_diff.txt 也明确写了:

  • :! 不支持 interactive commands
  • 需要时用 :terminal

套路 3:系统剪贴板先用显式寄存器
#

场景:

  • 你要明确确认“到底是不是系统剪贴板”

做法:

VIM 代码 · 共 2 行
"+yy
"+p

这比一上来就改 clipboard 选项更稳,因为你先确认了寄存器路径。

套路 4:定位配置入口,优先 stdpath('config')
#

场景:

  • 你不知道 init.lua 到底应该去哪找
  • 或者你想确认当前是哪个配置目录生效

做法:

VIM 代码 · 共 1 行
:echo stdpath('config')

如果已经开始接触 Lua,再补一条:

VIM 代码 · 共 1 行
:lua print(vim.fn.stdpath('config'))

套路 5:一遇到环境问题,先跑 health
#

场景:

  • 剪贴板 provider 不对
  • LSP 异常
  • Tree-sitter 异常

做法:

VIM 代码 · 共 3 行
:checkhealth vim.provider
:checkhealth
:checkhealth vim.lsp vim.treesitter

先把问题缩小,再去查具体文档或插件。

环境差异:vim / nvim / LazyVim
#

Vim:底层编辑语法仍然有效
#

本地 vim --version 显示当前 Vim 9.2 已经带有:

  • +terminal
  • +clipboard
  • +quickfix

所以今天要避免一个误解:

  • 差异不在于“Vim 完全没有这些功能,Neovim 才有”
  • 更关键的是 Neovim 把终端、配置、provider、health、Lua 和现代生态组织成了更统一的宿主环境

Neovim:现代宿主环境
#

本地确认版本:

  • Neovim 0.12.0

本机还额外确认到:

  • stdpath('config')
    • C:\Users\86131\AppData\Local\nvim
  • stdpath('data')
    • C:\Users\86131\AppData\Local\nvim-data
  • stdpath('state')
    • C:\Users\86131\AppData\Local\nvim-data
  • has('clipboard')
    • 1
  • 当前 'clipboard'
    • 空值

这一层最值得先抓的不是插件清单,而是:

  • :terminal
  • "+
  • stdpath()
  • :checkhealth

LazyVim:在 Neovim 上组织默认工作流
#

LazyVim 后面会继续往前推进:

  • leader 工作流
  • 文件 / 搜索 / buffer 入口
  • LSP、诊断、代码导航入口

但如果 Day 009 这一层没搞清楚,后面很容易把 LazyVim 误学成“一堆快捷键”,而不是 Neovim 上的一套默认工作流。

今日练习(5-10 分钟)
#

练习任务 A:确认本地 Neovim 事实
#

  1. 运行:
BASH 代码 · 共 1 行
nvim --version
  1. 打开 nvim 后执行:
VIM 代码 · 共 3 行
:echo stdpath('config')
:echo stdpath('data')
:echo stdpath('state')

目标:

  • 知道当前配置目录和数据目录实际在哪。

练习任务 B:把终端接进 split 工作流
#

  1. 打开任意一个临时文件。
  2. :vsplit
  3. 在右侧执行:
VIM 代码 · 共 1 行
:terminal
  1. 在终端里输入一个简单命令,例如 dirgit status
  2. Ctrl-\ Ctrl-N 退回普通模式
  3. Ctrl-W h/l 在两个窗口间切换

目标:

  • 亲手感受到 terminal 也是 buffer / window 成员。

练习任务 C:验证系统剪贴板路径
#

  1. 在一行文本上执行:
VIM 代码 · 共 1 行
"+yy
  1. 到另一处执行:
VIM 代码 · 共 1 行
"+p
  1. 再看一次:
VIM 代码 · 共 1 行
:set clipboard?
  1. 如果你怀疑 provider 层有问题,再加一条:
VIM 代码 · 共 1 行
:checkhealth vim.provider

目标:

  • 至少先分清寄存器动作和配置动作。

练习任务 D:跑一次 health
#

  1. 执行:
VIM 代码 · 共 1 行
:checkhealth
  1. 再试一次:
VIM 代码 · 共 2 行
:checkhealth vim.provider
:checkhealth vim.lsp vim.treesitter

目标:

  • 建立“先看 health,再怀疑插件”的第一反应。

今日问题与讨论
#

我的问题
#

  • 暂无。本节先把 Neovim 的最小过渡入口讲清楚,后续问答直接补到这里。

外部高价值问题
#

问题 1:既然本地 Vim 9.2 也有 +terminal+clipboard,为什么还要进入 Neovim?
#

  • 问题:
    • 既然本机 Vim 也有这些特性,Neovim 的意义到底是什么?
  • 简答:
    • 关键差异不在“有没有某个单点功能”,而在于配置入口、Lua、provider、health、LSP、Tree-sitter 等能力被组织成了更统一的现代宿主环境。
  • 场景:
    • 单看复制粘贴或终端,也许差异不大;一旦进入长期配置和工程工作流,差异会放大。
  • 依据:
    • 本地 vim --version
    • 本地 nvim --version
    • vim_diff.txt
  • 当前结论:
    • Day 009 的重点是“宿主模型差异”,不是“单功能对比”。
  • 是否需要后续回看:

问题 2:系统剪贴板不通,第一步应该查什么?
#

  • 问题:
    • 到底先改 clipboard,还是先查 provider,还是先怪终端?
  • 简答:
    • 先确认寄存器动作,再看 :set clipboard?:checkhealth vim.provider
  • 场景:
    • "+yy 没按预期工作,或者外部复制内容贴不进来。
  • 依据:
    • 本地 change.txt
    • 本地 health.txt
  • 当前结论:
    • 先分清“寄存器层”和“provider 层”,不要一上来就乱改配置。
  • 是否需要后续回看:

问题 3:在 Neovim 里,:!:terminal 该怎么选?
#

  • 问题:
    • 两者都能跑外部命令,但实际工作流里应该先想到哪个?
  • 简答:
    • 一次性、非交互命令可以先用 :!;交互式、持续输出、想放进 split 工作流的命令优先 :terminal
  • 场景:
    • :!dir
      • 临时看一下目录内容
    • :terminal
      • 跑测试、看日志、执行 git、持续观察输出
  • 依据:
    • 本地 vim_diff.txt 明确写了 :! 不支持 interactive commands,建议用 :terminal
    • 本地 terminal.txt
  • 当前结论:
    • :terminal 不是“炫技终端”,而是 Neovim 工作流的一部分。
  • 是否需要后续回看:

常见误区或易混点
#

  • 误区 1:到了 Neovim 就得重学所有编辑语法。
    • 不需要,前 8 天的高频语法基本都继续有效。
  • 误区 2:Neovim 的价值就是装插件。
    • 更关键的是它把配置、terminal、provider、health、LSP 这些做成了更统一的宿主入口。
  • 误区 3:看到 "+ 不工作,就只怀疑按键。
    • 还要检查 clipboard 选项和 provider 状态。
  • 误区 4:不知道配置入口时,先在系统里盲搜文件。
    • 先用 stdpath('config')
  • 误区 5:一出问题就先搜插件 issue。
    • 先看 :checkhealth

扩展内容
#

  • init.viminit.lua
    • Neovim 两种入口都能用,但后面主线会更偏向 Lua 视角。
  • set clipboard+=unnamedplus
    • 很常用,但今天先把显式 "+ 寄存器和 provider 分层讲清楚,再决定要不要设成默认。
  • shada
    • 是后面 Day 014 扩展内容的一部分,可视为对旧 viminfo 的现代承接。
  • provider 重新加载
    • 例如 clipboard provider,等以后真的碰到时再展开。
  • vim.lsp.enable()
    • 先知道 Neovim 已经有原生 LSP 入口,具体操作留到后面章节。

今日小结
#

  • Day 009 的关键不是“学几条新命令”,而是建立一个分层判断:
    • Vim 语法仍然是你的底层编辑语言
    • Neovim 负责把它接到更现代的宿主环境
  • 这一层先抓住四个入口就够了:
    • :terminal
    • 剪贴板
    • stdpath()
    • :checkhealth

明日衔接
#

  • 下一天进入 LazyVim 总览与 leader 思维
  • 到那时会开始回答:
    • 为什么 LazyVim 不是“很多插件的集合”,而是 Neovim 上的一套默认工作流组织。

复习题
#

  1. 为什么说 Neovim 的关键差异更像“宿主环境”而不是“新语法”?
  2. :terminal 和 Day 006 的 buffer / window / split 是怎么接起来的?
  3. "+ 寄存器解决的是哪一层问题?provider 又是哪一层?
  4. stdpath('config') 为什么是配置入口的第一锚点?
  5. 遇到环境问题时,为什么应该先看 :checkhealth
Vim 14 天 - 这篇文章属于一个选集。
§ 9: 本文