Я использую iTerm2 на Маверикс. $TERM имеет значение xterm-256color . Когда я печатаю это в командной строке:

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

консоль подает звуковой сигнал об ошибке, и вывод:

xxx "  xxx

в правильном цвете. Любые идеи о том, что мне не хватает?

1 ответ1

2

Вероятной причиной такого поведения является то, что в вашем ~/.zshrc есть некоторые настройки, которые обновляют заголовок терминала, чтобы он содержал текущую командную строку без кавычек специальных символов, таких как \e .

Скорее всего, строка, которая фактически обновляет заголовок, выглядит примерно так:

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

Вместо \e]2; это также может быть \e]0; и вместо print -n это может быть echo -en .

Важной частью является то, что это та же команда, которая используется для печати на терминал, но что-нибудь между \e]2; и \a (символ "колокольчик") перейдет к заголовку терминала, а не будет напечатан в терминале.

Это только в том случае, если $commandline содержит специальные символы, такие как \a или \e В этих случаях часть или весь вывод может быть напечатан на терминале вместо заголовка.

В вашем случае первый \e в echo прерывает настройку заголовка терминала и все, что после этого отправляется на терминал. То есть первая часть вашего вывода - 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 - в $commandline .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .