zsh 在执行搜索和补全时插入额外的空格

Mat*_*ine 5 shell zsh prompt command-prompt ansi-escape

我编写了一个小程序,它会发出带有一些 Git 信息的命令行提示符。我使用 ANSI 转义序列给它着色,它看起来像这样:

\n\n

提示示例

\n\n

但是,每当我执行制表符补全或搜索时,zsh 都会在提示后插入几个空格:

\n\n

间距错误

\n\n

它似乎为提示符发出的每个转义代码字符插入一个空格,因为删除颜色代码可以消除这种行为。zsh 为什么要这样做,我该如何阻止它?

\n\n

本例中我的提示程序发出的实际字符序列是(假设\\e代表字符 033)

\n\n
~/s/promptd [\\e[36mmaster \\e[33m\xc2\xb1\\e[31m?\\e[39m]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的相关部分.zshrc是:

\n\n
setopt PROMPT_SUBST\nsetopt PROMPT_PERCENT\nPROMPT=\'%B$(promptd) %%%b \'\n
Run Code Online (Sandbox Code Playgroud)\n

Mat*_*ine 4

在做了一些额外的研究之后,ZSH Prompt Expansion 文档表明转义文字需要包含在%{...%}.

这很麻烦,因为现在如果我希望提示程序在其他 shell 中工作,我必须有条件地输出这些内容,但它似乎纠正了上面显示的行为。