31 KiB
31 KiB
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()打开(可自行绑键)
- Dashboard 按
- 操作方式:
- 列表中移动到目标 extra,按
x启用/安装;在 Enabled 区对同一项按x可禁用/卸载(记忆:x = Extra) - 可能需要重启 Neovim,让 Lazy.nvim 识别并同步依赖
- 列表中移动到目标 extra,按
- 建议:
- 启用常用语言的
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)
- 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
- 通常等价于插件 README 中
- 若插件不自带键位:用
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>- |
- 像横线 |
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 |
