Files
notes/resource/系统/vim 快捷键与操作手册.md
T
2026-03-01 01:43:46 +08:00

584 lines
31 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# LazyVim / Neovim 快捷键与操作手册
> 说明:本文是基于 LazyVim 的个人速查笔记,内容以“使用场景 → 快捷键 → 结果/备注”为主。
>
> 记号约定(尽量统一):
>
> - `Ctrl-x` 统一写作 `<C-x>`(例如 `Ctrl-r` → `<C-r>`
> - `Alt-x` 统一写作 `<A-x>`
> - `<Space>` 表示 LazyVim 默认 `<leader>`
---
## 1. 常用模式切换与通用操作
| 快捷键 | 模式 | 作用与说明 |
|---|---|---|
| `<C-r>` | Insert | 进入“寄存器”迷你模式,可选择寄存器内容粘贴 |
| `<C-r> +` | Insert | 从系统剪贴板粘贴文本 |
| `<C-r>` | Normal | 重做 (Redo),撤销上一次的 `u` 操作 |
| `"`(双引号) | Normal | 指定后续操作(如 `y`, `p`)要使用的寄存器 |
| `gi` | Normal | 跳转至上次进入 Insert 的位置,并重新进入 Insert |
| `g` | Normal | 进入 "Go To" 迷你模式,停顿会显示所有 `g` 开头命令 |
---
## 2. 代码导航(Getting Around
### 2.1 屏幕内快速跳转(flash.nvim / Seek
| 快捷键 | 模式 | 作用与说明 |
|---|---|---|
| `s` | Normal | 进入 Seek 模式(flash.nvim):输入目标字符,按高亮标签跳转 |
### 2.2 屏幕与页面滚动
| 快捷键 | 模式 | 作用与说明 |
|---|---|---|
| `<C-d>` | Normal | 向下滚动半屏 (Down) |
| `<C-u>` | Normal | 向上滚动半屏 (Up) |
| `<C-f>` | Normal | 向下滚动整页 (Forward) |
| `<C-b>` | Normal | 向上滚动整页 (Backward) |
| `<C-e>` | Normal | 向上滚动一行(光标不动) |
| `<C-y>` | Normal | 向下滚动一行(光标不动) |
| `zt` | Normal | 将当前行滚动到屏幕顶部 (Top) |
| `zz` | Normal | 将当前行滚动到屏幕中部 (Center) |
| `zb` | Normal | 将当前行滚动到屏幕底部 (Bottom) |
### 2.3 光标移动(Motions
| 分类 | 快捷键 | 模式 | 作用与说明 |
|---|---|---|---|
| 基础移动 | `h` / `j` / `k` / `l` | Normal | 左 / 下 / 上 / 右 |
| 计数移动 | `<数字><命令>` | Normal | 重复执行命令 N 次;例:`5j` |
| 行内查找 | `f<字符>` | Normal | 向后查找并跳到第 1 个指定字符 |
| | `<数字>f<字符>` | Normal | 向后查找并跳到第 N 个指定字符 |
| | `F<字符>` | Normal | 向前查找字符 |
| | `t<字符>` / `T<字符>` | Normal | 向后/向前跳到指定字符的前一个/后一个位置 |
| 按词移动 | `w` / `W` | Normal | 到下一个单词 / 大单词(空格分隔)开头 |
| | `e` / `E` | Normal | 到下一个单词 / 大单词结尾 |
| | `b` / `B` | Normal | 到上一个单词 / 大单词开头 |
| | `ge` | Normal | 到上一个单词结尾 |
| 行内跳转 | `0` | Normal | 行的绝对开头(第 0 列) |
| | `^` | Normal | 行的第一个非空白字符 |
| | `$` | Normal | 行尾 |
| | `g_` | Normal | 行的最后一个非空白字符 |
| 文件跳转 | `gg` | Normal | 文件第一行 |
| | `G` | Normal | 文件最后一行 |
| | `<数字>G``:<数字>` | Normal | 跳到指定行;例:`100G` |
| 历史跳转 | `<C-o>` | Normal | 跳回上一个光标位置 |
| | `<C-i>` | Normal | 前进到下一个光标位置(与 `<C-o>` 相反) |
---
## 3. 文件操作与管理
### 3.1 文件选择器(Telescope
| 快捷键 | 模式 | 作用与说明 |
|---|---|---|
| `<Space><Space>` | Normal | 查找项目文件 (Root),最常用 |
| `<Space>ff` | Normal | 查找项目文件 (Root) |
| `<Space>fF` | Normal | 查找文件 (Cwd,当前工作目录) |
选择器内常用操作:
- `Tab`:标记多个文件
- `<A-s>`:为条目添加标签,按标签字符快速选择
- `<C-d>` / `<C-u>`:滚动结果列表
### 3.2 文件浏览器(Snacks.nvim Explorer
| 快捷键 | 模式 | 作用与说明 |
|---|---|---|
| `<Space>e` | Normal | 打开文件浏览器 (Root) |
| `<Space>E` | Normal | 打开文件浏览器 (Cwd) |
| `?` | 浏览器内 | 显示帮助(查看所有可用操作) |
| `a` / `d` / `r` | 浏览器内 | 添加 / 删除 / 重命名 文件或文件夹 |
| `y` / `p` / `m` | 浏览器内 | 复制 / 粘贴 / 移动 |
| `q``Esc` | 浏览器内 | 关闭浏览器 |
---
## 4. 配置与插件(LazyVim / Lazy Extras
### 4.1 LazyExtras 管理界面
| 命令/按键 | 模式 | 作用与说明 |
|---|---|---|
| `:LazyExtras` | Command | 打开 Lazy Extras 管理界面 |
| `x` | LazyExtras 界面 | 安装或禁用选中的插件 |
| `s` | LazyExtras 界面 | 使用 Seek 模式快速跳转 |
### 4.2 LazyVim 的三类插件(心智模型)
- 内置插件(默认启用):LazyVim 预装且预配置,通常默认不冲突;可自定义,但因集成深,偶尔需要技巧
- Lazy Extras(可选增强):默认不启用;在 LazyVim 提供的“预期可协作”的配置下快速启用常见热门插件
- 第三方未知插件(LazyVim 不特别支持):需要你从零配置,并自行排查键位/命令/UI 冲突;在 LazyVim 中通常数量较少
### 4.3 Lazy Extras 的启用与建议
- 进入方式:
- Dashboard 按 `x`;或命令 `:LazyExtras`
- Dashboard 也可用 `:lua Snacks.dashboard()` 打开(可自行绑键)
- 操作方式:
- 列表中移动到目标 extra,按 `x` 启用/安装;在 Enabled 区对同一项按 `x` 可禁用/卸载(记忆:x = Extra)
- 可能需要重启 Neovim,让 Lazy.nvim 识别并同步依赖
- 建议:
- 启用常用语言的 `lang.*` extras
- 安装 “Recommended plugins”(带星标)
- 非推荐 extras 先别装太多,可能带来行为变化且不易预期
- 深入信息:lazyvim.org → Extras,可查看每个 extra 安装的插件与 LazyVim 提供的配置
### 4.4 禁用内置插件(或关闭内置插件的某个功能)
- 配置目录通常为 `$HOME/.config/nvim`Dashboard 按 `c``<Space>fc` 可快速打开配置文件
- LazyVim 约定:`~/.config/nvim/lua/plugins/` 下任意 Lua 文件都会自动加载,文件名随意
- 禁用某个内置插件:在 `lua/plugins/*.lua` 返回插件表并设置 `enabled = false`,例如禁用 bufferline
- `{ "akinsho/bufferline.nvim", enabled = false }`
- 只关闭 Snacks.nvim 的某个功能而不是整个插件:
-`opts` 里关闭对应 feature(如 `explorer.enabled = false`
- 若要复用该功能占用的快捷键,可在 `keys` 中把对应键设为 `false` 以取消映射(例如 `<leader>e``<leader>E`
### 4.5 修改键位:三种常见落点
- `lua/config/keymaps.lua`:更偏核心/全局的键位(非特定插件)
- 某插件的配置表里写 `keys = { … }`:通常用于“全局键位”来启动/调用插件
- 某插件的 `opts = { … }`:很多插件倾向通过 opts 定义“插件窗口/模式内”的局部键位与行为
#### 4.5.1 `keys` 条目的结构要点
- `keys` 是 Lazy.nvim/LazyVim 的机制:用于声明键位并由管理器统一注册(不是传给插件本身)
- 每条 keys 通常包含:
- 键位(如 `<leader>e`LazyVim leader 通常是 `<Space>`
- 回调(Lua `function() … end`)或命令字符串
- `desc` 描述(用于 Space 菜单/提示)
- 特殊键使用 `<>` 表示:如 `<Right>``<Left>`
#### 4.5.2 LazyVim 的“合并(merge)”行为(关键理解)
- 你在插件文件里写的 `keys``opts` 会与 LazyVim(内置/extra)提供的默认配置进行合并
- 若发生冲突(例如你重新定义了同一个键位),你的配置通常会覆盖默认值
- 优点:无需复制整套默认配置,只写差异,升级更易维护
- 代价:需要理解多来源键位/选项的叠加,冲突可能性更高
#### 4.5.3 mini.files 示例背后的概念(打开位置与 root/cwd)
- 需求示例:希望 mini.files 支持“在项目 root 打开”,并复用原本 Explorer 的键位
- 概念区分:
- root:根据项目标识文件(如 `package.json``Cargo.toml`)推断的项目顶层目录
- cwd:编辑器当前工作目录(不一定等于 root)
- 实现方式:在 `lua/plugins/` 新增一个覆盖文件(作者习惯用 `extend-` 前缀)为 mini.files 增加/覆盖 `keys`,并可额外通过 `opts` 改 mini.files 窗口内映射与窗口尺寸等
#### 4.5.4 当简单合并不够:`opts` 可以是函数
- 如果你要改的是“列表插入/函数行为”等,单纯用表合并不够用
- `opts` 可写成 `function(_, opts) … end`
- 参数 `opts` 是 LazyVim 已生成的旧配置表
- 你的函数要“就地修改”该表(不是返回新表)
- 示例场景:给 Snacks dashboard 的 keys 列表用 `table.insert` 插入新入口(如 “Select Session”)
#### 4.5.5 安装 LazyVim 不认识的第三方插件
-`lua/plugins/` 新建插件文件,返回一个表:
- 第一个元素是 `"owner/repo"`
- 再按需提供 `opts``keys`
- `opts` 的来源:
- 通常等价于插件 README 中 `setup({ … })` 需要的配置表;即使插件没写 Lazy.nvim 指南,也可直接把 setup 配置放进 `opts`
- 若插件不自带键位:用 `keys` 声明并交由 Lazy.nvim 注册(常见做法是把键位与插件放在同一个文件,便于维护)
- 插件发现渠道:`rockerBOO/awesome-neovim`(维护与清理较好)
- 实务结论:LazyVim 已覆盖多数常用“最佳插件”(内置或 extra),你通常只需少量额外插件
#### 4.5.6 小结
- LazyVim 以“内置 / Extras / 第三方自理”的层级管理插件,提供合理默认配置并允许小幅覆盖
- 日常改动主要落在 `lua/plugins/`:通过 `enabled``keys``opts`(以及必要时 `opts` 函数)实现禁用、改键与改行为
- 你需要重点掌握:键位与选项的合并规则、冲突处理、以及 root 与 cwd 的概念差异
---
## 5. 基础编辑(编辑模型与常用命令)
> 本节保留“长表格”形式,便于全文搜索与对照(语法模型 + 示例混排)。
| 分类 | 快捷键 | 模式 | 作用与说明 |
|---|---|---|---|
| 心智模型/语法 | `<count><motion>` | Normal | 基本导航模型:计数 + 移动;count 通常表示重复次数;部分命令(如 `G`)把 count 当作绝对值;Seek 允许带 count 但会被忽略 |
| 心智模型/语法 | `<verb><count><motion>` | Normal | 操作模型:先动词(operator/verb)再用 motion 指定范围;省略 verb 时默认是“只移动” |
| 心智模型/语法 | `<count><verb><count><motion>` | Normal | 理论上 verb 和 motion 都可带 count;实践中更常见 `<count><verb><motion>``<verb><count><motion>` |
| 插入模式(模型边界) | `i/I/a/A` + 可带 count(例:`5ifoo<Esc>` | Normal → Insert → Normal | 进入 Insert 不属于 motion/verb,但可用 count 重复插入文本;例:`80i*<Esc>` 快速插入 80 个 `*`;这类命令不能像 motions 那样和 verbs 组合 |
| 删除 | `d<motion>` | Normal | 删除光标到 motion 目标之间文本;执行后仍在 Normal,便于继续组合其他 `<verb><motion>` |
| 删除示例 | `dh` | Normal | 删除光标左侧一个字符 |
| 删除示例 | `d3w` | Normal | 删除 3 个词(按 `w` 的词移动定义) |
| 删除示例 | `3dw` | Normal | 删除 1 个词,重复 3 次(语义是重复 operator;结果通常等价于 `d3w`,但属于不同组合方式) |
| 删除示例 | `d^` | Normal | 删除从光标到行首第一个非空白字符的位置(含义由 `^` motion 决定) |
| 删除示例 | `d2fe` | Normal | 删除到光标后第 2 个 `e`(包含该 `e`);`f` 是“到某字符并包含它” |
| 删除示例 | `d2Ta` | Normal | 删除到光标前第 2 个 `a`(不包含该 `a`);`T` 是“到某字符之前” |
| 删除示例(Seek 结合) | `dsfoos` | Normal | 使用 Seek 查找 `foo` 并选标签 `s`:删除当前光标与 Seek 跳转位置之间文本;Seek 总跳到匹配词开头:目标在光标后时会删到 `f`(可能不含 `oo`),目标在光标前时可能连 `foo` 三字母都被删掉。注意:录宏时不建议用 Seek(回放无法理解标签) |
| 修改(删除后进入插入) | `c<motion>` | Normal → Insert | “change”:删除范围并立即进入 Insert;与 `d<motion>` 再进入插入相比更省键;也使 `.` 能完整重复“删除 + 插入” |
| 行尾操作(按模型) | `d$` / `c$` | Normal / Normal → Insert | 删除/修改从光标到行尾;`$` 是到行尾的 motion |
| 行尾操作(快捷) | `D` / `C` | Normal / Normal → Insert | `D` 等价 `d$``C` 等价 `c$` |
| 行首方向(无单键反向快捷) | `d^` / `d0` | Normal | 用 `d^` 删到第一个非空白字符,或用 `d0` 删到第 1 列(无视空白) |
| 整行操作(重复动词) | `dd` | Normal | 删除整行(“重复 verb”作为整行范围的特殊写法;motion 含义依赖 verb,算模型的一个“破例”) |
| 整行操作(重复动词) | `cc` | Normal → Insert | 删除整行并进入 Insert,重写这一行 |
| 整行计数 | `d3d` / `3dd` | Normal | 删除 3 行:两种写法都可;`3dd` 通常更好按 |
| 单字符删除(按模型) | `dl` / `4dl` | Normal | `dl` 删除光标下字符(用 `l` 作为 motion);`4dl` 删除 4 个字符 |
| 单字符删除(快捷) | `x` / `5x` | Normal | `x` 删除光标下 1 字符;可带 count |
| 反向单字符删除 | `X` | Normal | 删除光标左侧字符;可带 count |
| 单字符替换 | `r{char}` | Normal(短暂进入插入后立刻回 Normal) | 替换光标下字符为接下来输入的 1 个字符;`r` 可带 count(会把若干字符都替换为同一个字符) |
| 合并行(删除换行) | `J` | Normal | Join Lines:合并当前行与下一行(删除行尾换行);可带 count;通常会“智能处理空白” |
| 合并行(不改空白) | `gJ` | Normal | 合并行但不做空白规范化(更“原样”) |
| 大小写:转大写范围 | `gU<motion>` | Normal | 把范围文本转为大写(这里 `gU` 是 verb |
| 大小写:转小写范围 | `gu<motion>` | Normal | 把范围文本转为小写 |
| 大小写:反转单字符 | `~` | Normal | 反转光标下字符的大小写 |
| 大小写:整行 | `gUU` / `guu` | Normal | 通过“重复动词”把整行转为大写/小写 |
| 重复上次编辑 | `.` | Normal | dot repeat:重复上一次“verb 操作”(包括 `c` 的删除范围 + 插入内容) |
| `.` 的计数细节 | `<count>.`(例:`2.` | Normal | `.` 带 count 时不会简单“重复 N 次”,而是会替换被重复命令内部的 count;例:先 `3dd`,再 `2.` 会变为删除 2 行 |
| 宏录制:开始 | `qq` | Normal | 开始录制宏;可录制导航、编辑、插入、搜索、甚至 `:` 命令序列;注意:不要在宏里用 Seek |
| 宏录制:结束 | `q` | Normal | 停止录制并保存当前宏 |
| 宏录制:追加 | `qQ` | Normal | 以追加方式继续录制到同一宏;需要确保光标位置使“拼接后的宏”逻辑成立 |
| 宏回放(最近一次) | `Q` | Normal | 回放最近保存的录制宏;多个宏可用寄存器管理(寄存器章节待补) |
| 撤销 | `u` | Normal | 撤销最近一次改动;一次“改动”可能很大(长时间未退出 Insert 时尤其明显) |
| 重做 | `<C-r>` | Normal | 重做(redo)撤销的改动 |
| Undo 历史分支(概念/建议) | `:help undo-branches` / `undotree` 插件 | Normal | Neovim 记录完整历史并支持类似“分支”的撤销树;少数复杂场景 `undotree` 很有帮助 |
---
## 6. 速查表(LazyVim / Neovim
### 6.1 句子/段落移动(Vim 原生 Motions
| 目标 | 按键(Normal) | 含义/落点 | 计数 | 备注 |
|---|---|---|---|---|
| 下一句 | `)` | 跳到下一句(句末标点 `.?!` 后的空白之后的第一个字符) | `3)` | 也会在空行(段落边界)停下 |
| 上一句/当前句首 | `(` | 跳到当前句开头/上一句 | `2(` | `(`/`)` 和“句子”强绑定 |
| 下一段 | `}` | 跳到下一段(空行分隔的块) | `5}` | 写代码很常用 |
| 上一段 | `{` | 跳到上一段 | `3{` | `{`/`}` 不是跳到花括号字符本身 |
### 6.2 Unimpaired 风格方括号导航(`[` / `]` 系列)
| 场景 | 按键 | 做什么 | 依赖/来源 | 重要备注/坑 |
|---|---|---|---|---|
| 打开提示菜单 | `[``]`(按一下停顿) | 弹出可用组合菜单 | LazyVim | 用来“记不住时查一下” |
| 跳出括号块(到未匹配的括号) | `[{` `]}` `[( ](` `[< ]<` | 跳到上一/下一层的“括号边界”(像 jump out | LazyVim 的 unimpaired 行为 | 不是找下一个字符;找字符用 `f{` / `F{` |
| 跳到“包围我的那种括号”的边界 | `[%` / `]%` | 对当前所在的 `(){}<>[]` 自动识别并跳到开头/结尾 | LazyVim | `[[`/`]]` 不用于跳出 `[]`;跳出方括号常靠 `%`/`[%`/`]%` |
### 6.3 同文件引用跳转(符号引用)
| 场景 | 按键 | 做什么 | 依赖 | 备注 |
|---|---|---|---|---|
| 下一个引用 | `]]` | 跳到光标下变量/函数在同文件的下一处真实引用 | 通常 LSP | 比搜索更准;LazyVim 会高亮其他引用 |
| 上一个引用 | `[[` | 跳到上一处真实引用 | 通常 LSP | `[[`/`]]` 被保留给“引用跳转”,不是“跳出方括号” |
### 6.4 按语言结构跳转(类/函数/方法)
| 目标 | 跳到开始 | 跳到结束(Shift) | 依赖 | 备注 |
|---|---|---|---|---|
| class/type | `[c` / `]c` | `[C` / `]C` | LSP/语法能力 | 质量取决于语言与 LSP 配置 |
| function | `[f` / `]f` | `[F` / `]F` | LSP/语法能力 | `]F` 可能先跳到嵌套函数结尾(不是“跳出当前函数”) |
| method | `[m` / `]m` | `[M` / `]M` | LSP/语法能力 | 同上 |
### 6.5 缩进层级跳转(Indent
| 场景 | 按键 | 做什么 | 依赖/来源 | 适用 |
|---|---|---|---|---|
| 跳到当前缩进层顶部/底部 | `[i` / `]i` | 跳出当前缩进层(到该缩进引导线的顶/底) | `snacks.indent` | Python、HTML/JSX/Svelte 等 |
### 6.6 诊断(Diagnostics)、拼写、TODO
| 场景 | 上一个 | 下一个 | 备注 |
|---|---|---|---|
| 所有诊断(error/warn/hint | `[d` | `]d` | 常用“跳到下一条波浪线/提示” |
| 仅 error | `[e` | `]e` | 忽略 warning/hint |
| 仅 warning | `[w` | `]w` | 只在警告间跳转 |
| 拼写错误(spell | `[s` | `]s` | 拼写不算 diagnostic;别指望 `]d` 去拼写波浪线 |
| TODO/FIXME | `[t` | `]t` | 在注释标记间跳转 |
> 限制:诊断/某些跳转通常不能和动词组合(例如 `d[d` 不会“删到上一条诊断”)。
### 6.7 Git 修改块(Hunk
| 场景 | 上一个 | 下一个 | 做什么 | 备注 |
|---|---|---|---|---|
| 跳转 git hunk | `[h` | `]h` | 在未暂存/未提交的改动块间跳转 | 同样一般不能和动词组合 |
### 6.8 文本对象(Text Objects)与 Operator-Pending 语法
#### 6.8.1 基本语法(最重要)
| 语法 | 解释 | 例子 |
|---|---|---|
| `<verb><a/i><object>` | 动词 + 语境 + 对象 | `di(``daw``cip``yig` |
| `i`(inside) | 只作用于对象内部 | `di(` 删除括号内,保留括号 |
| `a`(around) | 作用于对象及其边界/相关空白 | `da(` 删除括号+内容;`daw` 会顺带处理空格更自然 |
#### 6.8.2 文本类对象(word/sentence/paragraph
| 对象 | `i`inside)例 | `a`around)例 | 差异要点 |
|---|---|---|---|
| word | `diw` | `daw` | `a` 往往会吃掉一侧空白,删除后更不留多余空格 |
| WORD(空白分隔) | `diW` | `daW` | 不把标点当边界 |
| sentence | `dis` | `das` | `a` 更会“对齐”句子周围空白 |
| paragraph | `dip` | `dap` | `a` 往往会连多余空行一起处理 |
#### 6.8.3 引号/括号对象
| 目标 | inside(保留边界) | around(含边界) | 备注 |
|---|---|---|---|
| 双引号 | `ci"` / `di"` | `ca"` / `da"` | `c` 会进入插入模式 |
| 单引号 | `ci'` | `da'` | 同理 |
| 反引号 | ``ci` `` | ``da` `` | 同理 |
| 任意最近引号 | `ciq` / `diq` | `caq` / `daq` | `q` 会自动判断 `"'`` 哪个最近 |
| 圆括号 | `di(` | `da(` | 也可用于 `)` 作为对象字符 |
| 花括号 | `di{` | `da{` | 同理 |
| 方括号 | `di[` | `da[` | 同理 |
| 尖括号 | `di<` | `da<` | 常用于泛型/标签等 |
#### 6.8.4 “最近的包围括号”快捷对象
| 对象 | 含义 | 例子 |
|---|---|---|
| `b` | bracket:最近的包围对(括号类) | `dib` / `cab` |
#### 6.8.5 计数:第 N 层包围(count 放在 `a/i` 前)
| 写法 | 含义 | 例子 |
|---|---|---|
| `d2a{` | 对第二层外侧的 `{…}` 执行删除(含花括号) | 光标在深层对象内,删外层 block |
| `c3i(` | 改第三层外侧 `(…)` 的内部(保留括号) | 复杂嵌套时用 |
#### 6.8.6 整个文件(buffer)对象
| 目标 | 按键 | 含义 |
|---|---|---|
| entire bufferinside | `yig` | 复制整个文件内容 |
| entire bufferaround | `cag` / `dag` | 作用于整个 buffer(常用 `cag` 直接清空重写) |
#### 6.8.7 语言结构类文本对象(LazyVim 扩展)
| 对象字母 | 含义 | 示例(动词+对象) |
|---|---|---|
| `c` | class/type | `dac` / `cic` |
| `f` | function/method | `yaf` / `dif` |
| `o` | objectblock/loop/conditional 等) | `cao` / `dio` |
| `t` | tagHTML/JSX | `dat` / `cit` |
| `i` | scope(缩进层级) | `dai` / `cii` |
#### 6.8.8 Git hunk 文本对象
| 对象 | 用法 | 含义 |
|---|---|---|
| `h` | `dih` | 对整个 git hunk 执行操作(例如删除该改动块) |
#### 6.8.9 “附近对象”扩展(mini.ai):Next / Last
| 前缀 | 含义 | 示例 | 作用 |
|---|---|---|---|
| `n` | next | `cin{` | 不必先把光标移入对象,直接操作“下一个 `{}` 对象内部” |
| `l` | last | `dil"` | 操作“上一个”对象(靠近光标) |
### 6.9 flash.nvimS / R / r(对象选择)
| 功能 | 按键形态 | 做什么 | 备注 |
|---|---|---|---|
| 就地选“周围对象” | `<verb>S` | 给光标周围结构打成对标签,选中后对标签之间范围操作 | 不需要 `a/i` |
| 远程选“周围对象” | `<verb>R` | 先远程定位匹配,再切到“周围对象成对标签”选择范围 | R = Remote(大写是 surround 对象模式) |
| 远程定位后继续选任意对象 | `<verb>r` | 远程 Seek 到某标签后回到 operator-pending,再输入如 `aw`/`i(` 等;完成后光标回原位 | 小写 r = Remote(普通 seek |
### 6.10 mini.surround(可选 Extra):包围符/标签的增删改
> 说明:`mini.surround` 常作为 LazyVim 推荐 Extra;未必默认安装。
#### 6.10.1 添加包围(Add
| 目标 | 按键 | 说明 | 例子效果 |
|---|---|---|---|
| 添加包围 | `gsa` +motion/对象)+(包围字符) | 先选范围,再输入要包围的字符 | `gsa$"`:从光标到行尾加 `""` |
| `(` vs `)` | 作为包围字符时 | `(` 会在内部加空格;`)` 不加 | `[foo]` 经 `gsai[(` → `[( foo )]`;经 `gsai[)` → `[(foo)]` |
#### 6.10.2 删除包围(Delete
| 目标 | 按键 | 说明 |
|---|---|---|
| 删除某种包围对 | `gsd` + 字符 | `gsd[` 删除当前所在 `[]` |
| 删除第 N 层外侧 | `<count>gsd` + 字符 | `2gsd{` 删除第二层外侧 `{}` |
#### 6.10.3 替换包围(Replace
| 目标 | 按键 | 例子 |
|---|---|---|
| 替换包围符 | `gsr` + 旧 + 新 | `gsr"'``"hello"` → `'hello'` |
#### 6.10.4 仅跳转/查看包围边界
| 功能 | 按键 | 说明 |
|---|---|---|
| 括号匹配跳转 | `%` | 在括号端点上跳到匹配端;不支持引号类 |
| 跳到最近左/右包围符 | `g[` + 字符 / `g]` + 字符 | 例:`g[(`、`g]]`;可加 count 跳多层 |
| 高亮包围(检查用) | `gsh` + 字符 | 例:`gsh(` 用于“干跑”确认层级 |
#### 6.10.5 HTML/XML Tag 包围(Bonus
| 目标 | 按键 | 说明 |
|---|---|---|
| 段落外包标签 | `gsaapt` | `ap` 选段落,`t` 表示 tag;随后输入标签名(如 `p`),可带属性 |
---
## 7. Buffers 与布局(Buffers and Layouts
### 7.1 概念速查(一定先分清)
| 概念 | Vim/Neovim 的含义 | 你可能误以为 | 关键点/坑 |
|---|---|---|---|
| Server | Neovim 可作为“服务端”,允许多个客户端连接同一实例 | 不常见概念 | 一般不用管;但可做到连接已有 nvim 实例而不是新开 |
| Client | 你运行的 Neovim 程序(终端 `nvim`、或 Neovide/VimR 等 GUI | “就是 Neovim” | 一个 client 通常连自己的 server,也可连已有/远程 |
| Tab | 一套“全屏布局”(更像 Layout/Workspace | VS Code 的 tab 条 | Tab 之间布局可不同;一次只显示一个 tab;所有 tab 共享 buffers |
| Window | 分屏/窗格/Pane/Split(屏幕区域) | OS 窗口 | 一个 window 显示一个 buffer 的“视图”;浮窗是例外(picker 等) |
| Buffer | 已打开的文件内容实例(内存中的编辑对象) | Tab | 同一文件只有一个底层 buffer;可在多个 window/tab 同时显示 |
| Fold | 折叠:把一段代码收成一行隐藏起来 | “缩进/大纲” | 只影响视图显示;可嵌套折叠 |
| File | 磁盘上的文件 | Buffer | buffer 未保存时内容可与磁盘不一致;也可有无文件 buffer(scratch |
### 7.2 Buffer(缓冲区)速查
#### 7.2.1 切换 Buffer
| 操作 | 快捷键 | 说明/记忆法 |
|---|---|---|
| 下一个/上一个 buffer(按 bufferline 顺序) | `L` / `H` | Shift-l/rightShift-h/left |
| 下一个/上一个 buffer(同上) | `]b` / `[b` | 方括号系列 |
| 当前文件 ↔ 当前窗口最近的另一个文件(alternate file | `<Space><Backtick>` | 快速来回切两个文件 |
| 用列表过滤选择已打开 buffers | `<Space><comma>` | buffer picker:适合 buffer 很多时 |
#### 7.2.2 关闭 Buffer(不删磁盘文件)
| 操作 | 快捷键 | 说明/记忆法 |
|---|---|---|
| 关闭当前 buffer(保留分屏) | `<Space>bd` | b=buffer 子菜单,d=delete(删的是 buffer |
| 关闭当前 buffer + 关闭所在分屏 | `<Space>bD` | D 更大力度 |
| 关闭左侧所有 buffers | `<Space>bl` | left |
| 关闭右侧所有 buffers | `<Space>br` | right |
| 只保留当前 buffer,其他全关 | `<Space>bo` | only |
| 删除所有未 pin 的 buffers | `<Space>bP` | 批量清理 |
| pin/取消 pin 当前 buffer | `<Space>bp` | 防止被 `<Space>bP` 清掉 |
| 在 buffer picker 中关闭光标所在项 | `<C-x>` | 仅在 `<Space><comma>` 列表里 |
#### 7.2.3 Scratch Buffer(临时笔记)
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 打开/回到当前 cwd 的 scratch | `<Space>..` | 按工作目录(cwd)绑定;重开 nvim 也还在 |
| 关闭 scratch 浮窗 | `q` | 需在 Normal 模式(通常先 `<Escape>` |
| 列出所有 scratch(可选不同 cwd/分支) | `<Space>S` | picker 列表 |
### 7.3 Window(分屏)速查
#### 7.3.1 Window 子菜单入口
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 打开 window 菜单 | `<Space>w` | LazyVim 统一入口 |
| 传统入口 | `<C-w>` | Vim 默认体系;LazyVim 也增强了它 |
#### 7.3.2 创建分屏
| 操作 | 快捷键 | 说明/记忆法 |
|---|---|---|
| 垂直分屏(左右) | `<Space>wv` | v=vertical |
| 水平分屏(上下) | `<Space>ws` | s=split |
| 垂直分屏(替代键) | `<Space>|` | `|` = Shift-Backslash |
| 水平分屏(替代键) | `<Space>-` | `-` 像横线 |
#### 7.3.3 打开文件时直接分屏(Explorer/Picker
| 场景 | 快捷键 | 结果 |
|---|---|---|
| Snacks explorer 打开文件 | `<Enter>` | 当前窗口打开 |
| Snacks explorer 垂直分屏打开 | `<C-v>` | 右侧/新列打开 |
| Snacks explorer 水平分屏打开 | `<C-s>` | 下方/新行打开 |
| Snacks 各种 picker | `<C-v>` / `<C-s>` | 同样可用 |
| mini.files 打开到分屏 | `<Space>wv` / `<Space>ws` | 用“正常窗口分屏键”完成 |
#### 7.3.4 在窗口间移动
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 向左/下/上/右窗口移动 | `<C-h>` / `<C-j>` / `<C-k>` / `<C-l>` | 支持 count,可跨过窗口 |
| 同上(which-key 风格) | `<Space>wh/wj/wk/wl` | 先 `<Space>w` 再方向 |
#### 7.3.5 关闭窗口(只关分屏,不关 buffer)
| 操作 | 快捷键 | 行为差异 |
|---|---|---|
| 关闭窗口;若是唯一窗口则退出 Neovim | `<Space>wq` | q=quit |
| 关闭窗口;若是唯一窗口则拒绝并报错 | `<Space>wc` | c=close |
| 删除窗口(与 wc 实质相同) | `<Space>wd` | d=delete(对称 `<Space>bd` |
| 只保留当前窗口,关闭其他分屏 | `<Space>wo` | only window |
#### 7.3.6 调整窗口大小
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 增加/减少高度(水平分屏) | `<Space>w+` / `<Space>w-` | 每次 1 行;常配合 count |
| 增加/减少宽度(垂直分屏) | `<Space>w>` / `<Space>w<` | 每次 1 列;常配合 count |
| 所有窗口等宽等高 | `<Space>w=` | 均分布局 |
#### 7.3.7 Hydra(窗口命令连发)
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 进入 window Hydra 模式 | `<Space>w<Space>` | 固定窗口菜单,可连续按多条命令 |
| 退出 Hydra | `<Escape>` | 回普通编辑 |
#### 7.3.8 Zen / Zoom
| 模式 | 快捷键 | 作用 |
|---|---|---|
| Zen mode | `<Space>uz` | 中央专注窗口、背景变暗、只在光标附近保留高亮(snacks.nvim |
| Zoom mode | `<Space>uZ` | 临时只显示当前窗口最大化 |
### 7.4 Tab(标签页/布局)速查
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 打开 Tab 菜单 | `<Space><Tab>` | LazyVim tab 子菜单 |
| 新建 tab | `<Space><Tab><Tab>` | 连按两次 Tab(第二次是动作) |
| 把当前 split “移到”新 tab | `<Space>wT` | T 大写;当前窗口在原 tab 消失,新 tab 里出现 |
| 下一个/上一个 tab(Vim 默认) | `gt` / `gT` | tab 导航 |
| 切换 tabLazyVim | `<Space><Tab>]` / `<Space><Tab>[` | 右 / 左 |
| 跳到第 N 个 tab | `Ngt` | 例:`3gt` 去 tab 3 |
| 关闭当前 tab(方式 1) | 关闭该 tab 最后一个窗口(如 `<Space>wq` | tab 自动消失 |
| 关闭 tab(方式 2 | `<Space><Tab>d` | 关 tab 的所有窗口 + tabbuffers 仍保留 |
| 关闭 tab(方式 3) | 点击 tab 区域右侧 `X` | bufferline 右侧数字旁 |
> 位置提示:tab 编号显示在 bufferline 最右侧;左侧那些“像标签页”的是 buffers,不是 tabs。
### 7.5 Folding(代码折叠,`z` 系列)
| 操作 | 快捷键 | 说明/记忆 |
|---|---|---|
| 折叠当前区域 | `zc` | c=collapse |
| 打开当前折叠 | `zo` | o=open |
| 折叠/打开切换 | `za` | a=toggle |
| 打开所有折叠 | `zR` | 全展开 |
| 递归打开(含嵌套) | `zO` | O=更强力的 open |
### 7.6 Session(会话,恢复现场)
| 操作 | 快捷键/流程 | 说明 |
|---|---|---|
| 退出并保存会话 | `<Space>qq` | 默认启用 session;退出即记录 |
| 从 dashboard 恢复 | 打开 `nvim` 后按 `s` | 回到上次关闭时的 buffers/tabs/splits |
| dashboard 不在时恢复 | `<Space>qs` | 恢复到上次退出时状态 |
| 选择最近项目并恢复会话 | `<Space>qS` | picker:选目录后自动 `:cd` 并加载对应 session |
| 本次不更新/不覆盖 session | `<Space>qd` | 临时打开 nvim 时防止覆盖旧 session |
| 会话作用域 | 按 cwd(目录) | 进入项目前先 `cd`,或在 nvim 里 `:cd` |
---
## 8. 附录
### 8.1 普通 Vim 示意图
![](../../attachment/images-uuid/c5baa7bee49a4432826636a3f4b94cca.png)