2011-08-18 81 views
4

我有一个具体方法为我的bash提示符,比方说,它看起来像这样:如何逃脱bash的Unicode字符提示正确

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

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

为说明上述情况,我通过执行builidng我的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字符。

回答

1

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

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

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

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

至少在OSX终端中,Bash 3.2.17(1) - 释放,这通过了粗略的[sic]测试。

在透明度和可读性的利益,我都忽略了要求有一个函数里面的提示的功能,颜色编码;这只是改变提示字符,空格,美元提示,空格。适应你的复杂需求。

+0

我试过没有\\ [\\],我得到了同样的乱码结果。但是,如果我用x这样的正常字符替换,我看不到问题(再次,不使用转义序列)。我也试过△作为一个不同的角色,但同样的事情 –

+0

也许你可以换一对诅咒命令的问题的顺序,像'tput的sc',打印两个空格,'tput的rc',打印您的Unicode字符。这两个空格(或其他具有正确宽度的序列)必须位于'\ [... \]'之外,其余部分都在其中。另请参阅http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html – tripleee

+0

您赢了这个窍门,发布了完整的解决方案作为评论 –

1

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

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

在一个工作现场,我花时间了解终端对TERM设置和操作系统使用的TERM定义的解释(以及stty我想)。

现在,当我遇到这个问题时,我逃离了当前编辑该行的尝试,再次将该行取出来,然后立即进入打开vi编辑器的'vi'模式。 (只需按'v'字符,对吗?)。所有易于使用vi的全面会议;为什么要少用;-)?

你的问题的描述再次寻找,当你说

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

这只是一个字符串的定义,对不对?我假设您通过假设这是您的my_function的输出来简化问题定义。看起来很有可能在创建函数定义的步骤中,使用返回的值调用函数AND有很多机会使shell引用无法按照您希望的方式工作。

如果您编辑您的问题以包括my_function定义及其完整使用(将您的功能降低到导致问题的原因),但其他人也可能更容易帮助解决此问题。最后,你是否经常使用set -vx?它可以帮助显示变量扩展的/如何/什么,你可能在那里找到某些东西。

所有这些失败,请看Orielly termcap & terminfo。您可能需要查看本地系统stty和相关cmds的手册页,并且您可能会很好地查找特定于您的Linux系统的用户组(我假设您使用的是Linux变体)。

我希望这会有所帮助。

+0

什么世界确实的stty(1)有什么关系在这里做什么? – tchrist

1

@tripleee赢得它,在这里张贴最终的解决方案,因为它是一个婊子在评论邮编:

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

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

诀窍在tripleee的链接指出的是使用命令tput sctput rc其中保存的然后恢复光标位置。该代码有效地保存了光标位置,为宽度打印两个空格,将光标位置恢复到空格之前,然后打印特殊字符以使行的宽度来自两个空格,而不是字符。

+0

但是嵌套变量是什么?给'prompt'赋值只是为了'echo'并丢弃它似乎特别浪费。 – tripleee

+0

我从一个更大的函数中提供了一个片段来显示用例。整个事情(现在的工作,感谢你)是我的文件底部的大串:混帐,SVN和格式化精美的提示信息汞柱:https://github.com/DelvarWorld/configs/blob/master/的.bashrc –