Lazygit 按键绑定完全指南:从自动生成速查表到可定制键位配置
2026/9/6 20:15:20 网站建设 项目流程

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 rungo generate ./...from the project root.

也就是说,这份文档不是人工维护的,而是构建期产物。生成流程在 pkg/cheatsheet/generate.go 中,核心链路可以概括为三步:

  1. 实例化 GUI 并收集绑定Generate()对每种受支持的语言加载对应翻译集后调用mApp.Gui.GetCheatsheetKeybindings()。该方法在 pkg/gui/keybindings.go 中实现——它会重建全部视图与上下文树,再调用GetInitialKeybindings(),从而把运行时真实注册的按键(而不是文档里手写的清单)导出出来。
  2. 按上下文分组getBindingSections把每条绑定按视图名(如commitsfilesstaging)归组,并借助localisedTitle映射把视图名翻译成各语言的章节标题;Tag == "navigation"的绑定(翻页、跳顶/跳底等)单独归入“列表导航”一节。
  3. 渲染成 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 onset -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 statusgit 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,实验性)同上,方向为重复上一条命令。

列表面板导航

这类绑定的Tagnavigation,会被生成器归入独立章节:

键位动作
,上一页
.下一页
<<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 选项
sSquash(压缩提交)将选中提交压缩进下方提交,其消息追加到下方提交。
fFixup同 Squash,但丢弃选中提交的消息。
c设置 fixup 消息设置 fixup 提交的消息选项;-C表示改用本提交的消息。
r重写(reword)提交
R用编辑器重写提交
d删除提交通过变基将该提交移出分支;若后续提交依赖其改动,可能需要解决冲突。
e编辑(开始交互式变基)
i开始交互式变基针对分支上的提交,范围从 HEAD 到第一个合并提交或主分支提交;若要从选中提交开始变基,按e
pPick(变基进行中)
F创建 fixup 提交为这个提交创建 fixup。
S应用 fixup 提交(autosquash)将上方所有fixup!提交合并进选中提交。
<ctrl+j>, <alt+down>下移提交一位
<ctrl+k>, <alt+up>上移提交一位
V粘贴(cherry-pick)已复制提交
B标记为变基基准提交使用git rebase --onto,仅迁移基准提交之上的提交。
AAmend用已暂存变更修正最后一个提交。
a设置/清除提交作者设置作者或共同作者(co-author)。
tRevert为选中提交创建反向提交的 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 钩子)
AAmend 最后一个提交
C用 git 编辑器提交
<ctrl+f>查找 fixup 基准提交见上文说明与 Fixup_Commits.md。
e编辑外部编辑器打开。
o打开文件默认程序打开。
i忽略或排除文件
r刷新文件
sStash贮藏全部变更;更多变体用 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;而像NoPopupPanelOutsideFilterMode这样的“守卫”(定义于 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询