我的bash提示符有一个特定的方法,假设如下所示:

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

PS1="\$(${my_function}) \$ "

为了解释以上内容,我通过执行一个存储在字符串中的函数来构建bash提示符,这是this question的结果。让我们假装它工作正常,因为它工作正常,除非涉及到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"

这是我将提示设置为函数字符串的主要原因。这个转义序列不会干扰行的长度,它只是unicode字符。

最佳答案

\[...\]序列表示完全忽略字符串的这一部分,这在提示包含零长度序列(例如更改文本颜色或标题栏的控制序列)时非常有用。但是在这种情况下,你要打印一个字符,所以它的长度不是零。也许你可以通过,比如说,使用一个无操作转义序列来愚弄Bash来计算正确的行长度来解决这个问题,但这听起来像是疯了。
正确的解决方案是让Bash中的行长度计算正确地grok UTF-8(或使用的Unicode编码)。嗯,你试过没有\[...\]序列吗?
编辑:下面实现了我在下面的评论中提出的解决方案。保存光标位置,然后在\[...\]之外打印两个空格,然后恢复光标位置,并在这两个空格的顶部打印Unicode字符。这假定固定的字体宽度,Unicode字符的宽度为双倍。

PS1='\['"`tput sc`"'\]  \['"`tput rc`"'༇ \] \$ '

至少在OSX终端Bash 3.2.17(1)版本中,这通过了粗略的测试。
出于透明性和易读性的考虑,我忽略了在函数中使用提示功能和颜色编码的要求;这只是将提示更改为字符、空格、美元提示、空格。适应你更复杂的需求。

09-04 21:21
查看更多