Initial commit
This commit is contained in:
@@ -0,0 +1,583 @@
|
||||
# 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 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(对象选择)
|
||||
|
||||
| 功能 | 按键形态 | 做什么 | 备注 |
|
||||
|---|---|---|---|
|
||||
| 就地选“周围对象” | `<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/right,Shift-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 导航 |
|
||||
| 切换 tab(LazyVim) | `<Space><Tab>]` / `<Space><Tab>[` | 右 / 左 |
|
||||
| 跳到第 N 个 tab | `Ngt` | 例:`3gt` 去 tab 3 |
|
||||
| 关闭当前 tab(方式 1) | 关闭该 tab 最后一个窗口(如 `<Space>wq`) | tab 自动消失 |
|
||||
| 关闭 tab(方式 2) | `<Space><Tab>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(会话,恢复现场)
|
||||
|
||||
| 操作 | 快捷键/流程 | 说明 |
|
||||
|---|---|---|
|
||||
| 退出并保存会话 | `<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 示意图
|
||||
|
||||

|
||||
Reference in New Issue
Block a user