Skip to content

15|完整速查表

这里是整套课程的完整速查表。平时按场景查找即可,不需要记住每一项。需要重点掌握的按键会在各节前部列出。

先认模式和记法

Space 是 Leader,, 是 Local leader。Leader 组合需要依次输入,无需同时按住。按下 Space 后停约半秒,Which-key 会显示可用的后续按键。

本文写法模式或界面含义
普通Normal移动、编辑、触发大多数快捷键
插入Insert正在输入文本
可视Visual已经选中字符、行或矩形区域
操作符等待Operator-pending已按 dcy 等,正在等待范围
终端输入Terminal按键会交给 shell
终端普通Terminal-normal可以移动光标和切换窗口
PickerSnacks 搜索列表命令、Buffer、grep 等浮动列表
ExplorerSnacks 文件树文件与目录操作
DiffviewGit 对照 Tab文件面板、差异窗口或冲突窗口

遇到“按键毫无反应”,先按一次 Esc 回到普通模式,再重新尝试。Leader 组合中的每个按键要在约 500 毫秒内连续输入,间隔过长会被当作组合已经结束。

日常开发主流程

这张表覆盖一轮常见开发。先记住它,后面的表按需翻阅。

场景模式按键或命令效果
明确打开项目外部终端cd 项目 && nvim .从项目目录启动,避开自动恢复其他项目
找文件普通Space e切换 Explorer:已有时关闭,未打开时新建
搜文字普通Space /在当前工作目录全文 grep
换已打开文件普通Space ,打开 Buffer Picker
跳到定义普通,LSP 已附加Space l g d跳到光标下符号的定义
找引用普通,LSP 已附加Space l g r列出符号引用
重命名普通,LSP 已附加Space l n请求 LSP 跨文件重命名
代码动作普通,LSP 已附加Space l a打开当前位置可用的修复与重构动作
跑测试普通或终端输入Ctrl-\打开、隐藏右侧终端
格式化普通Space c f异步格式化当前 Buffer
保存普通F1write → 两次 Enter写入当前文件
看当前 Git 块普通Space h P预览光标所在 hunk
暂存当前 Git 块普通Space h s暂存当前 hunk
审查全项目普通Space g s新建 Diffview Tab
结束工作普通F1wqa → 两次 Enter保存全部文件并退出

生存、保存和撤销

模式切换

模式按键效果
插入、可视Esc回普通模式
普通i在光标前进入插入模式
普通a在光标后进入插入模式
普通I在本行首个非空白字符前插入
普通A在行尾插入
普通o在下方新建一行并插入
普通O在上方新建一行并插入
普通v进入字符可视模式
普通V进入整行可视模式
普通Ctrl-v进入块可视模式

撤销、重做和重复

模式按键效果
普通u撤销最近一次修改
普通Ctrl-r重做刚撤销的修改
普通.重放最近一次可重复修改
普通U撤销当前行最近的一组修改;再次按会参与普通撤销历史

不用输入冒号的命令面板

F1 只在普通模式下有映射。输入命令名后,第一次按 Enter 会选中命令并填入底部命令行,第二次按 Enter 才会执行;命令前的冒号由 Picker 自动补上。

模式操作效果
普通F1write → 两次 Enter保存当前 Buffer
普通F1wall → 两次 Enter保存全部已修改的文件 Buffer
普通F1wqa → 两次 Enter保存全部并退出 Neovim
普通F1qa → 两次 Enter全部退出;存在未保存内容时会拒绝
普通F1messages → 两次 Enter查看近期通知与错误
普通F1DiffviewClose → 两次 Enter关闭当前 Diffview
普通F1ConformInfo → 两次 Enter查看当前文件可用格式器及日志

文件不会自动保存。配置同时关闭了 swap、backup、writebackup 和持久化 undo 文件。突然断电或进程异常退出时,未保存内容可能无法恢复,因此应频繁保存。

移动、搜索和跳转历史

文件内移动

模式按键效果
普通、可视、操作符等待h/j/k/l左、下、上、右移动
普通、可视、操作符等待w/b/e下一个词首、上一个词首、当前或下一个词尾
普通、可视、操作符等待0/^/$物理行首、首个非空白字符、行尾
普通、可视、操作符等待gg/G文件开头、文件末尾
普通、可视Ctrl-d/Ctrl-u向下、向上滚半屏
普通、可视、操作符等待f``{字符}跳到本行右侧指定字符
普通、可视、操作符等待F``{字符}跳到本行左侧指定字符
普通、可视、操作符等待;/,重复上次行内字符跳转 / 反向重复
普通、可视、操作符等待%在配对括号、标签或结构边界间跳转
普通zz把当前行滚到屏幕中央

文件内搜索

模式按键效果
普通/`` 文字 Enter向下搜索当前文件
普通?`` 文字 Enter向上搜索当前文件
普通n/N沿当前搜索方向继续 / 反向继续
普通*/#向下 / 向上搜索光标下完整单词
普通Ctrl-l重绘屏幕并清掉当前搜索高亮

回到刚才的位置

模式按键效果
普通Ctrl-o跳转列表中后退一步,常用于从定义回调用处
普通Ctrl-i跳转列表中前进一步;很多终端把它显示成 Tab
普通g ;回到上一个修改位置
普通g ,前往下一个修改位置
普通g i跳到上次插入结束处并进入插入模式

删除、复制、修改和文本对象

高频编辑

模式按键效果
普通x删除光标下字符
普通r``{字符}用一个字符替换光标下字符
普通dd/yy删除整行 / 复制整行
普通cc清空当前行内容并进入插入模式
普通D/C删除到行尾 / 修改到行尾
普通p/P在光标后 / 前粘贴;整行内容会落到下方 / 上方
普通J把下一行接到当前行末尾
可视y/d/c复制 / 删除 / 修改选区
可视>/<增加 / 减少选区缩进

“操作 + 范围”语法

模式组合效果
普通d``{移动或文本对象}删除指定范围
普通c``{移动或文本对象}删除指定范围并进入插入模式
普通y``{移动或文本对象}复制指定范围
普通c i w修改光标所在单词
普通d i "删除双引号内部内容,保留引号
普通c a (修改整对圆括号及其内容
操作符等待、可视i``{对象}选择对象内部
操作符等待、可视a``{对象}选择对象及包围符或邻近空白

常用对象:

模式对象效果
操作符等待、可视i/a-w单词内部 / 整个单词
操作符等待、可视i/a-"'引号内部 / 连同引号
操作符等待、可视i/a-([{括号内部 / 连同括号
操作符等待、可视i/a-t标签内部 / 连同标签
操作符等待、可视i/a-amini.ai 的函数参数对象

mini.ai 使用 cover_or_next 搜索策略。光标不在对象内部时,它可能继续查找后方约 50 行内的下一个对象。执行删除或修改前,最好先用可视模式确认选区,避免改到较远位置的参数。

注释、包围符和自动括号

注释

模式按键效果
普通gcc切换当前行注释
普通gc``{移动}切换指定范围注释,例如 gcip 处理当前段落
可视gc切换选区注释

mini.surround

模式按键效果
普通sa``{范围}{包围符}给范围添加包围符,例如 saiw"
可视sa``{包围符}给选区添加包围符
普通sd``{包围符}删除邻近的指定包围符,例如 sd"
普通sr``{旧包围符}{新包围符}替换包围符,例如 sr"'
普通sh``{包围符}临时高亮插件即将操作的包围区域
普通sf/sF``{包围符}跳到右侧 / 左侧邻近包围符

mini.pairs 会在插入模式下自动补上常见的右括号和右引号。遇到已经存在的右括号时,注意光标是直接越过了它,还是又插入了一个相同字符。

mini.surround 的默认搜索策略是 cover:包围符需要覆盖光标位置。使用 sdsr 前可先用 sh 预览目标;找不到时,把光标移进那对包围符再试。

Picker:命令、grep 和 Buffer 列表

打开不同 Picker

模式按键效果
普通F1命令 Picker
普通Space /当前工作目录全文 grep
普通Space ,已加载 Buffer 列表

Picker 通用操作

模式按键效果
Picker 输入框直接输入缩小结果范围
PickerCtrl-n/Ctrl-p选择下一项 / 上一项
PickerDown/Up选择下一项 / 上一项
PickerEnter用当前窗口确认
PickerCtrl-s在水平分屏确认
PickerCtrl-v在垂直分屏确认
PickerCtrl-t在新 Tab 确认
PickerTab标记或取消标记当前项,可继续选择多项
PickerCtrl-q把已标记项或当前结果集加入 Quickfix
PickerAlt-h显示或隐藏点文件
PickerAlt-i显示或隐藏被 ignore 的结果
PickerEsc取消并关闭

Buffer Picker 的删除

模式按键效果
Buffer Picker 输入框Ctrl-x请求删除当前 Buffer
Buffer Picker 列表普通模式dd请求删除当前 Buffer

Buffer 中有未保存修改时会出现确认框。选择 No 会丢弃修改并继续删除;选择 Cancel 则会取消本次操作。

Explorer:文件与目录

导航和查看

模式按键效果
普通Space e切换 Explorer:已有时关闭,未打开时新建
Explorerj/k下移 / 上移
ExplorerEnterl打开文件,或展开 / 收起目录
Explorerh收起当前目录
ExplorerBackspace把 Explorer 根目录移到上一级
ExplorerZ收起全部目录
ExplorerP显示或隐藏预览
ExplorerH显示或隐藏点文件
ExplorerI显示或隐藏被 Git ignore 的文件
Exploreru刷新文件树

Explorer 中按 / 会进入递归文件名筛选。选中结果后的第一次 Enter 会回到树并定位,第二次 Enter 才打开文件。

新建、改名、复制和移动

模式按键效果
Explorera新建文件;名字以 / 结尾时新建目录
Explorerr重命名当前文件或目录
Explorerc复制当前项;已有多选时复制整组到当前目录
Explorerm把已标记项移到当前目录;没有标记时改为重命名当前项
ExplorerTab标记或取消标记当前项,随后可继续标记其他项
Explorer 普通、可视y把当前项、已标记项或可视选区的路径写入当前寄存器
Explorerp把寄存器中的文件复制到当前目录
Explorerd确认后删除当前项或全部已标记项

标准多选移动流程:在每个来源项上按 Tab,把光标移到目标目录上,按 m,核对确认框后确认。光标停在文件上时,“当前目录”取该文件的父目录;停在目录上时就取该目录本身。没有任何 Tab 标记时,m 会打开重命名框,所以它无法单独充当“移动当前项”按钮。

当前系统 PATH 中没有可供 Snacks 使用的 trashgiokioclient。Explorer 会回退到递归永久删除。按 d 前核对名称;使用 Tab 多选后,再核对一次整组名单。

在所选目录工作

模式按键效果
ExplorerSpace /在当前 Explorer 目录 grep
ExplorerCtrl-t在当前 Explorer 目录打开终端
ExplorerCtrl-c把当前目录设为本 Tab 的工作目录

Ctrl-c 会改变后续 grep、终端和会话使用的目录。搜索范围突然缩水时,先回忆自己有没有在 Explorer 里按过这组键。

Diffview 内的 Space e 会聚焦 Diffview 文件面板,无法切换全局 Explorer。关闭 Diffview 后,全局含义恢复。

Buffer、Window 和 Tab

模式按键效果
普通Space ,从所有已加载 Buffer 中选择
普通Ctrl-w h/j/k/l跳到左 / 下 / 上 / 右 Window
普通Ctrl-w s水平分屏
普通Ctrl-w v垂直分屏
普通Ctrl-w q关闭当前 Window
普通Ctrl-w =让分屏尺寸均衡
普通gt/gT下一个 / 上一个 Tab

关闭 Window 只会关闭当前显示区域,Buffer 仍可能留在内存中。需要管理 Buffer 时,可以使用 Space ,。顶部页签显示的是 Tab 布局,不会列出所有 Buffer。

补全来源包括 LSP、路径、friendly-snippets 和当前 Buffer 文字。没有语言 LSP 的文件仍可能出现路径、片段和文字候选。

模式按键效果
插入,补全菜单出现Ctrl-n/Ctrl-p选择下一项 / 上一项
插入,补全菜单出现Down/Up选择下一项 / 上一项
插入Ctrl-Space主动显示补全菜单
插入Ctrl-e隐藏补全菜单
插入,文档浮窗出现Ctrl-d/Ctrl-f文档向上 / 向下滚动
插入,补全菜单出现Ctrl-y接受当前候选
插入,补全菜单出现Tab接受当前候选
插入Shift-Tab选择上一候选,或跳到上一个 snippet 占位
插入Ctrl-k显示或隐藏函数签名帮助
插入Enter正常换行,不接受补全候选

Tab 被配置为直接接受当前项。按下之前应先确认候选内容,避免插入不符合预期的补全结果。

Copilot 灰字建议

这些按键需要 Copilot 已认证、网络可用,并且当前 Buffer 已加载 Copilot。

模式按键效果
插入,灰字建议出现Alt-l接受整条建议
插入,灰字建议出现Ctrl-]丢弃当前建议
插入Alt-]/Alt-[下一条 / 上一条建议
普通Alt-Enter打开底部 Copilot Panel
Copilot Panel 普通]]/[[下一条 / 上一条面板建议
Copilot Panel 普通Enter接受面板建议
Copilot Panel 普通gr刷新建议

部分终端或桌面环境会拦截 Alt 组合。按键没有送到 Neovim 时,先检查终端快捷键设置。

LSP:定义、引用、诊断和重构

以下映射只在 LSP 成功附加到当前 Buffer 后出现,模式均为普通模式。按 Space l 停一下,可以从 Which-key 查看当前可用分支。

日常高频

模式按键效果
普通,LSP BufferSpace l g d跳到定义
普通,LSP BufferSpace l g r列出引用
普通,LSP BufferSpace l h显示悬浮信息
普通,LSP BufferSpace l s显示函数签名
普通,LSP BufferSpace l n重命名符号
普通,LSP BufferSpace l a代码动作
普通,LSP BufferSpace l e打开光标处诊断浮窗
普通,LSP BufferSpace l g n下一条诊断,并显示详情
普通,LSP BufferSpace l g p上一条诊断,并显示详情

结构导航与较少使用的入口

模式按键效果
普通,LSP BufferSpace l g D跳到声明
普通,LSP BufferSpace l g t跳到类型定义
普通,LSP BufferSpace l g i列出实现
普通,LSP BufferSpace l S列出当前文档符号
普通,LSP BufferSpace l w s搜索工作区符号
普通,LSP BufferSpace l H高亮当前文档中的同名符号
普通,LSP BufferSpace l w a添加工作区目录
普通,LSP BufferSpace l w r移除工作区目录
普通,LSP BufferSpace l w l通知中列出工作区目录

Neovim 0.12 还提供一组原生 LSP 映射。它们同样只在相应能力可用时出现:

模式按键效果
普通,LSP BufferK显示 hover 文档
普通,LSP Bufferg r a代码动作
普通,LSP Bufferg r i列出实现
普通,LSP Bufferg r n重命名
普通,LSP Bufferg r r列出引用
普通,LSP Bufferg r t跳到类型定义
普通,LSP Bufferg O列出文档符号
普通] d/[ d下一条 / 上一条诊断
普通Ctrl-w d打开光标处诊断浮窗

两个格式化入口

模式按键效果
普通Space c fConform 异步格式化;有显式格式器时优先,随后尝试 LSP fallback
普通,LSP BufferSpace l f直接请求 LSP 格式化
普通,LSP BufferSpace l t f切换 Buffer 标记;全局保存格式化已关闭,因此无法真正启用保存时格式化

日常优先使用 Space c f。它异步修改当前 Buffer,不会保存文件。等格式变化完成后,再用 F1write →两次 Enter

语言专属命令

当前 Buffer模式F1 搜索的命令效果
Python,BasedPyright 已附加普通LspPyrightOrganizeImports请求 BasedPyright 整理导入
Python,BasedPyright 已附加普通LspPyrightSetPythonPath命令行补充解释器路径后,重配当前 LSP
C/C++,clangd 已附加普通ClangdSwitchSourceHeader在源文件与头文件间切换
C/C++,clangd 已附加普通ClangdShowSymbolInfo显示 clangd 符号信息
Rust,rust-analyzer 已附加普通LspCargoReload重新载入当前 Cargo 工作区

右侧终端和格式化

模式按键效果
普通、终端输入Ctrl-\打开或隐藏右侧 Snacks 终端,shell 进程会保留
终端输入快速按两次 Esc进入终端普通模式
终端普通i回终端输入模式
终端普通q隐藏当前 Snacks 终端
终端普通Ctrl-w h/l去左侧代码 / 右侧终端
ExplorerCtrl-t在所选目录开终端
普通Space c f异步格式化当前 Buffer

测试、构建、Git 提交与 git rebase --continue 都在右侧终端执行。

Gitsigns:逐块处理改动

新文件在首次 git add 前没有正常的 Gitsigns gutter hunk 体验,因为 attach_to_untracked 为关闭状态。

浏览与查看

模式按键效果
普通] c/[ c下一个 / 上一个 Git hunk
普通Space h P预览当前 hunk;P 要大写
普通Space h b显示当前行完整 blame
普通Space t b切换行尾 blame
普通Space t d显示或隐藏已删除行

在 diff Window 中,] c[ c 会自动使用 Neovim 原生差异块跳转。

暂存与恢复

模式按键效果
普通Space h s暂存当前 hunk
可视Space h s暂存选定行范围
普通Space h u撤销本次 Neovim 会话最近一次 stage_hunk
普通Space h S暂存当前文件全部 hunks
普通Space h r重置当前 hunk 的工作区内容
可视Space h r重置选定行范围的工作区内容
普通Space h R重置当前文件全部 hunks

Space h rSpace h R 没有确认框,会立刻改写 Buffer 内容。大写 R 影响整个文件,执行前应先确认目标和修改范围。

单文件 Git 对照

模式按键效果
普通Space h d当前文件与 Git index 对照
普通Space h D当前文件与 HEAD~ 对照

Which-key 把 Space h D 描述成 Diff project,实际效果只涉及当前文件和父提交。全项目审查请用 Space g s

三种代码对照怎么选

需求模式入口结果
比较任意两个已打开文件普通,各 Window两边分别用 F1diffthis → 两次 Enter当前 Tab 的两个 Window 进入原生 diff
看当前文件未暂存内容普通Space h d当前文件与 index 并排
看项目全部 Git 变更普通Space g s新建完整 Diffview Tab

原生 diff 中:

模式按键效果
普通,diff Window] c/[ c下一 / 上一差异块
普通,diff Windowd o从另一侧取得当前差异
普通,diff Windowd p把当前差异送到另一侧
普通,diff WindowF1diffoff → 两次 Enter关闭当前 Window 的 diff 模式

dodp 会改动文本。方向拿不准时,先保存或提交基线。

Diffview:全项目审查

进入前先保存全部相关文件。Diffview 读取的是工作树状态,未保存内容可能不会出现在对照结果中。

全局导航

模式按键效果
普通Space g s打开 Git 变更 Diffview
DiffviewTab/Shift-Tab下一 / 上一个变更文件
Diffview diff Window] c/[ c下一 / 上一个差异块
DiffviewSpace e聚焦文件面板
DiffviewSpace b显示或隐藏文件面板
Diffviewg Ctrl-x轮换 diff 布局
Diffviewg?显示当前面板帮助
Diffview diff Windowgf在前一个 Tab 打开真实工作文件
Diffview diff WindowCtrl-w Ctrl-f分屏打开真实工作文件
Diffview diff WindowCtrl-w g f新 Tab 打开真实工作文件
DiffviewF1DiffviewClose → 两次 Enter关闭整个 Diffview

q 无法关闭整个 Diffview。它在不同子窗口有局部含义;使用 DiffviewClose 最稳。

文件面板

模式按键效果
Diffview 文件面板j/k下移 / 上移
Diffview 文件面板Enterol查看所选文件
Diffview 文件面板s-暂存 / 取消暂存整份文件
Diffview 文件面板S暂存全部文件
Diffview 文件面板U取消暂存全部文件
Diffview 文件面板R刷新视图
Diffview 文件面板X把文件恢复到左侧版本

X 没有确认框,会直接还原文件。插件会把旧内容写入 Git object database,并显示一条可能用于恢复的命令,但通知很容易错过,因此使用前必须确认文件和版本。

“Changes”组的左侧是 Git index,右侧是 working tree;“Staged changes”组的左侧是 HEAD,右侧是 Git index。index 所在一侧可以编辑,保存后会直接改变暂存区。如果只是查看差异,不要在 index 一侧修改内容。

Merge 与 Rebase 冲突

仓库处在 merge 或 rebase 冲突状态时,打开 Diffview 会进入三方布局。

逐个冲突处理

模式按键效果
Diffview 冲突 Window] x/[ x下一 / 上一个冲突
Diffview 冲突 WindowSpace c o当前冲突采用 ours
Diffview 冲突 WindowSpace c t当前冲突采用 theirs
Diffview 冲突 WindowSpace c b当前冲突只保留共同祖先 base 内容
Diffview 冲突 WindowSpace c a按 ours → base → theirs 拼接当前冲突并删除标记
Diffview 冲突 Windowdx删除当前冲突区域

原生 diff 取块

模式按键效果
三方结果 Window2do取得 ours 窗口的当前 hunk
三方结果 Window3do取得 theirs 窗口的当前 hunk
四方结果 Window1do取得 base 窗口的当前 hunk

整文件操作:高风险区

模式按键效果
Diffview 冲突 WindowSpace c O全文件采用 ours
Diffview 冲突 WindowSpace c T全文件采用 theirs
Diffview 冲突 WindowSpace c B每处冲突都只保留共同祖先 base 内容
Diffview 冲突 WindowSpace c A每处冲突都按 ours → base → theirs 拼接并删除标记
Diffview 冲突 WindowdX删除全文件所有冲突区域

大写命令与 dX 作用于整份文件。rebase 期间,Git 的 ours 通常指目标分支状态,theirs 通常指正在应用的提交,这与普通 merge 时的直觉可能相反。

这些选择动作读取结果文件中的冲突标记。缺少 ||||||| BASE 标记时,b/B 会把 BASE 当作空内容,可能清空当前冲突或当前文件中的全部冲突;a/A 会拼接现有的 ours 与 theirs。BASE 标记存在但内容为空时,b/B 留下的结果也为空。使用这四个键前,应先确认是否存在 BASE 段及其内容。

完成选择后仍需:

  1. 保存结果文件。
  2. 暂存已解决文件。
  3. 在终端执行 git merge --continuegit rebase --continue

Quickfix 与 Quicker

在项目 grep Picker 中按 Ctrl-q,可以把结果加入 Quickfix。

模式按键效果
PickerCtrl-q把标记项或当前结果集加入 Quickfix
Quickfixj/k下移 / 上移
QuickfixEnter跳到当前结果
QuickfixCtrl-w q关闭 Quickfix Window
普通F1copen → 两次 Enter重新打开当前 Quickfix 列表
Quickfixi进入编辑模式,直接修改结果行中的项目文本
Quickfix 普通dd删除当前结果列表行;写入后只移除该条目,源文件对应行保持原样
QuickfixF1write → 两次 Enter把修改过的结果文本批量应用到目标文件

Quicker 默认允许编辑。写入 Quickfix 会跨文件改项目,并自动保存此前处于未修改状态的目标 Buffer。wqall 也可能触发这次写回。把 Quickfix 编辑当作批量重构,先提交基线,再动笔。

会话:恢复布局

模式按键效果
普通Space s c保存当前会话布局
普通Space s l选择并载入一份会话
普通Space s l t载入最近会话
普通Space s d选择并删除会话记录

Space s l 同时是 Space s l t 的前缀,所以前者可能等待约 500 毫秒。

会话保存 cwd、文件 Buffer、Window、Tab 与折叠布局。未写入磁盘的文本内容不会进入会话文件。Space s c 是布局快照,无法代替保存文件。

配置会在退出时尝试保存当前 cwd 的会话,并在无参数启动时自动载入全局最近会话。进入明确项目时使用:

console
cd path/to/project
nvim .

带上目录参数后,不会自动载入最近会话,而是直接打开当前项目的 Explorer。

载入另一份会话会删除当前 Buffer 集。确认框含义如下:

选择效果
Yes先写入全部修改,再载入
No丢弃修改,再载入
Cancel取消载入,保留现场

保存会话前,配置会关闭全部 Diffview。Session Manager 还会清理无法恢复的工具 Buffer,手动保存会话时 Explorer、Quickfix 或其他插件面板可能消失。

语言能力矩阵

“语法”表示 Treesitter 高亮和缩进解析;“LSP”表示语言级补全、诊断、导航与重构入口;具体动作仍取决于服务器对当前语言和项目的支持。

文件类型Treesitter 语法已配置 LSP格式化能力重要边界
Bash / shbash-language-server当前 LSP 不提供可用格式器通常以 .git 为项目根
C / C++clangdConform 可回退到 clangd准确分析常需要 compile_commands.json 等构建信息
JSON / JSONC / JSON5JSON 有vscode-json-language-serverLSP 明确提供格式化通常以 .git 为根
Markdownmarksman当前 LSP 不提供可用格式器根标记为 .git 或 .marksman.toml
Nixnixd显式配置 nixfmt,能力最确定根标记为 flake.nix 或 .git
PythonBasedPyrightBasedPyright 不提供格式化诊断模式为 openFilesOnly;根标记含 pyproject.toml、requirements.txt、.git
Rustrust-analyzer可走 LSP,通常还需要 rustfmt以 Cargo.toml、rust-project.json 或 .git 判定根
TOMLTaplo可走 Taplo LSP通常以 .git 为根
CSS无已配置格式器仍有路径、snippet、Buffer 文字补全
Dockerfile无已配置格式器没有语言级诊断与重构
gitignore无已配置格式器仅语法层能力
HTML无已配置格式器没有 HTML LSP
JavaScript / TypeScript / TSX无已配置格式器没有 tsserver、typescript-language-server 或 Prettier
YAML无已配置格式器没有 YAML LSP

全局默认的 shiftwidthtabstop 都是 8,并启用空格缩进。Python ftplugin 通常设为 4,JSON 与 YAML 通常设为 2。Sleuth 会根据已有文件判断缩进,.editorconfig 则可以提供更可靠的项目规则。如果新建空文件时出现 8 空格缩进,说明当前正在使用全局默认值。

大于约 1.5 MB 或平均行很长的文件会进入 Snacks bigfile 模式,LSP、Treesitter 等昂贵功能可能关闭。这属于性能保护。

高风险操作总表

执行前先保存并确认 Git 基线

表中的操作可能删除文件、丢弃未保存修改或批量改写内容。执行前先保存、预览,并确认存在可恢复的 Git 基线。

风险级别模式或界面按键或动作可能影响安全习惯
Explorerd当前项或全部多选项永久删除先提交;核对多选标记
普通 / 可视Space h r丢弃当前 hunk 或选区工作树修改先预览 hunk
很高普通Space h R丢弃当前文件全部 hunks先提交或另存
Diffview 文件面板X把文件直接恢复到左侧版本记下通知中的恢复命令
Diffview 的 index 一侧编辑后保存直接改 Git 暂存区Changes 看左侧,Staged changes 看右侧
很高冲突 Window大写 O/T/B/AdX处理整文件全部冲突逐块处理优先
Quickfix编辑后 writewqall跨文件批量修改并可能自动保存先提交基线
Buffer Picker删除后确认 No丢弃未保存 Buffer 修改想退出请选择 Cancel
Session load确认 No丢弃当前 Buffer 修改先 wall 或选 Cancel
ExplorerCtrl-c改变当前 Tab 的 cwd 与搜索范围范围异常时检查 cwd
mini.ai对象查找命令可能命中后方约 50 行内对象先用可视模式确认范围
mini.surround删除或替换包围符会改动覆盖光标的包围结构先用 sh 高亮确认

按症状排错

Leader 组合没有反应
  1. Esc 回普通模式。
  2. 依次按键,Leader 无需按住。
  3. Space 后停一下,检查 Which-key 是否显示目标。
  4. LSP 映射只在 LSP 已附加的 Buffer 中出现。
  5. Space s l 会因较长前缀等待约半秒。
启动后打开了另一个项目

无参数 nvim 会自动载入全局最近会话。退出后进入目标目录,再运行 nvim .。需要确认当前位置时,用 F1 搜索 pwd,再按两次 Enter

grep 只搜到某个子目录

Explorer 的 Ctrl-c 可能改过 Tab-local cwd。用 F1pwd → 两次 Enter 检查;最省心的复位方法是从项目根重新运行 nvim .

Picker 看不到隐藏文件或 ignored 文件

在 Picker 按 Alt-h 切换隐藏文件,按 Alt-i 切换 ignored 结果。Explorer 中对应 HI

Explorer 搜索后按 Enter 仍没打开

/ 搜索时,第一次 Enter 回树定位,第二次才打开目标。

LSP 跳转、重命名或诊断没有出现
  1. 查看语言能力矩阵,确认该文件类型配置了 LSP。
  2. git init,或创建该语言常用根标记文件。
  3. 保存文件,确认扩展名与 filetype 正确。
  4. Space l 等待 Which-key;没有子项通常表示 LSP 尚未附加。
  5. F1checkhealth → 两次 Enter 查看健康检查,用 F1messages → 两次 Enter 查看启动错误。

Python 的 BasedPyright 只分析已打开文件。某个未打开模块的诊断没有出现,属于当前 openFilesOnly 设置的预期表现。

格式化键没有变化
  1. 等一小会儿,Space c f 是异步操作。
  2. F1ConformInfo → 两次 Enter 查看格式器。
  3. Python、Markdown、Bash 当前没有可用格式器。
  4. JavaScript、TypeScript、YAML 等仅配置语法解析,没有格式器。
  5. 格式化成功后还要手动保存。
  6. Space l t f 无法开启保存格式化,因为全局开关处于关闭状态。
新文件旁边没有 Git 标记

未跟踪文件不会附加完整 Gitsigns。先在终端执行 git add 文件名 ,再回 Neovim;必要时重新打开 Buffer。

Diffview 内容落后

先保存工作文件,再在 Diffview 文件面板按 R。进入 Diffview 前执行一次 F1wall → 两次 Enter,可以避免未保存修改没有出现在对照结果中。

Diffview 按 q 关不掉

F1 搜索 DiffviewClose,连按两次 Enter 执行。保存会话时配置也会自动关闭全部 Diffview。

终端里回不到代码

最快方式是 Ctrl-\ 隐藏终端。想保留终端可见时,快速双击 Esc,再按 Ctrl-w h

缩进突然变成八格

这是全局默认。给项目添加 .editorconfig,或先在已有风格的文件中编辑,让 Sleuth 推断缩进。

大文件没有 LSP 或 Treesitter

Snacks bigfile 正在保护交互速度。文件超过约 1.5 MB、行平均特别长时,这些能力会被主动关闭。

最后的单页速查

想做什么模式最短按键
回普通模式插入、可视Esc
保存当前文件普通F1write → 两次 Enter
找文件普通Space e
搜项目文字普通Space /
换 Buffer普通Space ,
跳定义 / 回来普通,LSPSpace l g d / Ctrl-o
下一条诊断普通,LSPSpace l g n
重命名普通,LSPSpace l n
打开终端普通Ctrl-\
格式化普通Space c f
下一 Git hunk普通] c
预览 / 暂存 hunk普通Space h P / Space h s
全项目审查普通Space g s
关闭 DiffviewDiffviewF1DiffviewClose → 两次 Enter
保存全部并退出普通F1wqa → 两次 Enter

到这里,课程主线已经完成。可以回到 课程目录 选择章节复练,也可以直接打开真实项目,用实际需求继续练习。后续重点是重复使用这些操作并形成稳定习惯。

本文档采用 知识共享 署名-相同方式共享 4.0 协议 进行许可。