Você precisa colocar partes invisíveis do texto do prompt em \[
e \]
.
Isso é usado por bash
para calcular o tamanho do prompt completo, para que ele possa determinar onde o cursor será após a impressão.
Por exemplo, os códigos de escape de cor ANSI são invisíveis - eles alteram a cor do texto que será produzido posteriormente. Eles precisam ser colocados assim:
\e[1;35m
torna-se \[\e[1;35m\]
Na sua atualização, você escreve que isso ajudou, mas há outro problema: a tela não é apagada nos locais corretos se você usar o histórico com Up / Abaixo .
Este é apenas outro aspecto do primeiro problema: O cálculo da duração do texto do prompt está errado.
Vamos dar uma olhada no texto do prompt corrigido em seu link:
# login and computer name
PS1='[\e[\[1;37m\]\]\u\e[\[m\]\]@\e[\[1;32m\]\]\h\e[\[m\]\]] '
# date, time
PS1=$PS1'[\e[\[1;34m\]\]\D{%Y-%m-%d} \e[\[1;35m\]\]\t\e[\[m\]\]] '
# working directory and result of last command
PS1=$PS1'\e[\[1;33m\]\]\w\e[\[m\]\] \e[\[1;31m\]\]${?#0}\e[\[m\]\]\n '
# command prompt
PS1=$PS1'\e[\[1;36m\]\]\$\e[\[m\]\] '
O problema é que \[
e \]
não estão incluindo as seqüências de escape de cores inteiras:
O prompt começa com
[\e[\[1;37m\]\]...
A sequência de escape de cores é \e[1;37m
. Portanto, o caractere de escape \e
e o [
estão fora. Pelo menos, o [
será contado como visível. Além disso, há dois fechamento \]
- pode não causar um problema, mas é pelo menos confuso - eles não podem ser aninhados.
A maneira correta de escrever é:
[\[\e[1;37m\]...
As outras seqüências de escape de cores têm o mesmo problema.