我的 bash 提示符有一个特定的方法,假设它看起来像这样:
CHAR="༇ "
my_function="
prompt=\" \[\$CHAR\]\"
echo -e \$prompt"
PS1="\$(${my_function}) \$ "
为了解释上述内容,我通过执行存储在字符串中的函数来构建 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"
这是我将提示设为函数字符串的主要原因。该转义序列不会扰乱行长度,它只是 unicode 字符。
The \[...\]
序列表示完全忽略字符串的这一部分,当提示包含零长度序列(例如更改文本颜色或标题栏的控制序列)时,这很有用。但在本例中,您正在打印一个字符,因此它的长度不为零。也许你可以通过使用无操作转义序列来欺骗 Bash 来计算正确的行长度来解决这个问题,但听起来这种方式很疯狂。
正确的解决方案是 Bash 中的行长度计算正确地使用 UTF-8(或您正在使用的任何 Unicode 编码)。嗯,你试过没有\[...\]
顺序?
Edit:下面实现了我在下面的评论中提出的解决方案。保存光标位置,然后打印两个空格,位于\[...\]
,然后恢复光标位置,并将 Unicode 字符打印在两个空格的顶部。这假定字体宽度固定,Unicode 字符具有双倍宽度。
PS1='\['"`tput sc`"'\] \['"`tput rc`"'༇ \] \$ '
至少在 OSX 终端、Bash 3.2.17(1) 版本中,这通过了粗略的[原文如此]测试。
为了透明度和易读性,我忽略了在函数内具有提示功能的要求以及颜色编码;这只是将提示更改为字符、空格、美元提示、空格。适应您更复杂的需求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)