Aqui está como eu configurei essa coisa agora. Essa abordagem não requer nenhuma manipulação de seqüência de escape, mas fará com que você tenha duas variáveis diferentes para o prompt principal: PS1
com coloração e NPS1
sem.
# Here NPS1 stands for "naked PS1" and isn't a built-in shell variable. I've
# defined it myself for PS1-PS2 alignment to operate properly.
PS1='%S%F{red}[%l]%f%s %F{green}%n@%m%f %B%#%b '
NPS1='[%l] %n@%m # '
RPS1='%B%F{green}(%~)%f%b'
# Hook function which gets executed right before shell prints prompt.
function precmd() {
local expandedPrompt="$(print -P "$NPS1")"
local promptLength="${#expandedPrompt}"
PS2="> "
PS2="$(printf "%${promptLength}s" "$PS2")"
}
Observe o uso de print -P
para a expansão de prompt, ${#variable}
para obter o comprimento da string armazenada na variável e printf "%Nd"
para o preenchimento da esquerda com N
espaços. Os comandos print
e printf
são comandos internos, portanto, não deve haver nenhum impacto no desempenho.