---
title: Neovim：编辑动作、寄存器与项目导航
url: https://doc.liz6.com/tools/nvim/03-editing-navigation
locale: zh
area: tools
tags:
- Neovim
- 开发工具
date: 2026-09-15
modified: 2026-09-15
description: 从可预测的编辑动作开始，理解文本对象、寄存器、buffer/window/tab 和 quickfix，并完成一个小练习。
---

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

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

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

## 模式与动作的组合

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

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

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

注意 `ciw` 只修改当前位置。它不理解项目中所有同名符号的引用关系；跨文件重命名交给 [LSP](04-language-tools.md)。

## 寄存器为什么会变化

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

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

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

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

## buffer、window 与 tabpage

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

```vim
: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 文件时执行：

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

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

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

## 一个可以自行检查的练习

在独立的 `notes.md` 中输入：

```text
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 版本一致。
