ansii颜色的回声使我的文本加倍(zsh,mac)


0

我在小牛队使用iTerm2。$TERM设置为xterm-256color。当我在命令行中打印时:

echo -e "\e[0;36m xxx \e[0m"

控制台出错时发出蜂鸣声,输出为:

xxx "  xxx

颜色正确。关于我缺少什么的任何想法?

Answers:


2

这种行为的一个可能原因是你有一些设置~/.zshrc更新终端标题以包含当前运行的命令行而不引用特殊字符,如\e

最有可能实际更新标题的行看起来像这样:

print -n -- "\e]2; $commandline \a"

而不是\e]2;它也可能\e]0;而不是print -necho -en

重要的是,这是用于打印到终端的相同命令,但是\e]2;\a(“铃”字符)之间的任何内容都将转到终端标题,而不是打印到终端。

这是除非$commandline包含一些特殊字符,如\a\e。在这些情况下,可以将部分或全部输出打印到终端而不是标题。

在你的情况下,第一\eecho中断后,终端标题和寄托都的设置进入到终端。也就是说,输出的第一部分xxx "- 来自终端标题的失败设置,第二部分xxx- 是实际的输出echo


要防止出现这种情况,您需要正确引用要作为标题发送到终端的任何内容。

~/.zshrc在清理命令行后设置了终端标题:

settermtitle () {
    # save the first argument in commandline if given, else use empty string
    local commandline="${1:-}"
    # remove special whitespaces (newline, tab, vertical tab, etc)
    commandline=$(print -nr -- "$cl" | tr "\n\t\v\f\r" " ")
    # quote print specials
    commandline=${(V)commandline}
    # quote backslashes
    commandline=${commandline//\\/\\\\}

    print -n -- "\e]2; iTerm2 - $commandline\a"
}

preexec_title () {
    settermtitle "$1"
}

add-zsh-hook preexec preexec_title

首先,我用空格字符替换任何空格。然后我可以看到不可打印的字符。最后,我引用任何反弹,以避免转义字符的任何问题 - 比如\e- in $commandline


太棒了,谢谢你!我所在的问题是将终端标题设置为当前命令,如:printf "\e]1; $PWD:t:$(history $HISTCMD | cut -b7- ) \a"in (post/pre)execfunction。
Igor Spasic 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.