# LazyVim / Neovim 快捷键与操作手册 > 说明:本文是基于 LazyVim 的个人速查笔记,内容以“使用场景 → 快捷键 → 结果/备注”为主。 > > 记号约定(尽量统一): > > - `Ctrl-x` 统一写作 ``(例如 `Ctrl-r` → ``) > - `Alt-x` 统一写作 `` > - `` 表示 LazyVim 默认 `` --- ## 1. 常用模式切换与通用操作 | 快捷键 | 模式 | 作用与说明 | |---|---|---| | `` | Insert | 进入“寄存器”迷你模式,可选择寄存器内容粘贴 | | ` +` | Insert | 从系统剪贴板粘贴文本 | | `` | 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 屏幕与页面滚动 | 快捷键 | 模式 | 作用与说明 | |---|---|---| | `` | Normal | 向下滚动半屏 (Down) | | `` | Normal | 向上滚动半屏 (Up) | | `` | Normal | 向下滚动整页 (Forward) | | `` | Normal | 向上滚动整页 (Backward) | | `` | Normal | 向上滚动一行(光标不动) | | `` | 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` | | 历史跳转 | `` | Normal | 跳回上一个光标位置 | | | `` | Normal | 前进到下一个光标位置(与 `` 相反) | --- ## 3. 文件操作与管理 ### 3.1 文件选择器(Telescope) | 快捷键 | 模式 | 作用与说明 | |---|---|---| | `` | Normal | 查找项目文件 (Root),最常用 | | `ff` | Normal | 查找项目文件 (Root) | | `fF` | Normal | 查找文件 (Cwd,当前工作目录) | 选择器内常用操作: - `Tab`:标记多个文件 - ``:为条目添加标签,按标签字符快速选择 - `` / ``:滚动结果列表 ### 3.2 文件浏览器(Snacks.nvim Explorer) | 快捷键 | 模式 | 作用与说明 | |---|---|---| | `e` | Normal | 打开文件浏览器 (Root) | | `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` 或 `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` 以取消映射(例如 `e`、`E`) ### 4.5 修改键位:三种常见落点 - `lua/config/keymaps.lua`:更偏核心/全局的键位(非特定插件) - 某插件的配置表里写 `keys = { … }`:通常用于“全局键位”来启动/调用插件 - 某插件的 `opts = { … }`:很多插件倾向通过 opts 定义“插件窗口/模式内”的局部键位与行为 #### 4.5.1 `keys` 条目的结构要点 - `keys` 是 Lazy.nvim/LazyVim 的机制:用于声明键位并由管理器统一注册(不是传给插件本身) - 每条 keys 通常包含: - 键位(如 `e`,LazyVim leader 通常是 ``) - 回调(Lua `function() … end`)或命令字符串 - `desc` 描述(用于 Space 菜单/提示) - 特殊键使用 `<>` 表示:如 ``、`` 等 #### 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. 基础编辑(编辑模型与常用命令) > 本节保留“长表格”形式,便于全文搜索与对照(语法模型 + 示例混排)。 | 分类 | 快捷键 | 模式 | 作用与说明 | |---|---|---|---| | 心智模型/语法 | `` | Normal | 基本导航模型:计数 + 移动;count 通常表示重复次数;部分命令(如 `G`)把 count 当作绝对值;Seek 允许带 count 但会被忽略 | | 心智模型/语法 | `` | Normal | 操作模型:先动词(operator/verb)再用 motion 指定范围;省略 verb 时默认是“只移动” | | 心智模型/语法 | `` | Normal | 理论上 verb 和 motion 都可带 count;实践中更常见 `` 或 `` | | 插入模式(模型边界) | `i/I/a/A` + 可带 count(例:`5ifoo`) | Normal → Insert → Normal | 进入 Insert 不属于 motion/verb,但可用 count 重复插入文本;例:`80i*` 快速插入 80 个 `*`;这类命令不能像 motions 那样和 verbs 组合 | | 删除 | `d` | Normal | 删除光标到 motion 目标之间文本;执行后仍在 Normal,便于继续组合其他 `` | | 删除示例 | `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` | Normal → Insert | “change”:删除范围并立即进入 Insert;与 `d` 再进入插入相比更省键;也使 `.` 能完整重复“删除 + 插入” | | 行尾操作(按模型) | `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` | Normal | 把范围文本转为大写(这里 `gU` 是 verb) | | 大小写:转小写范围 | `gu` | Normal | 把范围文本转为小写 | | 大小写:反转单字符 | `~` | Normal | 反转光标下字符的大小写 | | 大小写:整行 | `gUU` / `guu` | Normal | 通过“重复动词”把整行转为大写/小写 | | 重复上次编辑 | `.` | Normal | dot repeat:重复上一次“verb 操作”(包括 `c` 的删除范围 + 插入内容) | | `.` 的计数细节 | `.`(例:`2.`) | Normal | `.` 带 count 时不会简单“重复 N 次”,而是会替换被重复命令内部的 count;例:先 `3dd`,再 `2.` 会变为删除 2 行 | | 宏录制:开始 | `qq` | Normal | 开始录制宏;可录制导航、编辑、插入、搜索、甚至 `:` 命令序列;注意:不要在宏里用 Seek | | 宏录制:结束 | `q` | Normal | 停止录制并保存当前宏 | | 宏录制:追加 | `qQ` | Normal | 以追加方式继续录制到同一宏;需要确保光标位置使“拼接后的宏”逻辑成立 | | 宏回放(最近一次) | `Q` | Normal | 回放最近保存的录制宏;多个宏可用寄存器管理(寄存器章节待补) | | 撤销 | `u` | Normal | 撤销最近一次改动;一次“改动”可能很大(长时间未退出 Insert 时尤其明显) | | 重做 | `` | 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 基本语法(最重要) | 语法 | 解释 | 例子 | |---|---|---| | `` | 动词 + 语境 + 对象 | `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 buffer(inside) | `yig` | 复制整个文件内容 | | entire buffer(around) | `cag` / `dag` | 作用于整个 buffer(常用 `cag` 直接清空重写) | #### 6.8.7 语言结构类文本对象(LazyVim 扩展) | 对象字母 | 含义 | 示例(动词+对象) | |---|---|---| | `c` | class/type | `dac` / `cic` | | `f` | function/method | `yaf` / `dif` | | `o` | object(block/loop/conditional 等) | `cao` / `dio` | | `t` | tag(HTML/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.nvim:S / R / r(对象选择) | 功能 | 按键形态 | 做什么 | 备注 | |---|---|---|---| | 就地选“周围对象” | `S` | 给光标周围结构打成对标签,选中后对标签之间范围操作 | 不需要 `a/i` | | 远程选“周围对象” | `R` | 先远程定位匹配,再切到“周围对象成对标签”选择范围 | R = Remote(大写是 surround 对象模式) | | 远程定位后继续选任意对象 | `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 层外侧 | `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/right,Shift-h/left | | 下一个/上一个 buffer(同上) | `]b` / `[b` | 方括号系列 | | 当前文件 ↔ 当前窗口最近的另一个文件(alternate file) | `` | 快速来回切两个文件 | | 用列表过滤选择已打开 buffers | `` | buffer picker:适合 buffer 很多时 | #### 7.2.2 关闭 Buffer(不删磁盘文件) | 操作 | 快捷键 | 说明/记忆法 | |---|---|---| | 关闭当前 buffer(保留分屏) | `bd` | b=buffer 子菜单,d=delete(删的是 buffer) | | 关闭当前 buffer + 关闭所在分屏 | `bD` | D 更大力度 | | 关闭左侧所有 buffers | `bl` | left | | 关闭右侧所有 buffers | `br` | right | | 只保留当前 buffer,其他全关 | `bo` | only | | 删除所有未 pin 的 buffers | `bP` | 批量清理 | | pin/取消 pin 当前 buffer | `bp` | 防止被 `bP` 清掉 | | 在 buffer picker 中关闭光标所在项 | `` | 仅在 `` 列表里 | #### 7.2.3 Scratch Buffer(临时笔记) | 操作 | 快捷键 | 说明 | |---|---|---| | 打开/回到当前 cwd 的 scratch | `..` | 按工作目录(cwd)绑定;重开 nvim 也还在 | | 关闭 scratch 浮窗 | `q` | 需在 Normal 模式(通常先 ``) | | 列出所有 scratch(可选不同 cwd/分支) | `S` | picker 列表 | ### 7.3 Window(分屏)速查 #### 7.3.1 Window 子菜单入口 | 操作 | 快捷键 | 说明 | |---|---|---| | 打开 window 菜单 | `w` | LazyVim 统一入口 | | 传统入口 | `` | Vim 默认体系;LazyVim 也增强了它 | #### 7.3.2 创建分屏 | 操作 | 快捷键 | 说明/记忆法 | |---|---|---| | 垂直分屏(左右) | `wv` | v=vertical | | 水平分屏(上下) | `ws` | s=split | | 垂直分屏(替代键) | `|` | `|` = Shift-Backslash | | 水平分屏(替代键) | `-` | `-` 像横线 | #### 7.3.3 打开文件时直接分屏(Explorer/Picker) | 场景 | 快捷键 | 结果 | |---|---|---| | Snacks explorer 打开文件 | `` | 当前窗口打开 | | Snacks explorer 垂直分屏打开 | `` | 右侧/新列打开 | | Snacks explorer 水平分屏打开 | `` | 下方/新行打开 | | Snacks 各种 picker | `` / `` | 同样可用 | | mini.files 打开到分屏 | `wv` / `ws` | 用“正常窗口分屏键”完成 | #### 7.3.4 在窗口间移动 | 操作 | 快捷键 | 说明 | |---|---|---| | 向左/下/上/右窗口移动 | `` / `` / `` / `` | 支持 count,可跨过窗口 | | 同上(which-key 风格) | `wh/wj/wk/wl` | 先 `w` 再方向 | #### 7.3.5 关闭窗口(只关分屏,不关 buffer) | 操作 | 快捷键 | 行为差异 | |---|---|---| | 关闭窗口;若是唯一窗口则退出 Neovim | `wq` | q=quit | | 关闭窗口;若是唯一窗口则拒绝并报错 | `wc` | c=close | | 删除窗口(与 wc 实质相同) | `wd` | d=delete(对称 `bd`) | | 只保留当前窗口,关闭其他分屏 | `wo` | only window | #### 7.3.6 调整窗口大小 | 操作 | 快捷键 | 说明 | |---|---|---| | 增加/减少高度(水平分屏) | `w+` / `w-` | 每次 1 行;常配合 count | | 增加/减少宽度(垂直分屏) | `w>` / `w<` | 每次 1 列;常配合 count | | 所有窗口等宽等高 | `w=` | 均分布局 | #### 7.3.7 Hydra(窗口命令连发) | 操作 | 快捷键 | 说明 | |---|---|---| | 进入 window Hydra 模式 | `w` | 固定窗口菜单,可连续按多条命令 | | 退出 Hydra | `` | 回普通编辑 | #### 7.3.8 Zen / Zoom | 模式 | 快捷键 | 作用 | |---|---|---| | Zen mode | `uz` | 中央专注窗口、背景变暗、只在光标附近保留高亮(snacks.nvim) | | Zoom mode | `uZ` | 临时只显示当前窗口最大化 | ### 7.4 Tab(标签页/布局)速查 | 操作 | 快捷键 | 说明 | |---|---|---| | 打开 Tab 菜单 | `` | LazyVim tab 子菜单 | | 新建 tab | `` | 连按两次 Tab(第二次是动作) | | 把当前 split “移到”新 tab | `wT` | T 大写;当前窗口在原 tab 消失,新 tab 里出现 | | 下一个/上一个 tab(Vim 默认) | `gt` / `gT` | tab 导航 | | 切换 tab(LazyVim) | `]` / `[` | 右 / 左 | | 跳到第 N 个 tab | `Ngt` | 例:`3gt` 去 tab 3 | | 关闭当前 tab(方式 1) | 关闭该 tab 最后一个窗口(如 `wq`) | tab 自动消失 | | 关闭 tab(方式 2) | `d` | 关 tab 的所有窗口 + tab;buffers 仍保留 | | 关闭 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(会话,恢复现场) | 操作 | 快捷键/流程 | 说明 | |---|---|---| | 退出并保存会话 | `qq` | 默认启用 session;退出即记录 | | 从 dashboard 恢复 | 打开 `nvim` 后按 `s` | 回到上次关闭时的 buffers/tabs/splits | | dashboard 不在时恢复 | `qs` | 恢复到上次退出时状态 | | 选择最近项目并恢复会话 | `qS` | picker:选目录后自动 `:cd` 并加载对应 session | | 本次不更新/不覆盖 session | `qd` | 临时打开 nvim 时防止覆盖旧 session | | 会话作用域 | 按 cwd(目录) | 进入项目前先 `cd`,或在 nvim 里 `:cd` | --- ## 8. 附录 ### 8.1 普通 Vim 示意图 ![](../../attachment/images-uuid/c5baa7bee49a4432826636a3f4b94cca.png)