Lazygit 按键绑定完全指南:从自动生成速查表到可定制键位配置
【免费下载链接】lazygitsimple terminal UI for git commands项目地址: https://gitcode.com/GitHub_Trending/la/lazygit
本文围绕 Lazygit 仓库中自动生成的按键绑定速查表(Keybindings_ru.md,同系列还有英、日、韩、中等多语言版本)展开,完整覆盖全局、主面板、提交、分支、文件、暂存区等全部上下文的键位清单,并结合 cheatsheet 生成器、Binding 结构定义 与 键位配置结构 的源码,讲清楚这份速查表是如何从代码自动产出的、每个按键如何映射到具体动作,以及如何按官方语法自定义自己的键位。
速查表的来源:一份由代码生成的文档
打开 Keybindings_ru.md 会看到文件头部标注:
This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run
go generate ./...from the project root.
也就是说,这份文档不是人工维护的,而是构建期产物。生成流程在 pkg/cheatsheet/generate.go 中,核心链路可以概括为三步:
- 实例化 GUI 并收集绑定:
Generate()对每种受支持的语言加载对应翻译集后调用mApp.Gui.GetCheatsheetKeybindings()。该方法在 pkg/gui/keybindings.go 中实现——它会重建全部视图与上下文树,再调用GetInitialKeybindings(),从而把运行时真实注册的按键(而不是文档里手写的清单)导出出来。 - 按上下文分组:
getBindingSections把每条绑定按视图名(如commits、files、staging)归组,并借助localisedTitle映射把视图名翻译成各语言的章节标题;Tag == "navigation"的绑定(翻页、跳顶/跳底等)单独归入“列表导航”一节。 - 渲染成 Markdown 表格:
formatSections按| Key | Action | Info |三列输出,其中键位用双反引号包裹,管道符自动转义,多行提示词中的换行替换为<br>。
这套机制保证了速查表与实现永不脱节:你在?菜单里看到的键位、屏幕底部显示的键位提示、以及这份文档,来自同一份Binding注册数据。
键位语法速览:书写自定义配置时必须知道的形式
速查表里的键位写法(如<ctrl+r>、W, <ctrl+e>)正是 Lazygit 官方键位语法,完整规则见 Custom_Keybindings.md:
- 单个可打印字符:
q、?、5。大写字母表示 Shift+字母——写A而不是<shift+a>; - 尖括号包裹的特殊键名:
<enter>、<f1>、<up>; - 带修饰键的组合:
<ctrl+c>、<ctrl+shift+up>; - 字面量
<disabled>:禁用某个默认绑定; - 以上形式的列表:
quit: [q, <ctrl+c>],表示多个键触发同一动作。
修饰键前缀:
| 前缀 | 缩写 | 含义 |
|---|---|---|
ctrl+ | c+ | Ctrl |
alt+ | a+ | Alt |
shift+ | s+ | Shift |
meta+ | m+ | 取决于终端;macOS 上通常是 ⌘,其他系统为 Super/Win |
修饰键可用+或-连接、顺序任意、长短形式可混用,例如<ctrl+shift+up>、<c+s+up>、<ctrl-shift-up>表达的是同一个绑定。
特殊键名包括<f1>–<f12>、<insert>、<delete>、<home>、<end>、<pgup>、<pgdown>、<up>/<down>/<left>/<right>、<tab>、<backtab>、<enter>、<esc>、<backspace>、<space>、<mouse wheel up>/<mouse wheel down>,均可再叠加修饰键。<minus>/<plus>是-与+搭配修饰键时的写法(无修饰键时直接写-、+)。
两类看似合理但会被拒绝的组合:<shift+a>(终端会把 Shift 折叠进字符本身,直接写A);<ctrl+A>这类“修饰键 + 大写字母”(应写<ctrl+shift+a>)。
需要注意的终端兼容性前提:纯字母与 ctrl+字母之外的组合依赖较新的终端协议,Ghostty、kitty、WezTerm、foot、Konsole、Alacritty、iTerm2、Windows Terminal 支持良好;macOS 自带 Terminal.app 与 Git for Windows 的 MinTTY 不支持。在 tmux 3.2+ 中需开启set -g extended-keys on与set -as terminal-features 'xterm*:extkeys'才能透传扩展按键。
在源码侧,单个键位值的解析由 pkg/config/keybinding.go 中的Keybinding类型完成:它在 YAML 反序列化时兼容“单个字符串”和“字符串序列”两种写法,并会在解析阶段就过滤掉空串与<disabled>,使上层无需特判;而 pkg/config/keynames.go 的GetValidatedKeyBindingKeys负责把配置里的键位字符串校验并转换成实际的按键对象——这就是为什么在 pkg/gui/keybindings.go 中,每条绑定的键位都通过opts.GetKeys(opts.Config.Universal.Xxx)读取,最终做到“改配置即改键位”。
全局键位
无论焦点在哪个面板都生效的键位(ViewName为空的绑定):
| 键位 | 动作 | 说明 |
|---|---|---|
<ctrl+r> | 切换到最近的仓库 | |
<pgup>, K, <ctrl+u>(fn+up/shift+k) | 向上滚动主面板 | |
<pgdown>, J, <ctrl+d>(fn+down/shift+j) | 向下滚动主面板 | |
@ | 打开命令日志菜单 | 查看/隐藏命令日志、聚焦日志面板等选项。 |
P | 推送(Push) | 推送当前分支到其上游分支;未配置上游时会提示配置。 |
p | 拉取(Pull) | 从远端拉取当前分支的变更;未配置上游时会提示配置。 |
) | 提高重命名相似度阈值 | 提高“删除+新增”对被识别为重命名的相似度阈值;默认值可用配置键git.renameSimilarityThreshold修改。 |
( | 降低重命名相似度阈值 | 同上,方向相反。 |
} | 增大 diff 上下文行数 | 增大 diff 视图中变更周围的上下文数量;默认值可用git.diffContextSize修改。 |
{ | 减小 diff 上下文行数 | 同上,方向相反。 |
: | 执行 shell 命令 | 弹出提示框输入要执行的 shell 命令。 |
<ctrl+p> | 查看自定义补丁选项 | |
m | 查看合并/变基选项 | 中止/继续/跳过当前 merge/rebase。 |
R | 刷新 | 后台重新执行git status、git branch等以刷新面板内容;注意不会执行git fetch。 |
+ | 下一个屏幕模式(普通/半屏/全屏) | |
_ | 上一个屏幕模式 | |
\| | 切换 diff 渲染器(正向) | 依次选择已配置的 diff 渲染器。 |
\ | 切换 diff 渲染器(反向) | |
<esc> | 取消 | |
? | 打开菜单 | |
<ctrl+s> | 查看过滤选项 | 过滤提交日志,只显示匹配过滤条件的提交。 |
W, <ctrl+e> | 打开 diff 对比菜单 | 对比两个 ref、选择对比的 ref、反转 diff 方向等。 |
q, <ctrl+c> | 退出 | |
<ctrl+z> | 挂起应用 | |
<ctrl+w> | 切换 diff 视图中的空白显示 | 默认值可用git.ignoreWhitespaceInDiffView修改。 |
<alt+shift+c> | 编辑配置文件 | 在外部编辑器中打开。 |
z | 撤销(基于 reflog,实验性) | 利用 reflog 判断应执行哪条 git 命令来撤销上一条 git 命令;不涉及工作区改动,只考虑提交。 |
Z | 重做(基于 reflog,实验性) | 同上,方向为重复上一条命令。 |
列表面板导航
这类绑定的Tag为navigation,会被生成器归入独立章节:
| 键位 | 动作 |
|---|---|
, | 上一页 |
. | 下一页 |
<、<home> | 跳到顶部 |
>、<end> | 跳到底部 |
v | 切换范围(拖拽)选择 |
<shift+down> | 向下扩展范围选择 |
<shift+up> | 向上扩展范围选择 |
/ | 查找 |
H | 向左滚动 |
L | 向右滚动 |
] | 下一个标签页 |
[ | 上一个标签页 |
提示框、菜单与确认面板
| 上下文 | 键位 | 动作 |
|---|---|---|
| 输入提示框 | <enter> | 确认 |
| 输入提示框 | <esc> | 关闭/取消 |
| 菜单 | <enter> | 执行 |
| 菜单 | <esc> | 关闭/取消 |
| 菜单 | / | 按文本过滤当前视图 |
| 确认面板 | <enter> | 确认 |
| 确认面板 | <esc> | 关闭/取消 |
| 确认面板 | <ctrl+o> | 复制到剪贴板 |
主面板(暂存视图)
聚焦暂存(staging)视图时的键位:
| 键位 | 动作 | 说明 |
|---|---|---|
<left>, h | 选择上一个块 | |
<right>, l | 选择下一个块 | |
v | 切换范围(拖拽)选择 | |
a | 切换 hunk 选择模式 | 在逐行选择与按 hunk 选择之间切换。 |
<ctrl+o> | 复制选中内容到剪贴板 | |
<space> | 切换暂存状态 | 将选中行在已暂存/未暂存之间切换。 |
d | 丢弃变更(git reset) | 选中未暂存变更时用git reset丢弃;选中已暂存变更时取消暂存。 |
o | 打开文件 | 用默认程序打开。 |
e | 编辑文件 | 在外部编辑器中打开。 |
<esc> | 返回文件面板 | |
<tab> | 切换到另一面板(已暂存/未暂存) | |
E | 编辑这个 hunk | 在外部编辑器中编辑选中的 hunk。 |
c | 提交变更 | 提交已暂存的变更。 |
w | 提交(跳过 pre-commit 钩子) | |
C | 用 git 编辑器提交 | |
<ctrl+f> | 查找 fixup 基准提交 | 找到当前变更所基于的提交,省去逐条翻找;详见 Fixup_Commits.md。 |
/ | 查找 |
主面板(普通视图 / 合并冲突 / 补丁构建)
普通视图(main):
| 键位 | 动作 |
|---|---|
<mouse wheel down>(fn+up) | 向下滚动 |
<mouse wheel up>(fn+down) | 向上滚动 |
<tab> | 切换到另一面板(已暂存/未暂存) |
<esc> | 返回侧边面板 |
/ | 查找 |
合并冲突(mergeConflicts):
| 键位 | 动作 |
|---|---|
<space> | 选择这个 hunk |
b | 同时选择两侧 hunk |
<up>, k | 选择上一个 hunk |
<down>, j | 选择下一个 hunk |
<left>, h | 选择上一个冲突 |
<right>, l | 选择下一个冲突 |
z | 撤销 |
e | 在外部编辑器中编辑文件 |
o | 用默认程序打开文件 |
M | 查看合并冲突解决选项 |
<esc> | 返回文件面板 |
补丁构建(patchBuilding):
| 键位 | 动作 | 说明 |
|---|---|---|
<left>, h | 选择上一个块 | |
<right>, l | 选择下一个块 | |
v | 切换范围(拖拽)选择 | |
a | 切换 hunk 选择模式 | 逐行与按 hunk 切换。 |
<ctrl+o> | 复制选中内容到剪贴板 | |
o | 打开文件 | |
e | 编辑文件 | |
<space> | 添加/移除补丁中的行 | |
d | 从提交中移除行 | 后台执行交互式变基;若后续提交也修改了这些行,可能产生冲突。 |
<esc> | 退出自定义补丁构建 | |
/ | 查找 |
提交类上下文(本地提交 / Reflog / 子提交)
本地提交(commits):
| 键位 | 动作 | 说明 |
|---|---|---|
<ctrl+o> | 复制短哈希到剪贴板 | |
<ctrl+r> | 重置已复制(cherry-pick)的提交选择 | |
b | 查看 bisect 选项 | |
s | Squash(压缩提交) | 将选中提交压缩进下方提交,其消息追加到下方提交。 |
f | Fixup | 同 Squash,但丢弃选中提交的消息。 |
c | 设置 fixup 消息 | 设置 fixup 提交的消息选项;-C表示改用本提交的消息。 |
r | 重写(reword)提交 | |
R | 用编辑器重写提交 | |
d | 删除提交 | 通过变基将该提交移出分支;若后续提交依赖其改动,可能需要解决冲突。 |
e | 编辑(开始交互式变基) | |
i | 开始交互式变基 | 针对分支上的提交,范围从 HEAD 到第一个合并提交或主分支提交;若要从选中提交开始变基,按e。 |
p | Pick(变基进行中) | |
F | 创建 fixup 提交 | 为这个提交创建 fixup。 |
S | 应用 fixup 提交(autosquash) | 将上方所有fixup!提交合并进选中提交。 |
<ctrl+j>, <alt+down> | 下移提交一位 | |
<ctrl+k>, <alt+up> | 上移提交一位 | |
V | 粘贴(cherry-pick)已复制提交 | |
B | 标记为变基基准提交 | 使用git rebase --onto,仅迁移基准提交之上的提交。 |
A | Amend | 用已暂存变更修正最后一个提交。 |
a | 设置/清除提交作者 | 设置作者或共同作者(co-author)。 |
t | Revert | 为选中提交创建反向提交的 revert 提交。 |
T | 为提交打标签 | 输入标签名与可选描述。 |
<ctrl+l> | 打开日志菜单 | 更改排序、隐藏/显示完整 git 图等。 |
G | 在浏览器中打开 Pull Request | |
<space> | 切换(检出) | 以 detached HEAD 检出租选提交。 |
y | 复制提交属性 | 哈希、URL、diff、消息、作者等。 |
o | 在浏览器中打开提交 | |
n | 从此提交新建分支 | |
N | 移动提交到新分支 | 新建分支并把当前分支未推送的提交移过去;新分支始终从主分支分出或堆叠在当前分支之上(可选)。 |
w | 新建 worktree | |
g | 查看重置选项 | soft/mixed/hard 重置到选中项。 |
C | 复制(cherry-pick) | 标记为已复制;在本地提交视图中按V粘贴,<esc>取消。 |
<ctrl+t> | 打开外部 diff 工具(git difftool) | |
* | 选择当前分支的所有提交 | |
0 | 聚焦主视图 | |
<enter> | 查看该项目的文件 | |
/ | 查找 |
Reflog 提交(reflogCommits)与子提交(subCommits):两者的键位集合与本地提交高度重叠(复制哈希、复制/粘贴 cherry-pick、新建分支、New worktree、重置选项、difftool、选中当前分支提交、聚焦主视图、<enter>进入、/查找等),差异在于<space>同样表示以 detached HEAD 检出选中提交;子提交上下文用于查看某个提交的父提交链。
分支与远端
本地分支(localBranches):
| 键位 | 动作 | 说明 |
|---|---|---|
<ctrl+o> | 复制分支名到剪贴板 | |
i | 显示 git-flow 选项 | |
<space> | 切换 | 检出选中项。 |
n | 新建分支 | |
N | 移动提交到新分支 | 同上,把未推送提交移到新分支。 |
w | 新建 worktree | |
o | 创建 Pull Request | |
O | 查看 PR 创建选项 | |
G | 在浏览器中打开 PR | |
<ctrl+y> | 复制 PR URL 到剪贴板 | |
c | 按名称检出 | 输入框中键入-可切回上一个分支。 |
- | 检出上一个分支 | |
F | 强制切换 | 丢弃工作区所有本地变更后再检出。 |
d | 删除 | 查看本地/远端分支删除选项。 |
r | 将当前分支变基到该分支 | |
M | 合并到当前分支 | 常规 merge 或 squash merge。 |
f | 快进该分支 | 从其上游快进选中分支。 |
T | 新建标签 | |
s | 切换排序方式 | |
g | 查看重置选项 | |
R | 重命名分支 | |
u | 查看上游选项 | 设置/取消上游、重置到上游等。 |
<ctrl+t> | 打开外部 diff 工具 | |
0 | 聚焦主视图 | |
<enter> | 查看提交 | |
/ | 按文本过滤 |
远端分支(remoteBranches):
| 键位 | 动作 | 说明 |
|---|---|---|
<ctrl+o> | 复制分支名到剪贴板 | |
<space> | 切换 | 基于选中远端分支新建本地分支,或以 detached HEAD 检出。 |
n | 新建分支 | |
w | 新建 worktree | |
M | 合并到当前分支 | |
r | 将当前分支变基到该分支 | |
d | 删除 | 从远端删除该远端分支。 |
u | 设为上游 | 设为当前分支的 upstream。 |
s | 切换排序方式 | |
g | 查看重置选项 | |
<ctrl+t> | 打开外部 diff 工具 | |
0 | 聚焦主视图 | |
<enter> | 查看提交 | |
/ | 按文本过滤 |
远端仓库(remotes):
| 键位 | 动作 | 说明 |
|---|---|---|
<enter> | 查看分支 | |
n | 添加新远端 | |
d | 删除 | 跟踪该远端分支的本地分支不受影响。 |
e | 编辑 | |
f | 拉取 | 从该远端 fetch。 |
F | 添加 fork 远端 | 替换 origin URL 中的 owner 快速添加 fork,并可检出其分支。 |
/ | 按文本过滤 |
标签(tags):
| 键位 | 动作 | 说明 |
|---|---|---|
<ctrl+o> | 复制标签到剪贴板 | |
<space> | 切换 | 以 detached HEAD 检出选中标签。 |
n | 新建标签 | 从当前提交创建,输入名称与可选描述。 |
w | 新建 worktree | |
d | 删除 | 查看本地/远端标签删除选项。 |
P | 推送标签 | 推送到远端,需选择远端。 |
g | 重置 | soft/mixed/hard 选项。 |
<ctrl+t> | 打开外部 diff 工具 | |
0 | 聚焦主视图 | |
<enter> | 查看提交 | |
/ | 按文本过滤 |
文件、提交文件与状态面板
文件(files):
| 键位 | 动作 | 说明 |
|---|---|---|
<ctrl+o> | 复制文件路径到剪贴板 | |
<space> | 切换暂存 | 切换选中文件的 staged 状态。 |
<ctrl+b> | 过滤文件(staged/unstaged) | |
y | 复制到剪贴板 | |
c | 提交变更 | 提交已暂存变更。 |
w | 提交(跳过 pre-commit 钩子) | |
A | Amend 最后一个提交 | |
C | 用 git 编辑器提交 | |
<ctrl+f> | 查找 fixup 基准提交 | 见上文说明与 Fixup_Commits.md。 |
e | 编辑 | 外部编辑器打开。 |
o | 打开文件 | 默认程序打开。 |
i | 忽略或排除文件 | |
r | 刷新文件 | |
s | Stash | 贮藏全部变更;更多变体用 stash 选项菜单。 |
S | 查看 stash 选项 | 全部/staged/unstaged 等。 |
a | 全部暂存/取消暂存 | 对工作区所有文件。 |
<enter> | 进入文件暂存视图或折叠/展开目录 | 文件则聚焦 staging 视图可逐 hunk/行暂存;目录则折叠展开。 |
d | 查看丢弃选项 | |
g | 查看上游重置选项 | |
D | 重置 | 工作区重置选项(如清空工作区)。 |
` | 切换文件树/扁平视图 | 默认值可用gui.showFileTree修改。 |
<ctrl+t> | 打开外部 diff 工具 | |
M | 查看合并冲突选项 | |
f | 获取远端变更 | fetch。 |
- | 折叠所有目录 | |
= | 展开所有目录 | |
0 | 聚焦主视图 | |
/ | 按文本过滤 |
提交文件(commitFiles):
| 键位 | 动作 | 说明 |
|---|---|---|
<ctrl+o> | 复制文件路径到剪贴板 | |
y | 复制到剪贴板 | |
c | 切换文件 | |
d | 查看丢弃选项 | 丢弃该提交在此文件中的变更。 |
o | 打开文件 | |
e | 编辑 | 外部编辑器。 |
<ctrl+t> | 打开外部 diff 工具 | |
<space> | 切换文件是否纳入自定义补丁 | 属于 rebase magic / custom patches 功能。 |
a | 切换全部文件纳入补丁 | |
<enter> | 进入文件逐行加入/移除补丁,或切换目录 | |
` | 切换文件树/扁平视图 | |
- | 折叠全部 | |
= | 展开全部 | |
0 | 聚焦主视图 | |
/ | 按文本过滤 |
状态面板(status,仓库选择界面):
| 键位 | 动作 |
|---|---|
e | 编辑配置文件 |
u | 检查更新 |
<enter> | 切换到最近仓库 |
a | 显示/切换全部分支图 |
A | 显示/切换全部分支图(反向) |
0 | 聚焦主视图 |
提交摘要(commitMessage):<enter>确认,<esc>关闭。
暂存区(Stash)、Worktrees 与子模块
暂存区(stash):
| 键位 | 动作 | 说明 |
|---|---|---|
<space> | 应用 stash | 应用到工作区。 |
g | 应用并删除 | apply 后从 stash 列表移除。 |
d | 删除 stash 条目 | |
n | 新建分支 | 从 stash 条目创建分支:检出该条目基于的提交、建分支、再把 stash 作为新提交应用上去。 |
w | 新建 worktree | |
r | 重命名 stash | |
0 | 聚焦主视图 | |
<enter> | 查看该项的文件 | |
/ | 按文本过滤 |
Worktrees:
| 键位 | 动作 | 说明 |
|---|---|---|
n | 新建 worktree | |
<space> | 切换 | 切换到选中 worktree。 |
o | 在编辑器中打开 | |
d | 删除 | 同时删除目录与 .git 中的元数据。 |
/ | 按文本过滤 |
子模块(submodules):
| 键位 | 动作 |
|---|---|
<ctrl+o> | 复制子模块名到剪贴板 |
<enter> | 进入 |
d | 删除子模块及其目录 |
u | 更新子模块 |
n | 添加新子模块 |
e | 更新子模块 URL |
i | 初始化 |
b | 查看批量子模块选项 |
/ | 按文本过滤 |
从按键到动作:源码中的绑定机制
速查表中的每一行都对应一条 Binding 结构,其字段设计值得注意:
ViewName决定作用域:为空表示全局键位;非空则仅在该视图获得焦点时生效——这解释了为什么同一按键(如d)在不同上下文执行完全不同的动作(删除提交/丢弃变更/删除 stash 条目/删除 worktree)。Keys是按键数组,与配置中“一个动作可绑定多个键”的写法对应;SetKeybinding会为每个键单独注册处理器。Description/ShortDescription/Tooltip分别服务于 cheatsheet 文档生成、屏幕底部键位提示、以及菜单中的悬停提示——三处文案共用同一注册点,保证一致。GetDisabledReason返回非空时该键位被禁用,按下去会看到错误提示而不是误操作。
注册流程见 pkg/gui/keybindings.go:GetInitialKeybindings先注册全局绑定(仓库切换、滚动、各视图的复制哈希/路径等),再遍历gui.State.Contexts.Flatten()的每个上下文收集其GetKeybindings,最后叠加自定义命令(custom commands)注入的键位——源码注释明确说明自定义键位被前置到列表,以获得相对默认键位的优先权。按键分发时callKeybindingHandler会先检查禁用原因,再调用具体Handler;而像NoPopupPanel、OutsideFilterMode这样的“守卫”(定义于 pkg/gui/types/keybindings.go 的Guard)会在执行前拦截:例如过滤模式下触发某些全局操作会先弹出“必须退出过滤模式”的确认框。
小结
这份速查表的价值在于三点:其一,它是运行时真实键位的快照,由 pkg/cheatsheet/generate.go 从GetCheatsheetKeybindings自动导出,与?菜单、底部提示同源,多语言版本(如 Keybindings_en.md、Keybindings_zh-CN.md)由同一份数据渲染;其二,速查表中每个Key的写法即官方配置语法,配合 Custom_Keybindings.md 可直接迁移到自己的 YAML 配置(结构定义见 pkg/config/user_config.go 的KeybindingConfig及其各子结构);其三,键位的作用域规则(全局/按视图)在 pkg/gui/keybindings.go 的注册逻辑中有清晰的代码印证。当你需要“某个操作到底按什么键、这个键在哪个面板生效”时,先查本速查表定位上下文,再到对应配置子结构中查键名,即可准确完成自定义与排错。
【免费下载链接】lazygitsimple terminal UI for git commands项目地址: https://gitcode.com/GitHub_Trending/la/lazygit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考