如何正确逃生bash提示符Unicode字符

问题描述 投票:7回答:3

我有我的bash提示符的具体方法,比方说,它看起来像这样:

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

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

为说明上述情况,我通过执行存储在一个字符串,这是因为this question的结果作出决定功能builidng我的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字符。

bash unicode prompt
3个回答
3
投票

\[...\]序列说完全忽略字符串的这一部分,当你的提示包含零长度序列,比如哪些改变文字颜色或标题栏中显示的控制序列是有用的,说。但是,在这种情况下,要打印字符,因此它的长度不为零。也许你可以解决这个,比方说,使用无操作转义序列愚弄猛砸到计算正确的线路长度,但它听起来像这样疯狂的谎言。

正确的解决方案将是在击行长度计算正确神交UTF-8(或任何Unicode编码它是您正在使用)。嗯,你试过没有\[...\]序列?

编辑:下面我实现了在下面的意见提出解决方案。光标位置将被保存,则两个空间被印刷,\[...\]之外,则光标位置被恢复,和Unicode字符印刷在两个空间的顶部。这是假定一固定宽度的字体,与用于Unicode字符双倍宽度。

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

至少在OSX终端,击3.2.17(1) - 释放,这通过粗略[原文如此]测试。

在透明度和可读性的利益,我都忽略了有一个函数内部提示的功能,以及彩色编码的要求;这只是改变了提示字符,空间,美元的提示,空间。配合您的较为复杂的需求。


2
投票

@tripleee赢得它,在这里张贴最终的解决方案,因为这是一个痛苦的意见,邮编:

CHAR="༇"
my_function="
    prompt=\" \\[`tput sc`\\]  \\[`tput rc`\\]\\[\$CHAR\\] \"
    echo -e \$prompt"

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

在@ tripleee的链接指出,关键是使用命令tput sctput rc其保存并恢复光标位置。该代码是有效的节约光标位置,打印两个空格宽度,间隔之前的光标位置恢复到,然后打印特殊字符,以使线的宽度是从两个空间,而不是字符。


0
投票

(不回答你的问题,但一些指针和有关您的问题的一般经验。)

我看你描述关于CMD行编辑(按Ctrl-R,......按Ctrl-A按Ctrl-E ...)的所有时间的行为,即使没有unicode字符。

在一个工作现场,我花的时间找出TERM设置VS由操作系统(当然,stty的我想)使用的术语定义的终端解释之间的差异。

现在,当我有这个问题,我逃了我目前的尝试编辑该行,再次带来向上行,然后马上去“VI”模式,这会打开vi编辑器。 (新闻只是 'V' 字符,对吧?)。所有的易用性VI一个完整的会话的;为什么用更少的;-)去?

你的问题的描述又看,当你说

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

这只是一个字符串的定义,对不对?和我假设你的假设,这是你的my_function的输出简化问题的定义。这似乎在创建函数定义,调用函数并使用返回值的步骤,很可能是壳报价不工作,你希望它的方式很多机会。

如果您编辑您的问题包括my_function定义,其完整的使用(减少你的函数是什么原因造成的问题),也可能是其他人更容易帮助这一点。最后,你经常使用set -vx?它可以帮助显示如何/ wnen /变量展开的东西,你可以在那里找到的东西。

失败所有这些,看看Orielly termcap & terminfo。您可能需要看看手册页为您的本地系统stty及相关CMDS,你可能做的很好,寻找用户群特定于您的Linux系统(我假设你使用Linux的变种)。

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.