Neovim:编辑动作、寄存器与项目导航

本页目录

Neovim 的编辑效率来自可以组合的操作。与其一次记几十个快捷键,先掌握“对哪个范围执行什么动作”,再把这些动作连接到文件和项目导航。

本篇基础命令可以在 nvim --clean 中练习。LazyVim 和插件可能覆盖默认行为,遇到差异时通过 :verbose nmap 查看来源。

模式与动作的组合

普通模式用于发出编辑命令,插入模式输入文字,可视模式选取范围,命令行模式执行以 : 开头的命令。

输入含义适用情景
i / a在光标前/后插入增加少量文字
ciw改写当前单词内部换一个词或变量名
ci"改写双引号内部修改字符串内容
dap删除一个段落及相邻空白范围重组说明文字
.重复最近一次可重复的修改在多个位置做相同局部动作
u / Ctrl+r撤销 / 重做检查并恢复误操作

c 表示 change,iw 表示 inner word。先决定范围,再选择动作,可以避免通过很多次方向键手工圈选。操作完成后按 Esc 返回普通模式,确认结果再继续。

注意 ciw 只修改当前位置。它不理解项目中所有同名符号的引用关系;跨文件重命名交给 LSP。

寄存器为什么会变化

默认情况下,复制、删除和改写会影响寄存器。复制一段文字后又删除另一段,再按 p,可能粘贴出刚删除的内容。

需要明确保留内容时,可以使用具名寄存器:

输入作用
"ayy将当前行复制到寄存器 a
"ap从寄存器 a 粘贴
"_dd删除当前行,但丢弃删除内容
:registers查看寄存器内容

"_ 是黑洞寄存器。插件 cutlass 会调整部分删除命令的寄存器行为,所以安装前后应重新做一次“复制 → 删除 → 粘贴”练习。系统剪贴板对应 + 等寄存器,是否连接到桌面取决于 provider,见远程与输入。

buffer、window 与 tabpage

buffer 是编辑器中的文本对象,window 是观看某个 buffer 的区域,tabpage 是一组窗口布局。一个 buffer 可以显示在多个窗口中,也可以暂时不显示。

:edit notes.md
:vsplit notes.md
:ls

前两条创建两个观看同一文件的窗口,第三条列出 buffer。左边修改并保存,右边看到的是同一个 buffer 的内容,不是另一份文件副本。

用 Ctrl+w 后接 h/j/k/l 在窗口间移动;:close 关闭当前窗口,:bnext 切换 buffer。关闭窗口不一定卸载 buffer,更不等于删除磁盘文件。多开 tabpage 也不会自动为每个项目隔离工作目录、LSP 和插件状态。

从文件内搜索到项目结果列表

文件内用 /pattern 搜索,n 和 N 在结果之间移动。若只想匹配普通文字,可使用 \V 启用 very nomagic 模式;查询中的反斜杠仍有语法意义。

多文件结果适合放进 quickfix。下面在项目根目录、确实存在 Markdown 文件时执行:

:vimgrep /TODO/j **/*.md
:copen

quickfix 保存文件、行号和消息,回车跳转到当前条目,:cnext / :cprevious 切换结果。它也可以承接编译器或测试输出。大型仓库优先使用 LazyVim 的项目搜索或外部 rg,避免无边界地遍历生成目录。

LazyVim 的文件选择器和搜索提供者可能随版本变化。按 leader 查看 which-key 提示,再确认当前动作的搜索目录;“当前文件目录”与“项目根目录”会得到不同结果。

一个可以自行检查的练习

在独立的 notes.md 中输入:

title = "draft"
TODO review the example
keep this line
remove this line
  1. 用 ci" 把 draft 改成 ready。
  2. 将 keep this line 复制到寄存器 a。
  3. 用黑洞寄存器删除 remove this line,再从 a 粘贴。
  4. 撤销最后一次粘贴,再重做,观察每一步的范围。
  5. 开两个窗口查看同一 buffer,搜索 TODO 后返回原位置。

检查最终文件:标题已改写,删除行没有替换掉寄存器 a 的内容,两个窗口显示相同文本。这些操作稳定后,再将项目搜索、LSP 跳转和插件动作连接起来。

详细语义可以直接查 :help text-objects、:help registers、:help windows 和 :help quickfix;内置帮助与已安装 Neovim 版本一致。