带有零宽度控制字符的 Bash 提示符

带有零宽度控制字符的 Bash 提示符

为了防止提示符围绕从右到左的文本扭曲,我想在 bash 提示符中插入一个零宽度 LRM(U200e)。由于这是一个零宽度字符,我的直觉是用 来换行\[<200e>\]。结果,这实际上导致 bash 在错误的地方换行。当我不使用它时,然后它看起来运行良好。

我不明白。即使 bash 自动检测到此字符为零宽度,用 包裹\[...\]它也不会造成任何损害。

编辑:所以问题是:什么时候\[...\]真正需要转义,以及如果转义的字符实际上是零宽度,它怎么可能有害。

答案1

查看帖子 在 Bash 中转义零长度字符. 尤其是 迈克尔·艾伦的回答 我将其复述如下:

\[一些实用程序(包括 PS1)使用这些序列来表示\001\002控制代码:

\[=>\x01\001

\]=>\x02\002

printf 和 echo 不执行从\[到 的转换\001

所以解决方案是自己进行转换。而不是将零长度字符包装在\[

echo "\[\033[1;30m\]foo\[\033[0m\]"

这将输出\[foo\]

我输出的是实际的控制代码:

echo "\x01\033[1;30m\x02foo\x01\033[0m\x02"

foo在 PS1 printf 和 echo 上均输出。

有关具体示例,请参阅git-radar 上的这个提交。

相关内容