Echo com cores ansii dobra meu texto (zsh, mac)

0

Estou usando o iTerm2 no Mavericks. $TERM está definido como xterm-256color . Quando eu imprimir isso na linha de comando:

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

o console emite um erro e a saída é:

xxx "  xxx

na cor correta. Alguma idéia do que estou perdendo?

    
por Igor Spasic 19.08.2014 / 11:43

1 resposta

2

Uma razão provável para esse comportamento é que você tem algumas configurações em ~/.zshrc que atualizam o título do terminal para conter a linha de comando atualmente em execução sem citar caracteres especiais, como \e .

O mais provável é que a linha que realmente atualiza o título seja algo assim:

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

Em vez de \e]2; , também pode ser \e]0; e, em vez de print -n , pode ser echo -en .

A parte importante é que este é o mesmo comando usado para imprimir no terminal, mas qualquer coisa entre \e]2; e \a (o caractere "bell") irá para o título do terminal em vez de ser impresso em o terminal.

Ou seja, a menos que $commandline contenha alguns caracteres especiais, como \a ou \e . Nesses casos, uma parte ou toda a saída pode ser impressa no terminal em vez do título.

No seu caso, o primeiro \e no echo interrompe a configuração do título do terminal e depois disso vai para o terminal. Ou seja, a primeira parte de sua saída - xxx " - vem de uma configuração com falha do título do terminal e a segunda parte - xxx - é a saída real de echo .

Para evitar esse comportamento, você precisa citar corretamente o que deseja enviar para o terminal como título.

No meu ~/.zshrc eu tenho algo assim para definir o título do terminal depois de limpar a linha de comando:

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

Primeiro eu substituo qualquer espaço em branco por caracteres de espaço. Então faço com que caracteres não imprimíveis sejam visíveis. E, por último, cito todos os retrocessos restantes para evitar problemas com caracteres de escape - como \e - em $commandline .

    
por 20.08.2014 / 16:45