ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Gum Format 实战指南:用 Glamour 在终端渲染 Markdown、代码高亮、模板与 Emoji

2026/9/30 2:32:31 拓冰建站 浏览量
Gum Format 实战指南:用 Glamour 在终端渲染 Markdown、代码高亮、模板与 Emoji CLI开发工具【免费下载链接】gumA tool for glamorous shell scripts 项目地址https://gitcode.com/gh_mirrors/gu/gum点击查看免费下载导读gum format是 GumA tool for glamorous shell scripts 中负责文本格式化渲染的子命令它能把 Markdown、带语法高亮的代码、模板样式字符串以及:name:形式的命名 Emoji 转换为终端可直接阅读的彩色输出。本文以 format/README.md 为骨架结合 format/options.go、format/command.go、format/formats.go 等源码完整讲解四种解析格式的用法、全部参数与环境变量并深入底层渲染调用链让你能在自己的 Shell 脚本中直接产出人眼友好的格式化文本。概览format 子命令与四种可解析格式gum format的核心能力是把一段文本按指定类型解析并渲染为人类可读的终端输出。它支持四种可解析格式见 format/README.md 与 format/formats.go 中的code、emoji、template、markdown四个实现函数Markdown将任意输入渲染为 Markdown 文本底层使用 Glamour。Code渲染任意代码片段并做语法高亮底层由 Glamour 及其内部使用的 Chroma 处理着色。Template从字符串模板渲染带样式的文本模板引擎基于 Gotext/template并注册了丰富的样式辅助函数。Emoji解析并渲染:name:形式的命名 Emoji由 Glamour 与 Goldmark Emoji 驱动。在 gum.go 中Format字段被注册为 Gum 的一个顶层命令其注释明确说明允许你从markdown、code、template字符串或内嵌emoji字符串渲染带样式的文本。也就是说gum format是 Gum 众多交互式组件choose、filter、input 等之外一个纯粹的非交互式文本处理器非常适合嵌入管道与脚本。命令参数总览type / theme / language / strip-ansigum format的全部选项定义在 format/options.go 的Options结构体中使用 Kong 解析。参数说明如下表参数短选项类型默认值环境变量说明--type-tstringmarkdownGUM_FORMAT_TYPE指定解析格式枚举值markdown,template,code,emoji--theme—stringpinkGUM_FORMAT_THEMEMarkdown 渲染使用的 Glamour 主题--language-lstring空GUM_FORMAT_LANGUAGE指定要解析的编程语言用于代码高亮--strip-ansi—booltrueGUM_FORMAT_STRIP_ANSI从 stdin 读取时是否剥离 ANSI 转义序列可被--no-strip-ansi取反位置参数Template—string 切片空—模板/文本字符串也可通过 stdin 提供值得注意的两个细节输入二选一位置参数与 stdin 是互斥的输入来源。在 command.go 的Run()中如果len(o.Template) 0则把位置参数用换行符拼接作为输入否则走stdin.Read(stdin.StripANSI(o.StripANSI))读取管道输入。type 的默认分支Run()的switch o.Type中code、emoji、template各有专属分支而default统一走markdown(input, o.Theme)因此即使不写--type markdown也会按 Markdown 处理。输入方式命令行参数与 stdin 双通道gum format支持两种输入方式与 README 中你可以直接以参数传递输入行或通过 stdin 传入 Markdown的描述一致# 方式一通过重定向从文件/管道读入 gum format --type markdown README.md # 方式二直接作为参数传入适合快速构造列表 gum format --type markdown -- # Gum Formats - Markdown - Code - Template - Emoji其中--用于终止参数解析避免以-开头的文本被误认为标志。参数输入的本质是Run()将多个位置参数以\n连接成单一段落再交给渲染器command.go。stdin 路径则由 internal/stdin/stdin.go 的Read()实现它先通过IsEmpty()判断管道是否有数据依据os.Stdin.Stat()的命名管道模式或文件大小再逐 rune 读取并strings.TrimSpace去除首尾空白若启用了StripANSI还会用github.com/charmbracelet/x/ansi的ansi.Strip剥离输入中的 ANSI 转义序列。这正是--strip-ansi默认值为true的底层行为——保证格式化已被样式化的输出时不会把转义序列当成普通文本一并渲染。Markdown让 README 在终端里长出来Markdown 模式是gum format的默认类型底层使用Glamour渲染器README 原文This uses Glamour behind the scenes。对应实现见 formats.go 的markdown()renderer, err : glamour.NewTermRenderer( glamour.WithStylePath(theme), glamour.WithWordWrap(0), ) output, err : renderer.Render(input)WithStylePath(theme)表示按--theme指定的 Glamour 主题渲染默认主题为pinkWithWordWrap(0)则关闭自动换行交给终端自行折行。用法示例gum format --type markdown README.md # 或直接传参快速构造清单 gum format --type markdown -- # Gum Formats - Markdown - Code - Template - Emoji # stdin 等价写法主 README 中的示例 echo # Gum Formats\n- Markdown\n- Code\n- Template\n- Emoji | gum format在根目录 README.md 中gum format -- # Gum Formats - Markdown - Code - Template - Emoji被作为 format 命令的第一个演示用例说明一行参数直接渲染 Markdown正是官方推荐的快速玩法。换主题只需--theme或环境变量GUM_FORMAT_THEME例如gum format --theme dark README.md。Code开箱即用的语法高亮code模式把任何代码片段渲染为带语法高亮的终端文本。README 指出Glamour 内部使用Chroma完成着色Glamour, which uses Chroma under the hood, handles styling。code()的实现formats.go值得细看——它并没有调用独立的代码高亮接口而是把输入包进 Markdown 围栏代码块后交给 Glamour 渲染renderer, err : glamour.NewTermRenderer( glamour.WithEnvironmentConfig(), glamour.WithWordWrap(0), ) output, err : renderer.Render(fmt.Sprintf(%s\n%s\n, language, input))WithEnvironmentConfig()让渲染器读取终端环境配置language即--language/-l参数会被拼进围栏标记languageChroma 据此选择语法解析器。不指定语言时Glamour 会尝试自动识别README 示例cat options.go | gum format --type code未带-l也能得到合理的着色。用法示例# 从文件/管道读取 cat options.go | gum format --type code # 指定语言短选项 gum format -t code -l go main.go # 也可直接传参 gum format --type code --language python print(Hello, Gum!)仓库 examples/test.sh 中演示了多行 Go 代码经 stdin 传入gum format -t code的用法而 examples/format.ansi 则记录了gum format -t code main.go的真实 ANSI 输出——可以看到package、import、func、Println等关键字被赋予了不同的 256 色如 204、173、39、42 号色这正是 Chroma 高亮在终端中的落地效果。Template用模板函数给文本上妆template模式渲染来自字符串模板的带样式输入。README 将模板能力归功于 Termenv并给出了经典示例gum format --type template {{ Bold Tasty }} {{ Italic Bubble }} {{ Color 99 0 Gum }} # 或通过 stdin echo {{ Bold Tasty }} {{ Italic Bubble }} {{ Color 99 0 Gum }} | gum format --type template在当前仓库的实现中formats.go模板引擎使用 Go 标准库text/template样式能力来自templateFuncs()注册的一组辅助函数其命名与 Termenv 模板辅助函数保持一致便于熟悉 Termenv 的读者无缝迁移。全部辅助函数如下函数签名示例效果Color{{ Color fg bg text }}前景色 背景色仅传 2 个参数时只设前景色Foreground{{ Foreground fg text }}只设前景色Background{{ Background bg text }}只设背景色Bold{{ Bold text }}加粗Faint{{ Faint text }}弱化浅色Italic{{ Italic text }}斜体Underline{{ Underline text }}下划线Overline{{ Overline text }}上划线Blink{{ Blink text }}闪烁Reverse{{ Reverse text }}反显反转前景/背景CrossOut{{ CrossOut text }}删除线Color的取值规则从 formats.go 可以精确还原传 2 个参数时第 1 个是前景色传 3 个参数时前两个分别为前景色、背景色无论何种情况最后一个参数都是要渲染的文本。因此{{ Color 99 0 Gum }}的含义是前景色 99、背景色 0、文本为 Gum 。颜色值可以是 256 色编号或十六进制色值底层由 Lip Gloss 的lipgloss.Color与lipgloss.NewStyle()实现。所有样式函数最终都通过styleFunc工厂formats.go包装逐个作用于文本。组合示例echo {{ Bold Tasty }} {{ Italic Bubble }} {{ Color 99 0 Gum }} \ | gum format -t template # 管道中叠加样式 gum format --type template {{ Foreground 212 Sweet }} {{ Reverse Gum }} {{ Underline Rocks }}Emoji让:name:变成真正的 Emojiemoji模式解析并渲染:name:形式的命名 EmojiREADME 注明其由Glamour 与 Goldmark Emoji共同驱动两者已列于 go.mod 依赖中charm.land/glamour/v2与github.com/yuin/goldmark-emoji。实现同样直白formats.gorenderer, err : glamour.NewTermRenderer(glamour.WithEmoji()) output, err : renderer.Render(input)glamour.WithEmoji()开启 Glamour 的 Emoji 扩展输入中的:heart:、:candy:会被替换为对应 Unicode Emoji 字符。用法示例gum format --type emoji I :heart: Bubble Gum :candy: # 你懂的同样支持 stdin echo I :heart: Bubble Gum :candy: | gum format --type emoji # 短选项写法 echo :candy: | gum format -t emojiexamples/test.sh 中的echo :candy: | gum format -t emoji是仓库内的直接验证用例。命名 Emoji 的完整列表对应 GitHub 的 Emoji APIREADME 指引读者参考该 API 获取全部:name:名称。TablesMarkdown 表格的 Glamour 渲染gum format的 README 单独用一节说明表格表格同样由 Glamour 渲染。这并非独立的第五种格式而是 Markdown 渲染能力的一部分——Glamour 支持 GFMGitHub Flavored Markdown风格的管道表格。README 给出的示例表格Bubble Gum FlavorPriceStrawberry$0.99Cherry$0.50Banana$0.75Orange$0.25Lemon$0.50Lime$0.50Grape$0.50Watermelon$0.50Pineapple$0.50Blueberry$0.50Raspberry$0.50Cranberry$0.50Peach$0.50Apple$0.50Mango$0.50Pomegranate$0.50Coconut$0.50Cinnamon$0.50要获得同样的效果把这段 Markdown 表格文本喂给gum format即可cat EOF | gum format -t markdown | Bubble Gum Flavor | Price | | ----------------- | ----- | | Strawberry | $0.99 | | Banana | $0.75 | | Grape | $0.50 | EOF需要说明的是仓库中还另有一个独立的gum table命令在 gum.go 注册用于把 CSV 数据渲染为可选择行的交互式表格它与gum format的 Markdown 表格渲染是两条不同的能力线本文聚焦的gum format表格能力即Markdown 中嵌表格 → Glamour 渲染读者不要混淆。输出适配终端能力与颜色降级格式化结果最终经Run()末尾的fmt.Fprint(tty.Writer(), output)输出command.go。这里的tty.Writer()来自 internal/tty/tty.go它基于colorprofile.NewWriter(os.Stdout, os.Environ())创建一个按环境自适应的写入器——会根据NO_COLOR、CLICOLOR、CLICOLOR_FORCE等环境变量以及当前终端的颜色能力自动降级或剥离 ANSI 序列。这意味着输出重定向到文件或管道非 TTY时颜色会被自动剥离gum format可安全地嵌入脚本流水线脚本希望强制控制颜色行为时可通过CLICOLOR_FORCE等标准环境变量影响渲染结果无需改动命令参数。实战组合把 format 融进 Gum 工作流gum format的输出是纯文本流天然适合与其他 Gum 命令及 Unix 管道组合。参考 examples/test.sh 与根 README.md可以搭建出如下实用场景# 1) 把 README 高亮后交给分页器浏览 gum format -t markdown README.md | gum pager # 2) 动态生成带样式的状态文本 STATUS$(gum format -t template {{ Bold Deploy }} {{ Color 42 0 OK }}) echo $STATUS # 3) 脚本头部打印语法高亮的代码片段 cat EOF | gum format -t code -l go func main() { fmt.Println(Hello, Gum!) } EOF # 4) 用命名 Emoji 美化日志 gum format -t emoji All checks passed :white_check_mark:小结源码调用链一览最后用一条调用链收束全文帮助读者快速定位实现位置命令入口gum format在 gum.go 注册为format.Options参数解析Options定义于 format/options.go提供--type/-t、--theme、--language/-l、--strip-ansi及环境变量GUM_FORMAT_TYPE、GUM_FORMAT_THEME、GUM_FORMAT_LANGUAGE、GUM_FORMAT_STRIP_ANSI输入读取位置参数以\n拼接或经 internal/stdin/stdin.go 读取 stdin可选剥离 ANSI格式分发与渲染Run()的 switch 分发到 format/formats.go 的markdown/code/template/emoji四个函数全部基于 Glamour模板额外使用 Gotext/template Lip Gloss 样式函数代码高亮由 Glamour 内部的 Chroma 完成输出经 internal/tty/tty.go 的tty.Writer()按终端颜色能力自适应输出。至此你已经掌握gum format的全部四种格式、完整参数与环境变量、以及底层渲染原理——下次写 Shell 脚本时别忘了用一行gum format让输出优雅起来。赞分享CLI开发工具【免费下载链接】gumA tool for glamorous shell scripts 项目地址https://gitcode.com/gh_mirrors/gu/gum点击查看免费下载相关推荐forgecode 终端 Markdown 代码块渲染原理与多语言高亮实践forgecode 终端 Markdown 代码块渲染原理与多语言高亮实践 本文以 crates/forge_display 中的多语言代码块测试文档 code人工智能AI Agent代码智能体AI 应用CLI开发工具Nitro Shiki 实战在服务端完成代码高亮渲染Nitro Shiki 实战在服务端完成代码高亮渲染 导读 本指南基于 Nitro 官方示例 examples/shiki https://link.gi后端Web框架SSRGulp自动化工作流实战使用Starter-Kit-2018提升开发效率Gulp自动化工作流实战使用Starter Kit 2018提升开发效率 想要快速提升前端开发效率Starter Kit 2018为你提供了一套完整的Gul上一篇CookLikeHOC 香芋蒸排骨复刻指南荔浦芋头 × 调理排骨的 18 分钟标准化蒸制工艺下一篇Zulip 未读消息同步机制解析从 unread_msgs 初始状态到三事件增量维护创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考