尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

lazydocker 快捷键完全指南:以荷兰语键位表为线索,看懂键位定义、本地化机制与 cheatsheet 自动生成

lazydocker 快捷键完全指南:以荷兰语键位表为线索,看懂键位定义、本地化机制与 cheatsheet 自动生成 lazydocker 快捷键完全指南以荷兰语键位表为线索看懂键位定义、本地化机制与 cheatsheet 自动生成【免费下载链接】lazydockerThe lazier way to manage everything docker项目地址: https://gitcode.com/GitHub_Trending/la/lazydockerlazydocker 的docs/keybindings/目录存放着多语言快捷键速查表其中荷兰语版本 Keybindings_nl.md 是一份由代码自动生成、与源码严格同步的键位文档。本文以这份荷兰语键位表为主体完整解读其中各面板Project、Containers、Services、Images、Volumes、Networks、Main、Global的全部按键及其作用并结合同仓库的键位注册源码pkg/gui/keybindings.go、国际化实现pkg/i18n和速查表生成器pkg/cheatsheet说明这些按键在代码里是如何定义、如何被翻译、又是如何自动导出成文档的。读完本文你可以把 lazydocker 的常用操作一一映射到键位上并掌握修改键位描述后重新生成全部语言 cheatsheet 的方法。一、键位表文档的来源由源码自动生成的速查表Keybindings_nl.md 文件第一行就声明了它的身份This file is auto-generated. To update, make the changes in the pkg/i18n directory and then rungo run scripts/cheatsheet/main.go generatefrom the project root.也就是说这份荷兰语键位表以及同目录下德语、英语、西班牙语、法语、波兰语、葡萄牙语、土耳其语、中文等Keybindings_*.md文件不是手写维护的而是从程序内注册的键位数据中提取出来的。docs/keybindings/下每种语言一个文件文件名格式为Keybindings_{{语言代码}}.md以英语版 Keybindings_en.md 对照两版的按键结构完全一致仅描述文案随语言变化。文档的标题层级# Lazydocker menu加 8 个##小节也来自生成器pkg/cheatsheet/generate.go 中把每个键位按ViewName归入固定 8 个标题见该文件 titleMap 定义小节标题荷兰语对应 viewName含义Projectproject项目当前目录的 docker-compose 工程面板Containerscontainers容器列表面板Dienstenservicescompose 服务面板荷兰语“服务”Imagesimages镜像面板Volumesvolumes卷面板Networksnetworks网络面板Hoofdmain主面板右侧大窗口荷兰语“主”Globaal无 ViewName全局键荷兰语“全局”只有Description非空的键位才会被写进速查表generate.go 中的过滤逻辑这一点直接决定了下文表格的覆盖范围。二、完整键位表荷兰语版原文对照以下完整继承 Keybindings_nl.md 中的全部按键“荷兰语描述”为文档原文“说明”为便于检索的中文释义。2.1 Project 面板按键荷兰语描述原文说明everander de lazydocker configuratie编辑 lazydocker 配置文件oopen de lazydocker configuratie打开查看lazydocker 配置文件mbekijk logs查看日志enterfocus hoofdpaneel聚焦主面板[vorige tab切换到上一个主面板页签]volgende tab切换到下一个主面板页签/filter list过滤列表2.2 Containers 面板按键荷兰语描述原文说明dverwijder删除容器everberg gestopte containers隐藏/显示已停止的容器ppause暂停容器sstop停止容器rherstart重启容器averbindenattach 连接进容器荷兰语“连接”mbekijk logs查看容器日志Eexec shell在容器中执行 shellcdraai een vooraf bedacht aangepaste opdracht执行预先定义好的自定义命令bview bulk commands查看批量操作命令此条为英文回退文案wopen in browser (first port is http)在浏览器中打开映射的第一个端口按 http 打开enterfocus hoofdpaneel聚焦主面板[vorige tab上一个主面板页签]volgende tab下一个主面板页签/filter list过滤列表2.3 DienstenServices面板按键荷兰语描述原文说明uup service启动up该服务英文回退文案dverwijder containers移除该服务的容器sstop停止服务ppause暂停服务rherstart重启服务Sstart启动start服务英文回退文案averbindenattach 连接到服务容器mbekijk logs查看服务日志Uup project启动up整个 compose 工程英文回退文案Ddown project停止down整个 compose 工程英文回退文案Rbekijk herstart opties查看重启选项菜单cdraai een vooraf bedacht aangepaste opdracht执行预先定义好的自定义命令bview bulk commands查看批量操作命令英文回退文案Eexec shell在服务容器中执行 shellwopen in browser (first port is http)在浏览器中打开第一个端口按 http 打开enterfocus hoofdpaneel聚焦主面板[vorige tab上一个主面板页签]volgende tab下一个主面板页签/filter list过滤列表2.4 Images 面板按键荷兰语描述原文说明cdraai een vooraf bedacht aangepaste opdracht执行预先定义好的自定义命令dverwijder image删除镜像bview bulk commands查看批量操作命令英文回退文案enterfocus hoofdpaneel聚焦主面板[vorige tab上一个主面板页签]volgende tab下一个主面板页签/filter list过滤列表2.5 Volumes 面板按键荷兰语描述原文说明cdraai een vooraf bedacht aangepaste opdracht执行预先定义好的自定义命令dverwijder volume删除卷bview bulk commands查看批量操作命令英文回退文案enterfocus hoofdpaneel聚焦主面板[vorige tab上一个主面板页签]volgende tab下一个主面板页签/filter list过滤列表2.6 Networks 面板按键荷兰语描述原文说明cdraai een vooraf bedacht aangepaste opdracht执行预先定义好的自定义命令dverwijder network删除网络bview bulk commands查看批量操作命令英文回退文案enterfocus hoofdpaneel聚焦主面板[vorige tab上一个主面板页签]volgende tab下一个主面板页签/filter list过滤列表2.7 HoofdMain 主面板按键荷兰语描述原文说明escterug返回退出当前主面板视图2.8 Globaal全局按键荷兰语描述原文说明next screen mode (normal/half/fullscreen)切换下一档屏幕模式普通/半屏/全屏_prev screen mode切换上一档屏幕模式1focus projects panel聚焦“项目”面板2focus services panel聚焦“服务”面板3focus containers panel聚焦“容器”面板4focus images panel聚焦“镜像”面板5focus volumes panel聚焦“卷”面板6focus networks panel聚焦“网络”面板三、为什么荷兰语表里混着英文——i18n 的合并回退机制细心的读者会发现同一张荷兰语表里bview bulk commands、u/U/Dup/down project等条目是英文。这不是翻译遗漏后的“脏数据”而是 pkg/i18n/i18n.go 中翻译集合并机制的直接结果NewTranslationSet 先以 englishSet() 为基底再用mergo.WithOverride把对应语言的翻译集叠加上去也就是说荷兰语翻译集dutchSet()没有覆盖的字段自动回退为英文。例如dutchSet()定义了Stop: stop、Restart: herstart、ViewRestartOptions: bekijk herstart opties但没有定义Start、UpService、UpProject、DownProject、ViewBulkCommands等字段于是这些键位的描述在荷兰语表中保持英文原样仓库还提供了一个辅助脚本 scripts/translations/get_required_translations.go它用反射遍历各语言翻译集列出所有取值仍为空的字段帮助译者定位“还差哪些没翻”。语言的选择入口在启动时解析pkg/app/app.go 中app.Tr, err i18n.NewTranslationSetFromConfig(app.Log, config.UserConfig.Gui.Language)即读取配置项gui.language。NewTranslationSetFromConfig 的行为是配置为auto时通过jibber_jabber库从系统环境变量LC_ALL、LANG探测语言探测失败回退为C配置为具体语言码时先校验其存在于 GetTranslationSets() 注册表pl、nl、de、tr、en、fr、zh、es、pt共 9 种未知语言码回退英文并报错。docs/Config.md 的配置示例中给出了language: auto的默认写法其行内注释仅列举了auto | en | pl | nl | de | tr这一子集而代码实际支持的完整语言集以GetTranslationSets()为准。想直接使用这份荷兰语界面和键位说明只需在配置文件中将gui.language设为nl。四、键位表背后的源码一次注册、三处复用速查表中的每一行都对应 pkg/gui/keybindings.go 中一条Binding记录。核心数据结构定义在 Binding 结构体// Binding - a keybinding mapping a key and modifier to a handler. The keypress // is only handled if the given view has focus, or handled globally if the view // is type Binding struct { ViewName string Handler func(*gocui.Gui, *gocui.View) error Key interface{} // FIXME: find out how to get gocui.Key | rune Modifier gocui.Modifier Description string }注释明确了作用域规则ViewName非空时按键仅在该视图面板获得焦点时生效ViewName为空则为全局键。这正好对应速查表的 8 个小节——同一枚按键在不同面板可以有不同的含义例如d在 Containers 面板是删除容器在 Images 面板是删除镜像在 Networks 面板是删除网络互不冲突。4.1 面板级键位如何“批量”出现在表里GetInitialKeybindings() 并非把所有面板键位逐一手写而是用循环为每个侧边面板统一追加侧边面板导航绑定对gui.allSidePanels()中的每个面板追加←/→、h/l、Tab/Backtab用于在面板间左右切换列表选择绑定setUpClickBindings为每个列表面板以及主面板统一绑定j/k、上下方向键、鼠标滚轮上下滚动、鼠标左键点击实现跨面板一致的 vim 风格列表操作面板焦点与页签绑定对每个侧边面板追加enterhandleEnterMain描述为FocusMain→ 荷兰语 “focus hoofdpaneel”、[HandlePrevMainTabPreviousContext→ “vorige tab”、]HandleNextMainTabNextContext→ “volgende tab”过滤绑定对未禁用过滤的列表面板追加/handleOpenFilter描述LcFilter→ “filter list”数字快捷跳转1–6分别通过gui.handleGoTo(...)聚焦 Projects/Services/Containers/Images/Volumes/Networks 面板描述对应FocusProjects等字段即速查表 Globaal 小节的全部内容。这解释了速查表的一个明显规律enter、[、]、/这 4 个键在 Project、Containers、Services、Images、Volumes、Networks 六个小节里完全重复——因为它们正是上述第 3、4 条循环为每个面板生成的。4.2 特殊键的显示名与“隐形”键位GetKey() 负责把键值转换为文档中展示的形式ASCII 码 27 显示为esc、13 显示为enter、32 显示为space方向键与PgUp/PgDn也有专门映射其余按fmt.Sprintf(%c, key)直接输出字符。同时要注意速查表只收录带Description的键位因此一批在源码中真实存在的全局键keybindings.go 无描述的全局绑定不会出现在本文第二节的表格里例如q/CtrlC退出程序gui.quitPgUp/PgDn与CtrlU/CtrlD主面板上下翻页End/Home主面板自动滚动 / 跳到顶部x或?打开当前面板的操作选项菜单handleCreateOptionsMenuX执行自定义命令handleCustomCommand大写J/K/H/L主面板上下左右滚动。从源码结构看这些“未进表”的键位与表内键位走完全相同的注册通道只是没有配置Description字符串因而被生成器跳过。4.3 注册时机所有键位最终由 keybindings() 方法 逐条交给底层 TUI 框架 gocui 的g.SetKeybinding(viewName, key, modifier, handler)完成注册并额外绑定主面板页签的鼠标点击事件。也就是说UI 行为、键位速查表、以及如后文CI 校验共用同一份GetInitialKeybindings()数据源保证了“文档即代码”的一致性。五、cheatsheet 的生成与一致性校验5.1 生成流程文件头提示的运行方式go run scripts/cheatsheet/main.go generate对应 scripts/cheatsheet/main.go它只是入口真正逻辑在 pkg/cheatsheet/generate.go 的 generateAtDir遍历i18n.GetTranslationSets()返回的每一种语言码对每种语言执行os.Setenv(LC_ALL, lang)并构造一个 App、调用SetupFakeGui()建立虚拟界面通过mApp.Gui.GetInitialKeybindings()取出全部键位按ViewName归入 8 个标题小节getBindingSections用 formatSections 拼出# Lazydocker {{Menu}}标题加各pre代码块每行格式为kbd键/kbd: 描述formatBinding最终写入docs/keybindings/Keybindings_{{lang}}.md。输出目录由 GetKeybindingsDir() 固定为仓库根目录下的docs/keybindings。5.2 check 命令防止文档与代码脱节go run scripts/cheatsheet/main.go check触发 Check()它在系统临时目录重新生成一遍全部速查表再与docs/keybindings/中的现有文件逐字节比对一旦不一致就通过difflib打印 unified diff并提示“Cheatsheets are out of date. Please rungo run scripts/cheatsheet/main.go generateat the project root and commit the changes”然后以非零码退出——适合接入 CI确保任何键位或翻译的改动都伴随速查表的同步提交。这也给出了贡献者视角的完整工作流修改 pkg/i18n 下的翻译文案或 keybindings.go 中的Description→ 运行 generate 重新导出 9 个语言文件 → 提交代码与文档的联合变更。六、实战要点小结面板内操作e容器面板切换隐藏已停止容器d删除、p/s/r暂停/停止/重启、aattach、m日志、Eexec shell、c自定义命令、w浏览器打开是最常用的容器操作组合Services 面板的“大小写”语义小写u只 up 单个服务大写U/D作用于整个 compose 工程S单独负责 start与u的 up 语义不同R打开重启选项菜单对应荷兰语 “bekijk herstart opties”主面板与导航enter从任意侧边面板跳入主面板[/]在主面板多个页签Logs/Config/Env/Stats 等间切换esc从主面板返回全局快捷1–6直接聚焦六个面板/_循环 normal/half/fullscreen 三种屏幕模式/在任何列表面板过滤表外但高频的全局键x/?打开操作菜单、q退出、j/k与方向键选择行——它们由源码统一注册只是未写入速查表换语言修改配置中的gui.language如设为nl或在auto模式下调整系统LC_ALL/LANG界面文案与本文键位描述即会整体切换。综上这份荷兰语键位表不只是一张静态表格它是 pkg/gui/keybindings.go 中Binding注册表经由 pkg/cheatsheet 生成器、在 pkg/i18n 翻译合并机制下自动导出的产物。理解这一链条后无论要查某个按键的准确行为还是想确认键位变更是否同步了文档都可以直接回到源码与生成脚本中找到确定性答案。【免费下载链接】lazydockerThe lazier way to manage everything docker项目地址: https://gitcode.com/GitHub_Trending/la/lazydocker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表