Oh My Posh 如何用 --data 从数据文件确定性渲染提示符?
【免费下载链接】oh-my-poshThe most customisable and low-latency cross platform/shell prompt renderer项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-posh
Oh My Posh 的提示符默认从"活的环境"取值:git 仓库状态、Azure CLI 上下文、kubectl 配置、退出码等,都会随机器和环境变化。这就带来一个实际问题:同一份配置,换一台没装 git 或没配云工具的机器,渲染结果就不同,甚至某些分段直接消失。如果你想截取提示符截图、做演示,或在一台缺少日常工具链的机器上测试配置,就需要一种与真实环境解耦的渲染方式。
--data标志就是为此设计的:它从数据文件提供模板属性,而不是从活环境读取。文档给出的典型用途是"take prompt screenshots, build demos, or test a config on a machine that lacks your usual setup"。该标志可用在两个命令上:
oh-my-posh print(所有提示符类型)oh-my-posh config export image
完整说明见 Template data 文档。
数据文件的格式
数据文件有两个顶层部分:
env:全局模板属性(即模板中使用的.PWD、.Code、.UserName等属性对应的键)segments:每个分段各自的模板属性
文件格式为 JSON、YAML 或 TOML,由文件扩展名决定。手写形式示例(文档示例,值可按需替换):
{ "env": { "PWD": "~/dev/oh-my-posh", "Code": 1, "ExecutionTime": 341.0, "UserName": "jan", "HostName": "demo", "Shell": "pwsh", "Root": false }, "segments": { "git": { "HEAD": "main", "Working": { "Added": 2, "Modified": 1 }, "Staging": {}, "UpstreamIcon": "" }, "az": { "Name": "posh-subscription", "EnvironmentName": "AzureCloud", "Origin": "CLI" } } }env部分怎么取值
- 键对应你已经在模板里用的全局模板属性(
PWD、AbsolutePWD、PSWD、Folder、UserName、HostName、Shell、ShellVersion、Root、OS、WSL、SHLVL、Jobs、Code、PromptCount、Version、Var),外加ExecutionTime和PipeStatus。这些属性的完整定义见 Templates 文档的 Global properties 一节。 - 文件中出现的键会覆盖活环境的值;没写的键回落到真实环境。所以只需配置自己的主题依赖的属性,不必写全。
Folder会根据生效的PWD自动推导;需要不同的文件夹名时才显式写Folder键覆盖。maps配置中的别名(user_name、host_name、shell_name)对数据文件的值和对活环境的值一样生效,见 General 文档的 Maps 一节。- 优先级从高到低是:
print上的显式 CLI 标志(如--pwd、--status、--execution-time)> 数据文件 > 活环境。PWD、Code、ExecutionTime、PipeStatus不只影响模板上下文,还会喂给运行时本身,因此依赖它们计算的分段(如 path、status、executiontime 分段)也会看到覆盖后的值。
segments部分怎么取值
- 每个键是分段的
alias(如果配置里设了),否则是type(如git、az)。值是对象,键为该分段的模板属性,属性名以各分段文档页为准。 - 出现在数据文件中的分段会被强制启用:即使它的常规检测在活环境中会把它抑制掉(比如一台没有电池的机器上的 battery 分段),它照样渲染。文件里没列出的分段则按活环境正常执行。
- 个别分段存储属性名与模板暴露的名字不同。例如 wakatime 分段把
.CumulativeTotal存为cumulative_total。如果你手写的某个属性没有效果,运行一次oh-my-posh config export data,从它的输出里抄属性名——录制器用的永远是存储名。 - 如果配置里有两个同类型的分段,必须给每个设不同的
alias,否则两个分段会匹配segments里同一个type键,无法拿到各自的数据。例如配置里有两个path分段:
{ "segments": [ { "type": "path", "alias": "PathMain", "style": "plain", "foreground": "#ffffff" }, { "type": "path", "alias": "PathSecondary", "style": "plain", "foreground": "#ffffff" } ] }对应的数据文件按 alias 区分:
{ "segments": { "PathMain": { "Path": "~/dev/oh-my-posh" }, "PathSecondary": { "Path": "~/dev/site" } } }模板方法是基于你提供的数据求值的,所以.Working.String这类方法会从文件里的Working属性算出结果,与活仓库中行为一致。只有渲染时读取活运行时状态的逻辑无法这样复现。
录制数据文件:唯一保证完全隔离的路径
手写的数据文件没有version标记,Oh My Posh 会先运行分段的检测,再把手写的属性叠加上去(补齐你没设的值)。代价是该分段仍然会接触活环境。Oh My Posh 每次走这条路径都会发出警告并指明是哪个文件。
要得到完全不接触环境的确定性渲染,用录制器生成数据文件:
oh-my-posh config export data --config mytheme.omp.json --output data.json| 标志 | 说明 |
|---|---|
--config | 要渲染的配置 |
--output | 写入数据的文件,默认输出到 stdout |
config export data针对真实环境渲染一次提示符,写出完整的数据文件:env部分加上每个已配置分段(无论录制时是否启用)。它会自动省略Var(配置自己的var部分已经定义了这些值;你也可以手动在文件里写Var覆盖)。
录制出的文件带顶层version标记,每个分段包在一个信封里,把录制时的启用状态和数据成对保存:
{ "version": 1, "segments": { "git": { "enabled": true, "data": { "HEAD": "main" } }, "wakatime": { "enabled": false, "data": {} } } }这是唯一能保证完全隔离重放的方式:对录制文件使用--data时,任何分段(包括录制时被禁用那些)都不会接触网络、文件系统、git 或任何其它工具。
录制一次,任何地方重放:在一台 git、云 CLI 和语言运行时都配置好的机器上跑上面的命令,之后可以手动编辑值,再用--data在任何地方重放。编辑data对象内部的值是安全的;编辑enabled也安全,但有一个坑:把一个data为空的分段的enabled打开,会渲染出空分段,因为它的属性从未被采集过。
--data-derive是把手写的"先检测再叠加"行为应用到录制文件上:忽略录制的enabled状态和数据,运行每个分段的检测。它用于调试录制器或某个分段的Enabled逻辑,但对你传入的那个命令放弃了完全隔离的重放。
端到端流程:从录制到确定性渲染
- 在一台工具齐全、状态理想的机器上录制数据文件:
oh-my-posh config export data --config mytheme.omp.json --output data.json编辑
data.json,调整你想展示的值:分支名、退出码、Azure 订阅等。从编辑后的数据渲染提示符图像,不触碰 git、Azure CLI 或配置依赖的任何其它东西:
oh-my-posh config export image --config mytheme.omp.json --data data.jsonconfig export image写出渲染后提示符的 SVG。它从提示符自身的内部表示绘制,而不是截图,所以每种颜色、样式和字符都与终端实际显示一致。与确定性渲染相关的两个标志:
| 标志 | 说明 |
|---|---|
--data | 从录制的数据文件渲染,而不是从活环境 |
--data-only | 完全拒绝活环境:分段要么从--data渲染,要么报告自身不存在 |
如何判断渲染是否符合预期
- 完全隔离是否成立:看数据文件是否为录制文件(带顶层
version标记)。只有录制文件保证--data重放时任何分段都不接触网络、文件系统、git 或工具链。 - 是否走了解析回落路径:用无
version标记的手写文件时,Oh My Posh 每次都会警告并指明文件名。出现这个警告说明分段仍在接触活环境,结果不是纯数据文件驱动的。 - 某个手写的分段属性没生效:多半是属性名和存储名不一致。跑一次
config export data,以它输出中的名字为准。 - 渲染结果为空:检查是不是把一个
data为空的分段改成了enabled: true——属性从未被采集,渲染结果自然是空分段。
限制
- 手写数据文件的路径(无
version标记)会先跑分段检测再叠加属性,因此仍会接触活环境;只有录制文件是确定性、零外部接触的重放。 - 只有
oh-my-posh print和oh-my-posh config export image支持--data。 - 渲染时读取活运行时状态的模板逻辑无法通过数据文件复现。
- 同类型多分段必须靠
alias区分,否则无法分别喂数据。
【免费下载链接】oh-my-poshThe most customisable and low-latency cross platform/shell prompt renderer项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-posh
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考