Lazydocker 波兰语按键速查表:Keybindings_pl 背后的快捷键机制与自动生成原理
Lazydocker 把对 Docker 容器、服务、镜像、卷和网络的日常操作压缩成了一套键盘快捷键,而 Keybindings_pl.md 正是这套快捷键的波兰语速查表。本文以该文档为骨架,完整呈现其中 8 个按键分区的全部绑定项,并结合 keybindings 源码 与 cheatsheet 生成脚本,讲清这份速查表是如何从 Go 源码“长”出来的、如何更新、以及如何与波兰语国际化(i18n)体系联动。读完本文,你可以无障碍使用 lazydocker 的波兰语界面,也能掌握在仓库中重新生成或校验所有语言速查表的方法。
文档定位:自动生成的多语言快捷键速查表
Keybindings_pl.md 文件首行就明确声明:
This file is auto-generated. To update, make the changes in the
pkg/i18ndirectory and then rungo run scripts/cheatsheet/main.go generatefrom the project root.
也就是说,它不是一份人工维护的手写文档,而是构建脚本根据源码中的按键绑定和波兰语翻译集合自动产出的结果。仓库 docs/keybindings/ 目录下共有 9 个语言版本(de、en、es、fr、nl、pl、pt、tr、zh),本文聚焦波兰语版本 pl,其余语言结构完全一致,仅翻译文本不同。README 的导航与 "List of keybindings" 部分均指向该目录,速查表是用户使用侧的标准参考入口。
项目(Projekt)分区
当焦点位于项目面板(project 视图,即 docker-compose 项目列表)时,可用按键如下,描述为波兰语原文:
e: edytuj konfigurację 编辑 lazydocker 配置
o: otwórz konfigurację 打开 lazydocker 配置
m: pokaż logi 查看日志
enter: skup na głównym panelu 将焦点切到主面板
[: poprzednia zakładka 切换到上一个主面板标签
]: następna zakładka 切换到下一个主面板标签
/: filter list 过滤列表
从 keybindings 源码 看,这些按键的绑定与处理函数一一对应:
e→gui.handleEditConfig,描述取自翻译键EditConfig(polish.go 中为 "edytuj konfigurację");o→gui.handleOpenConfig,对应OpenConfig("otwórz konfigurację");m→gui.handleViewAllLogs,对应ViewLogs("pokaż logi")。
容器(Kontenery)分区
容器面板(containers 视图)是快捷键最密集的分区,完整继承自原文档:
d: usuń 删除容器
e: hide/show stopped containers 显示/隐藏已停止容器
p: pause 暂停
s: zatrzymaj 停止
r: restartuj 重启
a: przyczep 附加(attach)
m: pokaż logi 查看日志
E: exec shell 进入容器执行 shell
c: wykonaj predefiniowaną własną komende 执行预定义自定义命令
b: view bulk commands 查看批量命令
w: open in browser (first port is http) 在浏览器中打开(首个端口按 http 处理)
enter: skup na głównym panelu 将焦点切到主面板
[: poprzednia zakładka 上一个主面板标签
]: następna zakładka 下一个主面板标签
/: filter list 过滤列表
源码中这些按键分别绑定到 handleContainersRemoveMenu(d)、handleHideStoppedContainers(e)、handleContainerPause(p)、handleContainerStop(s)、handleContainerRestart(r)、handleContainerAttach(a)、handleContainerViewLogs(m)、handleContainersExecShell(E)、handleContainersCustomCommand(c)、handleContainersBulkCommand(b)和 handleContainersOpenInBrowserCommand(w)。值得注意的是大小写区分:小写 c 执行的是配置中预定义的自定义命令,而全局的 X 打开的是即时自定义命令菜单,两者入口不同。
服务(Serwisy)分区
服务面板(services 视图,对应 docker-compose 项目中的单个 service)分区完整按键如下:
u: up service 启动单个服务
d: usuń kontenery 移除服务的容器
s: zatrzymaj 停止
p: pause 暂停
r: restartuj 重启
S: start 启动
a: przyczep 附加
m: pokaż logi 查看日志
U: up project 启动整个项目
D: down project 关闭整个项目
R: pokaż opcje restartu 查看重启选项(recreate/rebuild 等)
c: wykonaj predefiniowaną własną komende 执行预定义自定义命令
b: view bulk commands 查看批量命令
E: exec shell 执行 shell
w: open in browser (first port is http) 在浏览器中打开
enter: skup na głównym panelu 将焦点切到主面板
[: poprzednia zakładka 上一个主面板标签
]: następna zakładka 下一个主面板标签
/: filter list 过滤列表
这里可以清楚看到 lazydocker 的大小写设计约定:小写 u/d/s/p/r 作用于当前服务,大写 U/D 则作用于整个 compose 项目(handleProjectUp / handleProjectDown)。翻译文本 "usuń kontenery"(移除容器)来自 polish.go 中的 RemoveService 键,而 "pokaż opcje restartu" 来自 ViewRestartOptions。
镜像、卷、网络分区
这三个只读管理型分区的按键结构一致,完整继承自原文档:
Obrazy(镜像)
c: wykonaj predefiniowaną własną komende 执行预定义自定义命令
d: usuń obraz 删除镜像
b: view bulk commands 查看批量命令
enter: skup na głównym panelu 将焦点切到主面板
[: poprzednia zakładka 上一个主面板标签
]: następna zakładka 下一个主面板标签
/: filter list 过滤列表
Wolumeny(卷)
c: wykonaj predefiniowaną własną komende 执行预定义自定义命令
d: usuń wolumen 删除卷
b: view bulk commands 查看批量命令
enter: skup na głównym panelu 将焦点切到主面板
[: poprzednia zakładka 上一个主面板标签
]: następna zakładka 下一个主面板标签
/: filter list 过滤列表
Sieci(网络)
c: wykonaj predefiniowaną własną komende 执行预定义自定义命令
d: usuń sieci 删除网络
b: view bulk commands 查看批量命令
enter: skup na głównym panelu 将焦点切到主面板
[: poprzednia zakładka 上一个主面板标签
]: następna zakładka 下一个主面板标签
/: filter list 过滤列表
三个分区中 d 分别绑定 handleImagesRemoveMenu、handleVolumesRemoveMenu、handleNetworksRemoveMenu,c 与 b 则对应各自面板的自定义命令与批量命令处理器。
主面板(Główne)与全局(Globalne)分区
Główne(主面板) 只有一个按键:
esc: powrót 返回(退出主面板视图,回到侧边列表)
Globalne(全局) 分区在任意位置均可用:
+: next screen mode (normal/half/fullscreen) 切换下一档屏幕模式
_: prev screen mode 切换上一档屏幕模式
1: focus projects panel 聚焦项目面板
2: focus services panel 聚焦服务面板
3: focus containers panel 聚焦容器面板
4: focus images panel 聚焦镜像面板
5: focus volumes panel 聚焦卷面板
6: focus networks panel 聚焦网络面板
+ / _ 在源码中绑定 gui.nextScreenMode / gui.prevScreenMode,1–6 绑定 gui.handleGoTo(对应 Panel)。需要说明的是:原文档只列出带有描述文本的按键——生成脚本会跳过 Description 为空的绑定(见 generate.go 中 if binding.Description == "" { continue }),因此 q(退出)、x/?(打开菜单)、方向键翻页等无描述的绑定不会出现在速查表中,实际使用时它们依然生效。
速查表是如何生成的:源码级拆解
生成入口是 scripts/cheatsheet/main.go,它只有两个子命令:generate 和 check。核心流程在 generate.go 的 generateAtDir 中:
- 遍历所有语言:
for lang := range i18n.GetTranslationSets()取遍 i18n.go 注册的全部语言(pl、nl、de、tr、en、fr、zh、es、pt),逐个os.Setenv("LC_ALL", lang)切换环境语言; - 构造一个假 GUI:
mApp.Gui.SetupFakeGui()让按键绑定代码可以在无终端环境下运行; - 收集绑定:
mApp.Gui.GetInitialKeybindings()返回全部 Binding 结构体,其中ViewName决定所属分区(空值归为global,project/containers/services/images/volumes/networks/main各归一节),Description字段取自当前语言的TranslationSet; - 按视图分组并格式化:
getBindingSections按titleMap把绑定挂到对应章节标题下(标题即 polish.go 中的ProjectTitle="Projekt"、ContainersTitle="Kontenery" 等,这正是速查表中文档小节标题为波兰语的原因),formatSections最终渲染成# Lazydocker menu+ 各##小节 +<pre><kbd>...</kbd></pre>块,并在文件头拼上自动生成声明; - 落盘:每个语言写出一个
Keybindings_{{lang}}.md,输出目录由GetKeybindingsDir()固定为<项目根>/docs/keybindings。
check 子命令(validate.go)则把 docs/keybindings/ 现有文件与临时目录中重新生成的内容做全量比对,不一致时用 go-difflib 打印 unified diff 并以非零码退出——这是典型的 CI 一致性校验手段:一旦你改了按键绑定或翻译而忘了重新生成速查表,check 就会失败并提示运行 go run scripts/cheatsheet/main.go generate 后提交变更。
与国际化(i18n)体系的联动
波兰语文本并非来自 md 文件本身,而是来自 polish.go 的 polishSet()。整个语言选择链路是:
- i18n.go 的
NewTranslationSetFromConfig读取配置语言:若配置为auto,用jibber_jabber.DetectLanguage从系统环境探测;否则与GetTranslationSets()中的语言码前缀匹配(如pl_PL命中pl); NewTranslationSet以 englishSet 为基底,用mergo.Merge把命中的语言集覆盖合并上去——因此波兰语集中未翻译的键会自动回退到英文。这也解释了 Keybindings_pl.md 中部分条目仍为英文(如 "filter list"、"up service"、"hide/show stopped containers"):这些键在polishSet()中没有对应翻译,合并后保留了英文默认值;- 应用运行时依据语言确定
gui.Tr(当前TranslationSet),按键绑定的Description字段与速查表文本同源,保证界面提示与文档一致。
语言配置本身可在 lazydocker 配置文件中指定(配置参考 docs/Config.md),例如设为 pl 或 auto;生成脚本则是直接通过 LC_ALL 环境变量模拟各语言环境。
实操:更新与校验速查表
在仓库根目录下:
# 重新生成全部 9 种语言的速查表(写入 docs/keybindings/)
go run scripts/cheatsheet/main.go generate
# 校验现有速查表是否与源码一致(不一致时打印 diff 并返回非零退出码)
go run scripts/cheatsheet/main.go check
两个典型场景:
- 修改了按键绑定(如在 keybindings.go 中新增带
Description的绑定):运行generate后 9 个语言文件会同步变化,需要一并提交; - 修改了翻译(如 polish.go 中
ViewLogs的值):只有对应语言的 md 文件变化,check会精确定位到该文件的 diff。
小结
Keybindings_pl.md 表面是一份波兰语按键速查表,实际是 lazydocker "源码即文档"工作流的一个切片:按键定义集中在 GetInitialKeybindings,文案来自 pkg/i18n 的语言集,cheatsheet 包 负责按语言循环渲染出 md,validate.go 负责保证三者永不漂移。理解这一机制后,无论要查阅哪个语言的按键、还是要为仓库贡献按键或翻译,都有了明确的操作路径。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00