这份速查表对应我本地 ~/.config/nvim 配置。配置过程见 macOS 下从零配置 Neovim(关于LSP和DAP的配置还没有写喵,等以后有空了再写吧)。
按键写法
- Leader 是空格:
<Space>rn表示依次按空格、r、n,不需要同时按。 <C-w>h表示先同时按Ctrl+w,松开后再按h;<CR>是回车,<BS>是退格。- 普通模式执行命令,插入模式输入文字,可视模式选择文字;终端输入模式会把按键交给终端程序。
- 除非特别标注,快捷键都在普通模式使用。带
:的命令输入后按回车。
常用速查
以下都是当前配置中的自定义快捷键。
| 功能 | 按键 | 使用位置 |
|---|---|---|
| 退出插入模式 | jj | 插入模式 |
| 开关右侧目录树 | <Space>e | 普通模式 |
| 在目录树中定位当前文件 | <Space>f | 普通模式 |
| 打开左终端、右目录布局 | <Space>ui | 普通模式 |
| 开关左侧终端 | <Space>tt | 普通模式 |
| 离开终端输入模式 | <Esc><Esc> | 终端输入模式 |
| 从终端切到右侧编辑窗口 | <C-l> | 终端输入模式 |
| 跳到定义 / 查找引用 | gd / gr | LSP 已连接的代码缓冲区 |
| 查看符号文档 | K | LSP 已连接的代码缓冲区 |
| 重命名符号 | <Space>rn | LSP 已连接的代码缓冲区 |
| 查看当前行诊断 | <Space>d | LSP 已连接的代码缓冲区 |
| 打开撤销树 | <F5> | 普通模式 |
| 添加或删除断点 | <F9> | 代码缓冲区 |
| 开始或继续调试 | <Space>dc | 已配置调试目标的项目 |
基础移动与编辑
模式与单词移动
| 按键 | 作用 | 来源 / 模式 |
|---|---|---|
i / a | 在光标前 / 后开始输入 | 原生 / 普通 |
I / A | 在本行首个非空字符前 / 行末开始输入 | 原生 / 普通 |
o / O | 在下方 / 上方新建一行并开始输入 | 原生 / 普通 |
<Esc> | 回到普通模式 | 原生 / 插入、可视 |
jj | 回到普通模式 | 自定义 / 插入 |
w / b / e | 下一个单词开头 / 上一个单词开头 / 单词末尾 | 原生 / 普通 |
<Esc>b / <Esc>f | 执行 b / w,向前 / 向后移动到单词开头 | 自定义 / 普通 |
<Esc>b / <Esc>f | 临时执行一次 b / w,然后继续输入 | 自定义 / 插入 |
<Esc>b 和 <Esc>f 是终端发送的按键序列。如果 macOS 终端将 Option 配置为 Meta / Esc 前缀,通常可以用 Option+b、Option+f 触发;实际行为取决于终端设置。这里的向后移动对应 w,落点是单词开头。
定位、选择与修改
以下为 Neovim 原生操作。
| 按键 | 作用 |
|---|---|
h / j / k / l | 左 / 下 / 上 / 右移动 |
5j / 5k | 向下 / 向上移动 5 行,数字可替换 |
0 / ^ / $ | 行首 / 本行首个非空字符 / 行末 |
gg / G / 42G | 文件开头 / 文件末尾 / 第 42 行 |
<C-d> / <C-u> | 向下 / 向上滚动半屏 |
zz | 把当前行放到窗口中间 |
v / V / <C-v> | 按字符 / 整行 / 矩形块选择 |
yy / dd | 复制 / 删除当前行 |
p / P | 在光标后 / 前粘贴,整行内容则放在下方 / 上方 |
ciw / diw / yiw | 修改 / 删除 / 复制光标所在单词 |
ci" / ci( | 修改双引号 / 圆括号内部的内容 |
u / <C-r> | 撤销 / 重做 |
. | 重复上一次修改 |
>> / << | 增加 / 减少当前行缩进 |
== | 按当前缩进规则重新缩进这一行 |
当前配置显示相对行号,看到目标在下面第 8 行时,可以直接按 8j。缩进宽度为 4,Tab 会转换为空格。
搜索与替换
| 按键 / 命令 | 作用 |
|---|---|
/关键字 / ?关键字 | 向后 / 向前搜索,回车确认 |
n / N | 沿搜索方向继续 / 反向查找 |
* / # | 向后 / 向前搜索光标所在单词 |
:%s/旧内容/新内容/gc | 全文件逐个确认替换;匹配内容按正则解释 |
:noh | 暂时清除搜索高亮 |
这里的搜索作用于当前文件。当前配置没有安装 Telescope 主插件,也没有定义 <Space>ff、<Space>fg;<Space>f 的用途是在目录树中定位当前文件。
文件与右侧目录树
<Space>e 开关 nvim-tree,<Space>f 打开目录树并定位当前文件。目录树位于右侧,宽度为 30 列,打开文件后不会自动关闭,默认显示点文件。
下面是当前安装的 nvim-tree 默认键位,只在目录树窗口中使用。
| 按键 | 作用 |
|---|---|
j / k | 向下 / 向上选择节点 |
<CR> / o | 打开文件,或展开 / 折叠目录 |
<BS> | 折叠父目录 |
P | 移动到父目录节点 |
- | 把目录树根目录切换到上一级 |
<C-v> / <C-x> | 在垂直 / 水平分屏中打开文件 |
<C-t> | 在新标签页打开文件 |
a | 新建文件或目录,目录名以 / 结尾 |
r | 重命名 |
c / x / p | 复制 / 剪切 / 粘贴文件或目录 |
d | 删除文件或目录,留意确认提示 |
y / Y / gy | 复制文件名 / 相对路径 / 绝对路径 |
f / F | 开始 / 清除目录树名称过滤 |
H | 切换点文件显示 |
R | 刷新目录树 |
W / E | 折叠全部 / 展开全部目录 |
g? | 显示目录树快捷键帮助 |
q | 关闭目录树 |
同一个键在不同窗口里作用不同:代码窗口的 yy 复制文本,目录树里的 y 复制文件名;目录树的 d 会操作磁盘上的文件。
文件保存和切换使用原生命令:
| 命令 | 作用 |
|---|---|
:w / :wa | 保存当前 / 所有已修改文件 |
:q / :wq | 关闭当前窗口 / 保存后关闭当前窗口 |
:q! | 强制关闭当前窗口,可能丢弃未保存的修改 |
:qa | 退出全部窗口,未保存修改会阻止退出 |
:e 路径 | 打开文件 |
:ls | 查看缓冲区列表 |
:b 编号 | 切换到指定缓冲区 |
:bn / :bp | 下一个 / 上一个缓冲区 |
窗口与左侧终端
窗口切换
以下都是原生窗口命令,在普通模式使用。缓冲区是打开的内容,窗口是显示内容的区域;多个窗口可以显示同一个缓冲区。
| 按键 / 命令 | 作用 |
|---|---|
<C-w>h / <C-w>l | 切到左侧 / 右侧窗口 |
<C-w>j / <C-w>k | 切到下方 / 上方窗口 |
<C-w>w | 循环切换窗口 |
:vs / :sp | 左右 / 上下分屏 |
<C-w>= | 均分窗口大小 |
<C-w>> / <C-w>< | 增加 / 减少窗口宽度 |
<C-w>+ / <C-w>- | 增加 / 减少窗口高度 |
<C-w>c | 关闭当前窗口 |
ToggleTerm 终端
| 按键 | 作用 | 模式 / 来源 |
|---|---|---|
<Space>tt | 开关编号 1 的左侧终端 | 普通 / 自定义 |
<Space>ui | 打开右侧目录树,并打开或保留编号 1 的左侧终端 | 普通 / 自定义 |
<Esc><Esc> | 离开终端输入模式,终端保持打开 | 终端输入 / 自定义 |
<C-l> | 离开终端输入模式,并切到右侧相邻窗口 | 终端输入 / 自定义 |
<C-\><C-n> | 离开终端输入模式 | 终端输入 / 原生 |
i | 重新开始向终端输入 | 终端缓冲区的普通模式 / 原生 |
<Space>ui 是打开工作布局的入口:左侧终端约占总宽度的 20%,右侧目录树宽 30 列,中间留给代码。已经打开的终端会被复用,再按一次也不会把它关闭。
终端打开后自动进入输入模式。此时 jj 会输入到终端,空格开头的快捷键也不会按普通模式映射执行。先按两次 Esc,才能使用 <Space>tt 隐藏终端;隐藏后进程仍可继续运行,在 shell 中执行 exit 才会结束该 shell,终端随之关闭。
当前配置在正常退出 Neovim 时会清理终端缓冲区;如果仍有未保存的普通文件,会先保留终端。需要持续运行的任务应放在独立终端或会话管理器中。
LSP:跳转、重命名与诊断
当前显式启用的语言服务器是 clangd,启动路径为 /usr/bin/clangd,主要用于 C / C++。项目根目录标记包含 compile_commands.json、.clangd、.git。下面这些自定义映射会在 LspAttach 时绑定到对应缓冲区。
| 按键 | 作用 |
|---|---|
gd | 跳到定义 |
gD | 跳到声明 |
gr | 查找引用 |
K | 查看光标处符号文档 |
<Space>rn | 重命名符号 |
<Space>ca | 请求代码操作 |
<Space>d | 浮窗查看当前行诊断 |
[d / ]d | 跳到上一条 / 下一条诊断 |
跳转后可用原生 <C-o> 返回较早的跳转位置,<C-i> 前往较新的位置。查找引用出现 quickfix 列表时,可以用 :copen 打开,:cn / :cp 切换结果。
这套配置没有额外安装补全插件。LSP 连接并提供补全能力后,可以在插入模式用原生 <C-x><C-o> 手动触发 omni 补全,再用 <C-n> / <C-p> 选择、<C-y> 接受、<C-e> 取消;没有自定义 Tab 补全映射。
如果键位没有反应,先运行 :checkhealth vim.lsp 查看服务器状态。C / C++ 工程缺少正确的编译参数时,即使 clangd 已连接,头文件解析和跳转结果也可能不完整。
面包屑与撤销树
Dropbar 面包屑
| 按键 | 作用 | 来源 |
|---|---|---|
<Space>; | 进入面包屑选择模式,按显示的提示选择路径或符号 | 自定义 |
[; | 跳到当前上下文开头;已经在开头时尝试上一级 | 自定义 |
]; | 打开当前上下文菜单,选择下一级上下文 | 自定义 |
<CR> | 激活菜单中的当前条目 | 插件默认 / 菜单内 |
q / <Esc> | 关闭菜单 | 插件默认 / 菜单内 |
]; 会打开选择菜单,并非直接跳到下一个函数;能列出哪些代码符号取决于当前文件的符号来源是否可用。
Undotree 撤销树
<F5> 是自定义的撤销树开关,不是启动调试。打开后用窗口切换键进入撤销树窗口,再使用以下插件默认键位:
| 按键 | 作用 |
|---|---|
j / k | 移动到树中的条目 |
<CR> | 恢复到光标所在的撤销状态 |
J / K | 切到上一个 / 下一个撤销状态 |
u / <C-r> | 撤销 / 重做 |
D | 开关差异面板 |
<Tab> | 把焦点切回编辑窗口 |
? / q | 显示帮助 / 关闭撤销树 |
当前启用了持久化撤销,历史目录为 ~/.nvim/undo,重开文件后仍可继续查找历史修改。配置关闭了交换文件,撤销历史和交换文件承担不同用途,仍要及时保存。
DAP:RISC-V 调试
当前 nvim-dap 使用 riscv64-elf-gdb -q -nx --interpreter=dap 作为适配器。以下是自定义键位,除表达式求值外都在普通模式使用。
| 按键 | 作用 |
|---|---|
<F9> | 添加或删除当前行断点 |
<Space>dc | 开始调试或继续执行 |
<F10> | 单步跳过:执行当前语句,不进入函数内部 |
<F11> | 单步进入函数 |
<F12> | 跳出当前函数 |
<Space>du | 开关调试面板 |
<Space>de | 查看光标处表达式的值;也支持可视模式选区 |
<Space>dr | 开关调试控制台 REPL |
<Space>dq | 结束调试并关闭调试面板 |
调试连接初始化后,底部会自动打开高度 12 行的面板,包含变量作用域、调用栈和监视表达式;会话终止或程序退出时自动关闭。代码行尾会显示变量值,断点标记为 ●,当前执行位置标记为 ▶。
使用前提:全局 dap.lua 只定义了适配器,没有提供具体程序的启动或附加配置。 项目还需要提供对应的 dap.configurations 或适用的 .vscode/launch.json,并确保 GDB 可用。调试 xv6 时,还需要先启动 QEMU 的 GDB 服务并设置符号文件、连接目标;单独按 <Space>dc 不会自动完成这些步骤。环境准备可参考 xv6 的 macOS 环境记录。
Mac 键盘的功能键如果被系统接管,需要配合 fn 使用,或在系统设置中启用标准功能键。
配置文件
| 文件 | 负责的快捷键或行为 |
|---|---|
init.lua | jj、Esc 前缀的单词移动、基础选项与持久化撤销 |
lua/config/lazy.lua | 插件加载、Leader / LocalLeader 设置 |
lua/plugins/nvim-tree.lua | <Space>e、<Space>f、右侧目录树 |
lua/plugins/toggleterm.lua | <Space>tt、<Space>ui、终端内双 Esc 与 <C-l> |
lua/plugins/lsp.lua | clangd 和 LSP 缓冲区映射 |
lua/plugins/dropbar.lua | <Space>;、[;、]; |
lua/plugins/undotree.lua | <F5> |
lua/plugins/dap.lua | 断点、单步、调试面板与 REPL |
lazy-lock.json | 本次安装的插件版本快照 |
这些路径都相对于 ~/.config/nvim/。LocalLeader 虽然在 init.lua 中设为空格,但随后被 lua/config/lazy.lua 覆盖为反斜杠;本文列出的自定义快捷键使用的是 Leader,仍然是空格。
遇到冲突时,在实际使用的窗口中查询映射来源:
:verbose nmap <Space>e
:verbose nmap gd
:verbose imap jj
:verbose tmap <C-l>LSP 键位要在已连接服务器的代码缓冲区中查询,终端键位要在已打开的 ToggleTerm 缓冲区中查询。原生命令可用 :help 按键 查阅,例如 :help CTRL-W、:help i_CTRL-X_CTRL-O;目录树按 g?,撤销树按 ?,查看当前安装版本的帮助。
