
开发工具【免费下载链接】pterm✨ PTerm is a modern Go module to easily beautify console output. Featuring charts, progressbars, tables, trees, text input, select menus and much more Its completely configurable and 100% cross-platform compatible.项目地址https://gitcode.com/gh_mirrors/pt/pterm点击查看免费下载本指南围绕 pterm 仓库中_examples/interactive_confirm目录下的示例系统讲解pterm.DefaultInteractiveConfirm交互式确认提示框的完整用法。你将掌握如何用三行代码实现终端内的「Y/n」确认询问、如何自定义问题文案与确认/拒绝按钮文案快捷键会自动跟随、如何理解并调整默认值、分隔符与样式以及了解其键盘事件与中断处理的源码级实现原理。功能概览什么是 InteractiveConfirmInteractiveConfirm 是 pterm 提供的一个交互式打印器printer用于在终端中向用户提出一个「是/否」类问题并等待用户按键后返回bool结果。它是 pterm 交互式组件家族见 printers.go 中列出的InteractiveConfirmPrinter、InteractiveSelectPrinter等中最轻量、最常用的一员常被用于「是否继续」「是否覆盖文件」「是否应用更新」等确认场景。使用它只需要一个入口方法Show()签名如下见 interactive_confirm_printer.gofunc (p InteractiveConfirmPrinter) Show(text ...string) (bool, error)Show()返回两个值用户确认与否的bool结果以及可能出现的错误。传入的可变参数text是可选的问题文本——如果不传或传空字符串则使用默认问题文本。默认配置一览仓库为DefaultInteractiveConfirm预置了一套开箱即用的默认配置见 interactive_confirm_printer.go配置项默认值说明DefaultValuefalse直接回车时的返回值默认是「否」DefaultTextPlease confirm未传入问题文本时展示的默认问题Delimiter: 问题文本与输入之间的分隔符TextStyleThemeDefault.PrimaryStyle问题文本的样式ConfirmTextYes确认按钮文案ConfirmStyleThemeDefault.SuccessMessageStyle确认文案的样式RejectTextNo拒绝按钮文案RejectStyleThemeDefault.ErrorMessageStyle拒绝文案的样式SuffixStyleThemeDefault.SecondaryStyle后缀[y/N]的样式默认行为总结按y确认、按n拒绝大小写不敏感直接按回车则返回默认值false相当于「否」。快速上手最简示例先从最简单的用法开始。示例源码位于 _examples/interactive_confirm/demo/main.go完整代码如下package main import ( github.com/pterm/pterm ) func main() { // The confirm prompt accepts y and n as shortcuts. Pressing enter // answers with the default value, which is no unless changed with // WithDefaultValue. result, _ : pterm.DefaultInteractiveConfirm.Show() pterm.Println() pterm.Info.Printfln(You answered: %s, boolToText(result)) } // boolToText renders the answer as a colored Yes or No. func boolToText(b bool) string { if b { return pterm.Green(Yes) } return pterm.Red(No) }代码要点pterm.DefaultInteractiveConfirm.Show()直接弹出确认提示框此时终端会显示Please confirm [y/N]:。返回值result是bool用户按y得到true按n得到false。示例中的boolToText只是把布尔值渲染成带颜色的「Yes / No」文本pterm.Green绿色表示确认、pterm.Red红色表示拒绝方便用户看清结果。按 _examples/README.md 的说明可以直接在示例目录下运行cd _examples/interactive_confirm/demo go run main.go从仓库的录制输出 testdata/raw/interactive_confirm_demo.txt 可以看到实际渲染效果Please confirm [y/N]: Yes INFO You answered: Yes这里值得注意两点提示行中y是小写、N是大写后缀[y/N]中大写的字母代表当前默认值默认DefaultValuefalse所以N被大写。按下y后Yes会紧跟提示以确认样式回显随后Show()返回并结束输入监听。自定义文案让确认框融入业务语义默认的「Yes / No」并不适合所有场景。例如升级程序时你希望用户看到的是「Apply / Cancel」。pterm 提供了一系列WithXxx链式方法示例位于 _examples/interactive_confirm/custom-answers/main.gopackage main import ( github.com/pterm/pterm ) func main() { // The answer texts can be customized. The keyboard shortcuts follow // along: the prompt accepts the lowercase first letter of each answer, // here a for Apply and c for Cancel. result, _ : pterm.DefaultInteractiveConfirm. WithDefaultText(Do you want to apply the update?). WithConfirmText(Apply). WithRejectText(Cancel). Show() pterm.Println() pterm.Info.Printfln(You answered: %s, boolToText(result)) } // boolToText renders the answer as a colored Apply or Cancel. func boolToText(b bool) string { if b { return pterm.Green(Apply) } return pterm.Red(Cancel) }运行后终端效果见 testdata/raw/interactive_confirm_custom-answers.txtDo you want to apply the update? [a/C]: Apply INFO You answered: Apply这个例子的核心价值在于揭示了一个重要设计键盘快捷键不是写死的y/n而是从 ConfirmText / RejectText 的首字母自动推导的。把确认文案改成Apply、拒绝文案改成Cancel后快捷键自动变为a和c大小写不敏感提示后缀也同步变成[a/C]。这一点由源码中的getShortHandles()保证见 interactive_confirm_printer.gofunc (p InteractiveConfirmPrinter) getShortHandles() (string, string) { y : strings.ToLower(string([]rune(p.ConfirmText)[0])) n : strings.ToLower(string([]rune(p.RejectText)[0])) return y, n }它取确认文案、拒绝文案的第一个字符[]rune处理兼容多字节字符并转为小写作为快捷键。同时getSuffix()会根据DefaultValue把默认项对应的字母转为大写见 interactive_confirm_printer.go这就是为什么默认值false时后缀显示为[y/N]、而将默认值设为true后显示为[Y/n]。注意如果自定义文案本身以y或n开头快捷键依然取其首字母并不会与「Yes/No」的原始语义冲突——因为此时快捷键已完全由文案决定。配置项详解完整的 With 方法家族InteractiveConfirmPrinter的所有配置项都对应一个链式WithXxx方法方法实现见 interactive_confirm_printer.go每个方法都返回*InteractiveConfirmPrinter因此可以无限链式拼接方法作用默认值WithDefaultText(text string)设置问题文本Show()不传参时使用Please confirmWithDefaultValue(value bool)设置回车时的默认返回值falseWithTextStyle(style *Style)设置问题文本样式主题 PrimaryStyleWithConfirmText(text string)设置确认按钮文案YesWithConfirmStyle(style *Style)设置确认文案样式主题 SuccessMessageStyleWithRejectText(text string)设置拒绝按钮文案NoWithRejectStyle(style *Style)设置拒绝文案样式主题 ErrorMessageStyleWithSuffixStyle(style *Style)设置[y/N]后缀样式主题 SecondaryStyleWithDelimiter(delimiter string)设置问题文本与输入的间隔符: WithOnInterruptFunc(exitFunc func())设置用户按下 CtrlC 中断时执行的回调无默认直接退出进程退出码 1一个综合使用所有配置项的例子result, _ : pterm.DefaultInteractiveConfirm. WithDefaultText(Do you want to deploy now?). WithDefaultValue(true). // 回车默认「是」 WithConfirmText(Deploy). WithRejectText(Abort). WithDelimiter( ). WithOnInterruptFunc(func() { pterm.Warning.Println(Deployment cancelled by user) }). Show()此时提示符会显示类似Do you want to deploy now? [D/a] 的效果回车直接返回true按CtrlC则触发自定义回调而不是直接退出。源码原理Show() 的按键处理与中断机制要真正理解 InteractiveConfirm 的行为需要看Show()的实现见 interactive_confirm_printer.go。整个交互流程可以拆成四步注册取消信号Show()一开始就调用internal.NewCancelationSignal(p.OnInterruptFunc)并defer exit()保证无论以何种方式返回都能完成清理见 internal/cancelation_signal.go。渲染提示以TextStyle打印问题文本、后缀和分隔符形如Please confirm [y/N]:。监听键盘通过keyboard.Listen进入事件循环处理三类按键keys.RuneKey普通字符小写化后与y/n快捷键比对命中则用ConfirmStyle/RejectStyle回显对应文案并返回结果keys.Enter不回显用户输入而是直接用DefaultValue作为结果并回显对应的默认文案keys.CtrlC调用cancel()标记中断并停止监听。中断处理如果发生过中断且用户没有提供OnInterruptFuncexit()会调用internal.Exit(1)直接以退出码 1 结束进程见 internal/exit.go提供了回调则执行回调。测试 interactive_confirm_printer_test.go 验证了「CtrlC 必须触发 OnInterruptFunc且被中断的提示不会返回确认」。另一个值得注意的实现细节是无关按键会被静默忽略。switch中没有匹配任何分支时返回(false, nil)事件循环继续等待直到用户按下合法的快捷键或回车。测试 interactive_confirm_printer_test.go 通过先模拟x、1、方向键下、最后按y的序列验证了无关按键不会影响最终结果。行为细节由测试用例佐证的交互语义仓库的单元测试 interactive_confirm_printer_test.go 对交互语义做了非常完整的覆盖这些行为可以直接当作使用手册大小写不敏感y/Y都确认n/N都拒绝测试TestInteractiveConfirmPrinter_AnswerKeys回车返回默认值DefaultValuefalse时回车返回false并回显NoDefaultValuetrue时回车返回true并回显Yes测试TestInteractiveConfirmPrinter_EnterReturnsDefaultValue后缀大写字母标识默认项默认值为false显示[y/N]为true显示[Y/n]测试TestInteractiveConfirmPrinter_PromptShowsDefaultInSuffix自定义文案驱动后缀与快捷键WithConfirmText(Absolutely)WithRejectText(Denied)后后缀变为[a/D]按a/A确认、按d/D拒绝测试TestInteractiveConfirmPrinter_CustomAnswerTexts。这些测试依赖 interactive_test.go 中提供的simulateKeys辅助函数通过keyboard.SimulateKeyPress模拟按键并用 10 秒超时防止Show()因无人按键而挂起整个测试套件。值得一提的是交互式打印器的测试依赖全局键盘模拟状态因此这些测试不能并行执行每次Show()必须恰好消费掉模拟的全部按键。自动化运行与示例录制CI 模式示例目录中除了main.go还有一个ci.go见 _examples/interactive_confirm/demo/ci.go 与 custom-answers/ci.go它的作用是在 CI 环境下自动模拟按键让演示程序可以无人值守地运行并用于录制动画func init() { if os.Getenv(CI) true { go func() { time.Sleep(time.Second * 2) keyboard.SimulateKeyPress(y) }() } }要点通过环境变量CItrue触发延迟 2 秒等提示渲染完成后用keyboard.SimulateKeyPress模拟一次按键demo 版本模拟ycustom-answers 版本模拟a对应自定义确认文案Apply的首字母。这个文件只是为示例录制/自动化服务的辅助代码业务代码可以完全忽略它但它也说明了一个通用的测试思路可以用atomicgo.dev/keyboard的按键模拟 API 为自己的交互式 CLI 写端到端测试。同时注意两个示例都只模拟了「确认」路径在实际交互中用户既可以确认也可以拒绝返回的bool值会如实反映按键选择。常见使用建议与注意事项确认框只做「是/否」判断如果需要在多个选项中做选择应使用InteractiveSelect如果需要用户自由输入文本应使用InteractiveTextInput。InteractiveConfirm 的设计目标是单一、快速的确认。善用DefaultValue降低操作成本对于「应用更新」这类高频但风险可控的操作把默认值设为true可以让用户直接回车完成确认对于「删除文件」这类高风险操作保持默认false回车即拒绝更安全。自定义文案时注意快捷键变化WithConfirmText/WithRejectText会同步改变按键快捷键和后缀向用户说明时要以渲染出的[x/X]后缀为准。不要忽略 error 返回值虽然示例中直接result, _ : ...Show()丢弃了错误但在真实产品代码中建议检查返回值尤其是在非交互式终端环境下运行时。中断处理要明确默认情况下按CtrlC会直接以退出码 1 结束进程如果希望优雅退出或执行清理逻辑务必通过WithOnInterruptFunc注册回调。小结pterm.DefaultInteractiveConfirm用极小的 API 面一个Show() 十个With方法封装了终端确认交互的完整闭环快捷键响应、默认值回退、自定义文案、样式控制与中断处理。本文介绍的demo与custom-answers两个示例源码在 _examples/interactive_confirm/demo/main.go 和 _examples/interactive_confirm/custom-answers/main.go覆盖了它的全部典型用法在此基础上interactive_confirm_printer.go 与 interactive_confirm_printer_test.go 分别从实现与测试两个角度为你的二次开发提供了可直接参考的依据。赞分享开发工具【免费下载链接】pterm✨ PTerm is a modern Go module to easily beautify console output. Featuring charts, progressbars, tables, trees, text input, select menus and much more Its completely configurable and 100% cross-platform compatible.项目地址https://gitcode.com/gh_mirrors/pt/pterm点击查看免费下载相关推荐PTerm 自定义默认打印器直接覆盖 pterm.Error 前缀与样式的实战指南PTerm 自定义默认打印器直接覆盖 pterm.Error 前缀与样式的实战指南 本指南聚焦 PTermGo 模块 github.com/pterm/pt开发工具Gopeed 下载器实战指南5 协议 MCP 直连 AI从 CLI 到 Docker 自托管速通Gopeed 下载器实战指南5 协议 MCP 直连 AI从 CLI 到 Docker 自托管速通 磁力链接在浏览器里转了十分钟还没动静。手动复制 URL网络CLI后端PTerm BoxPrinter 盒子打印器实战指南默认盒子、自定义内边距与任意边框标题PTerm BoxPrinter 盒子打印器实战指南默认盒子、自定义内边距与任意边框标题 BoxPrinter 是 PTerm 提供的用于在终端中渲染盒子开发工具上一篇MemGPT 接 Groq 报 No API key 和 Streaming 错改 2 处配置2 分钟跑通下一篇WuWa-Mod 鸣潮 PAK 模组:15 项客户端功能,怎么装、怎么挑创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考