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
- 用
ci"把draft改成ready。 - 将
keep this line复制到寄存器 a。 - 用黑洞寄存器删除
remove this line,再从 a 粘贴。 - 撤销最后一次粘贴,再重做,观察每一步的范围。
- 开两个窗口查看同一 buffer,搜索
TODO后返回原位置。
检查最终文件:标题已改写,删除行没有替换掉寄存器 a 的内容,两个窗口显示相同文本。这些操作稳定后,再将项目搜索、LSP 跳转和插件动作连接起来。
详细语义可以直接查 :help text-objects、:help registers、:help windows 和 :help quickfix;内置帮助与已安装 Neovim 版本一致。