news 2026/9/27 21:40:05

peco CLI 完全指南:入口实现、全部命令行参数、退出码与输入输出协议

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
peco CLI 完全指南:入口实现、全部命令行参数、退出码与输入输出协议
  • 开发工具
  • CLI

【免费下载链接】peco

Simplistic interactive filtering tool

项目地址:https://gitcode.com/gh_mirrors/pe/peco
点击查看免费下载

peco是一款用 Go 编写的简化版交互式过滤工具(Simplistic interactive filtering tool),它从 stdin 或文件读取行内容,让你一边输入查询一边实时过滤,最终把选中的行输出到 stdout 供下游命令继续消费。本文以仓库内的 CLI 参考文档(.claude/docs/cli.md)为骨架,结合cmd/peco/peco.go、options.go、peco.go 与 README.md 的源码实现,完整梳理 peco 的命令行入口、全部参数语义、退出码约定以及输入输出协议,帮助你掌握 peco 在脚本、管道与日常终端工作流中的正确用法。

入口点与启动流程

peco 的程序入口位于 cmd/peco/peco.go。main()先注册一个recover()兜底,随后调用_main();_main()的核心逻辑只有三步:

  1. 创建context,用于在整个生命周期内协调取消操作;
  2. 调用peco.New()构造全局的Peco实例(见 peco.go,内部初始化内存行缓冲、ID 生成器、查询执行状态、tcell 屏幕与选择集合);
  3. 调用cli.Run(ctx)启动整套 TUI 管线,并根据返回错误类型决定进程退出码。

Run()(peco.go)内部依次执行:

  • Setup():初始化默认配置 → 解析命令行参数 → 读取配置文件 → 将参数与配置合并应用到运行时(ApplyConfig)→ 创建消息总线;
  • parseCommandLine()(peco.go):使用go-flags解析argv,同时处理--help与--version的立即返回逻辑;若未指定--rcfile,则调用config.LocateRcfile自动查找配置文件;
  • SetupSource()(peco.go):确定输入来源并启动读取协程,阻塞到收到第一行数据;
  • 启动屏幕、输入循环、视图循环与过滤循环四个 goroutine,随后进入<-ctx.Done()等待用户操作结束。

从源码结构看,命令行参数解析是整个启动流程中最早的一环,其解析结果直接影响后续配置加载与运行时状态组装,因此理解每个参数的语义是使用 peco 的第一步。

命令行参数总览

CLIOptions结构体(options.go)以go-flags的 struct tag 定义了全部命令行参数。下表为完整清单(与 CLI 文档逐项对应):

Flag类型说明
--help(-h)bool显示帮助信息并退出
--versionbool显示版本号并退出
--querystring启动时的初始查询字符串
--rcfilestring配置文件路径
--buffer-size(-b)int搜索缓冲保留的最大行数(0 表示不限)
--nullbool使用 NUL(\0)作为行分隔/结果标记
--initial-indexint初始光标位置(0 起)
--initial-filterstring初始过滤器名称
--filter[]string注册的过滤器列表(按轮转顺序,可重复),覆盖配置项Filters;未知名称报错
--negation-prefix*string排除行的查询词前缀(默认-),传空串关闭负向匹配,覆盖配置项NegationPrefix
--promptstring查询行提示符
--layoutstring布局:top-down、bottom-up、top-down-query-bottom
--select-1bool输入仅 1 行时自动选中并立即退出
--exit-0bool输入为空时立即以状态 1 退出(部分文档中写作--exit-zero,源码 tag 为long:"exit-0",指同一开关)
--select-allbool全选所有行并立即退出
--on-cancelstring取消行为:success/error
--selection-prefixstring选中行的前缀标记(默认用颜色区分)
--execstring将选中内容通过管道交给指定命令执行
--print-querybool输出结果时把查询字符串作为第一行打印
--colorColorMode颜色模式:auto、none
--heightstring终端高度规格(如10、50%)

此外,源码中还定义了文档表格未列出、但实际可用的-f, --follow(跟随流式输入自动滚动,类似tail -f,见 options.go),阅读时可一并参考。

参数解析完成后会执行Validate()(options.go):当--layout非空时,必须命中config.IsValidLayoutType中定义的三种布局之一,否则返回unknown layout错误。

参数详解与源码级语义

基本信息类:--help、--version

--help会通过反射遍历CLIOptions的 struct tag 自动生成对齐的帮助文本(options.go),并返回一个"可忽略错误"让进程以 0 退出;--version则打印peco version v0.6.0 (built with go1.x)格式的版本信息(版本号定义于 peco.go)。

查询与过滤类

  • --query <string>:设置启动时的初始查询。设置后游标会自动定位到查询串末尾(utf8.RuneCountInString,见 peco.go),并在 peco 就绪后立即执行一次过滤。适合在脚本中提前猜出最可能的查询词,如cd $(ghq list --full-path | peco --query peco)。
  • -b, --buffer-size <num>:限制 peco 在任何时刻持有的行数上限,0(默认)表示不限制。对可能无限增长的流式输入尤其重要,可防止内存被耗尽。
  • --null:启用 NUL 分隔模式。每行输入中\0之前的部分用于显示与匹配,\0之后的部分作为退出时输出的"结果"。该开关在源码中对应enableSep字段,并会传递给Source与外部过滤器(peco.go)。
  • --initial-index <int>:0 起始的初始光标行号。例如想从第二行开始选中,传入1(peco.go 中>= 0才生效)。
  • --initial-filter <name>:指定启动时使用的过滤器,名字须为IgnoreCase、CaseSensitive、SmartCase、IRegexp、Regexp、Fuzzy之一,或自定义过滤器名。若名字无效,populateInitialFilter会报failed to set filter错误。
  • --filter <name>:可重复指定,按给定顺序注册过滤器,peco.RotateFilter(默认绑定C-r)只在这几个过滤器间轮转。默认情况下注册全部内置过滤器及所有自定义过滤器;一旦指定--filter,则以命令行为准,覆盖配置文件Filters段。未知名字会触发错误并列出可接受的过滤器名(peco.go)。注意--initial-filter指定的名字必须属于已注册集合。
  • --negation-prefix <string>:定义"排除词"前缀,默认-。空值关闭负向匹配,所有词按原样匹配;换其他字符(如!)则保留负向匹配同时让连字符参与字面匹配。该值最终经filter.WithNegationPrefix注入每个过滤器(filter/option.go),负向词通过正则排除实现(isExcluded,见 filter/filter.go)。命令行写法建议带=:--negation-prefix=,否则以-开头的值会被当作新选项解析。

界面与布局类

  • --prompt <string>:查询行提示符,默认QUERY>(config.DefaultPrompt,见 config/config.go)。命令行优先级高于配置文件的Prompt。
  • --layout <type>:三种取值对应三种屏幕排布——top-down(默认,提示符在顶、列表居中、状态行在底)、bottom-up(列表逆序显示在顶、提示符在下)、top-down-query-bottom(列表在顶、查询提示符沉底)。对 percol 用户而言,--layout=bottom-up约等于--prompt-bottom --result-bottom-up。
  • --height <num|percentage>:让 peco 以"内联"模式在终端底部渲染指定行数,而不是占满整个备用屏幕,从而保留上方滚动历史(类似 fzf 的--height)。绝对值--height 5表示 5 行结果区,提示符与状态栏自动追加(共 7 行);百分比--height 50%表示占终端总高度(含提示符与状态栏)的比例。最小有效高度为 3 行(1 行结果 + 提示符 + 状态栏),超出终端高度会被截断——这些规则由 config/height.go 的Resolve实现,ChromLines = 2常量即提示符与状态栏占用的行数。内联模式还会设置环境变量TCELL_ALTSCREEN=disable阻止 tcell 使用备用屏幕缓冲,异常终止(如SIGKILL)后可能需要手动unset TCELL_ALTSCREEN。
  • --color auto|none:控制输入中 ANSI SGR 转义序列的解析与渲染。auto(默认)保留git log --color、rg --color=always等管道输入的颜色;none则剥离转义序列。匹配过滤始终针对剥离后的纯文本进行,输出时保留原始 ANSI 码。该开关只影响"输入 ANSI 颜色"这一层,与配置Style控制的 UI 样式(选中高亮、匹配高亮等)相互独立。
  • --selection-prefix <string>:用指定前缀代替变色来标记当前选中行(实验性),默认仍以颜色区分。等价于配置文件中的SelectionPrefix。

行为控制类

  • --select-1:当且仅当输入恰好 1 行时,自动选中该行并立即退出,不进入交互界面。源码在selectOneAndExitIfPossible(peco.go)中通过 CAS 原子操作保证多 goroutine 并发下只触发一次。若输入有多行,则照常展示选择界面。
  • --exit-0:输入为 0 行时立即以状态 1 退出。exitZeroIfPossible(peco.go)检查缓冲区为空后构造exitStatusError{status: 1}。
  • --select-all:全选所有输入行并立即退出,不展示选择界面(selectAllAndExitIfPossible,peco.go)。当同时存在初始查询时会先执行查询再全选当前结果。
  • --on-cancel success|error:定义用户按 Esc 取消时的退出语义。默认success(兼容历史行为,取消也返回 0);error则返回非零状态。配置项OnCancel与其等价,命令行优先。OnCancelBehavior的合法值校验见 config/config.go。

上述三个"立即退出"开关(--select-1、--exit-0、--select-all)都由startEarlyExitHandlers(peco.go)以独立 goroutine 等待输入源SetupDone()后触发,适合批量脚本场景。

输出类

  • --print-query:退出时把最终查询字符串作为输出的第一行打印。正常结束(回车确认)时即使没有匹配也会打印;按 Esc 取消时不会打印。实现见PrintResults(peco.go)。
  • --exec <command>:不再"选出即退出",而是把当前选中的行通过 stdin 管道交给外部命令(经/bin/sh -c或cmd /c执行)。命令执行完毕后控制权返回 peco,可继续浏览搜索缓冲并重复执行;此时要真正退出 peco 需按 Esc(Cancel)。peco 自身最终的退出状态码继承自该外部命令的退出状态——这就是文档中"Custom — from--execcommand exit status"的来源。

退出码语义

peco 的退出码由 cmd/peco/peco.go 中的错误分类决定:

退出码场景
0成功(有行被选中并输出)
0取消(默认行为,--on-cancel success)
1取消且指定了--on-cancel error
自定义--exec指定命令的退出状态码

底层机制:Run()返回的p.Err()会被包装为特定错误类型——collectResultsError触发结果打印并以 0 退出;ignorableError(如--help、--version)直接返回 0;exitStatusError(如--exit-0的空输入、--exec的子命令状态)携带ExitStatus()返回值;其余未知错误打印到 stderr 并以 1 退出。

输入处理:stdin、文件与流式输入

SetupSource的输入选择逻辑(peco.go)遵循三条规则:

  1. 位置参数指向文件:命令行剩余参数(p.args[1]起)存在时,直接os.Open该文件作为输入;
  2. 默认读 stdin:无位置参数且 stdin 不是 TTY 时,从 stdin 读取,并把该来源标记为isInfinite = true——这意味着后续查询无法使用批量模式,只能采用"发送即查 + 超时回调"的流式策略(sendQuery与waitAndCall,见 peco.go);
  3. 既无文件也无管道则报错:提示you must supply something to work with via filename or stdin。

典型用法:

# stdin 管道 ps aux | peco # 直接读文件 peco /var/log/nginx/access.log # 无限流 + 缓冲上限 journalctl -f | peco --buffer-size 1000

流式输入(isInfinite)还会影响--select-1的判定时机:由于无法等待过滤管线结束,源码采用 2 秒超时 + 100ms 轮询的waitAndCall机制做"尽力而为"的单行检查(peco.go)。

输出处理:选中行、查询首行与命令管道

退出时PrintResults(peco.go)按以下顺序产出:

  1. 若当前没有任何选中行,则把光标所在行自动加入选择集,保证总有一条结果;
  2. 若启用--print-query,先把查询字符串写入缓冲并追加换行;
  3. 遍历选择集(按原始顺序Ascend),每行调用line.Output()输出到 stdout,逐行换行分隔。

三种输出模式的对比:

# 模式一:选中行逐行输出到 stdout ps aux | peco # 模式二:查询串作为第一行输出 ps aux | peco --print-query --query root # 输出示例: # root # root 12345 ... # 模式三:选中内容交给下游命令 ls *.go | peco --exec 'wc -l'

在--null模式下,输出的是每行\0之后的结果段,适合"显示 A 输出 B"的映射场景。

参数优先级:命令行 > 配置文件 > 内置默认值

从ApplyConfig(peco.go)的赋值顺序可以清晰归纳出 peco 的优先级约定:命令行选项优先于配置文件,配置文件优先于内置默认值。典型示例:

  • --negation-prefix:先取filter.DefaultNegationPrefix(-),再被配置NegationPrefix覆盖,最后被命令行覆盖;
  • --height:命令行OptHeight非空则用之,否则取配置Height;
  • --filter/--initial-filter:OptFilters为空才回落到p.config.Filters,OptInitialFilter为空才回落p.config.InitialFilter;
  • --follow:opts.OptFollow || p.config.Follow合并生效;
  • --prompt、--on-cancel、--selection-prefix同理。

配置文件支持 JSON 与 YAML(按扩展名区分,见 config/config.go),未指定--rcfile时按顺序查找$XDG_CONFIG_HOME/peco/config.{json,yaml,yml}、~/.config/peco/...、$XDG_CONFIG_DIRS各目录及~/.peco/...(config/config.go)。

实战速查

# 最基础:管道过滤,回车选中,Esc 取消 ps aux | peco # 带初始查询与提示符,适合脚本预判 history | peco --query 'git' --prompt 'HIST>' # 多选并交给命令(配合 C-Space 多选) ls | peco --exec 'xargs cat' # 流式日志跟随 + 沉底布局 journalctl -f -n 1000 | peco --follow --layout top-down-query-bottom # 只注册两个过滤器轮转 peco --filter IgnoreCase --filter Fuzzy < input.txt # 禁用负向匹配(历史记录里满是连字符的场景) history | peco --negation-prefix= # 内联高度模式,保留终端滚动历史 ls | peco --height 40%

小结

peco 的 CLI 设计遵循"小而锐"的哲学:入口极简(New()+Run(ctx)),参数全部收敛在CLIOptions结构体中,退出码、输入来源与输出格式都有清晰而稳定的契约。理解这些命令行语义——尤其是--filter/--negation-prefix/--height/--exec这类与配置项联动的参数,以及"命令行 > 配置 > 默认值"的优先级规则——能让你在 shell 脚本、日志检索与文件导航场景中把 peco 用出最大的生产力。

  • 开发工具
  • CLI

【免费下载链接】peco

Simplistic interactive filtering tool

项目地址:https://gitcode.com/gh_mirrors/pe/peco
点击查看免费下载

相关推荐

上一篇:如何通过Zotero-GPT实现文献管理的智能革命:从手动整理到AI驱动的知识发现
下一篇:如何在ComfyUI中快速实现AI换脸:ReActor Node完整入门指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 21:38:12

老设备还能越狱:palera1n 在 A8–A11 上的 checkm8 越狱完整实操

老设备还能越狱&#xff1a;palera1n 在 A8–A11 上的 checkm8 越狱完整实操 【免费下载链接】palera1n Jailbreak for A8 through A11, T2 devices, on iOS/iPadOS/tvOS 15.0, bridgeOS 5.0 and higher. 项目地址: https://gitcode.com/GitHub_Trending/pa/palera1n pa…

作者头像 李华
网站建设 2026/9/27 21:38:03

wp-calypso PluginIcon 组件深度解析:插件图标渲染的完整实战指南

前端CMS 【免费下载链接】wp-calypso The JavaScript and API powered WordPress.com 项目地址&#xff1a; https://gitcode.com/gh_mirrors/wp/wp-calypso 点击查看 免费下载 本指南围绕 WordPress.com 的 JavaScript 客户端项目 wp-calypso 中的 PluginIcon 组件展开&#…

作者头像 李华
网站建设 2026/9/27 21:36:57

Cursor 终端乱码解决:TaoToken 配置 settings.json 与 chcp 65001 实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华