如何正确地在bash提示符中转义unicode字符

And*_*Ray 7 unicode bash prompt

我有一个特定的方法用于我的bash提示,让我们说它看起来像这样:

CHAR="? "
my_function="
    prompt=\" \[\$CHAR\]\"
    echo -e \$prompt"

PS1="\$(${my_function}) \$ "
Run Code Online (Sandbox Code Playgroud)

为了解释上面的内容,我通过执行存储在字符串中的函数来构建我的bash提示符,这是由于这个问题而做出的决定.让我们假装它工作正常,因为它确实如此,除非涉及到unicode字符

我试图找到逃脱unicode角色的正确方法,因为现在它与bash线长度混淆.测试它是否被破坏的简单方法是键入一个长命令,执行它,按CTRL-R并键入以找到它,然后按CTRL-A CTRL-E跳转到该行的开头/结尾.如果文本出现乱码,那么它就无法正常工作.

我已经尝试了几个方法来正确地转义函数字符串中的unicode字符,但似乎没有任何工作.

像这样的特殊人物:

COLOR_BLUE=$(tput sgr0 && tput setaf 6)

my_function="
    prompt="\\[\$COLOR_BLUE\\] \"
    echo -e \$prompt"
Run Code Online (Sandbox Code Playgroud)

这是我提示函数字符串的主要原因.那个转义序列不会弄乱行长度,它只是unicode字符.

tri*_*eee 5

\\[...\\]序列表示完全忽略字符串的这一部分,当提示包含零长度序列(例如更改文本颜色或标题栏的控制序列)时,这很有用。但在本例中,您正在打印一个字符,因此它的长度不为零。也许你可以通过使用无操作转义序列来欺骗 Bash 来计算正确的行长度来解决这个问题,但听起来这种方式很疯狂。

\n\n

正确的解决方案是 Bash 中的行长度计算正确地使用 UTF-8(或您正在使用的任何 Unicode 编码)。嗯,你试过没有\\[...\\]顺序吗?

\n\n

编辑:以下实现了我在下面的评论中提出的解决方案。保存光标位置,然后打印两个空格,在 之外\\[...\\],然后恢复光标位置,并在两个空格的顶部打印 Unicode 字符。这假定字体宽度固定,Unicode 字符具有双倍宽度。

\n\n
PS1=\'\\[\'"`tput sc`"\'\\]  \\[\'"`tput rc`"\'\xe0\xbc\x87 \\] \\$ \'\n
Run Code Online (Sandbox Code Playgroud)\n\n

至少在 OSX 终端、Bash 3.2.17(1) 版本中,这通过了粗略的[原文如此]测试。

\n\n

为了透明度和易读性,我忽略了在函数内具有提示功能的要求以及颜色编码;这只是将提示更改为字符、空格、美元提示、空格。适应您更复杂的需求。

\n