Quando acerto Homese minha entrada atual é curta o suficiente (digamos, <36 caracteres), ela funciona bem. No entanto, quando eu digitei um comando mais longo e depois quero voltar ao início, parece que ele faz o seu trabalho, mas o comando não é mais exibido corretamente. Parece que não estou no começo, mas com cerca de 10 caracteres. Embora se eu digitar "às cegas", funcione bem, mas parece uma bagunça total, como se toda a entrada fosse deslocada para a direita, mas não redesenhada. Então eu digito sobre ele, mas "de fato" não, porque o lugar que estou "apagando" é "na verdade" 10 caracteres à direita. Portanto, se eu tentar apagar o comando, os 10 primeiros caracteres ainda serão exibidos, mas se eu o pressionar, Enterserá exibido outro prompt como se a entrada anterior estivesse vazia.
Eu sei que não é a melhor explicação de todos os tempos, mas o ponto é que o bash reconhece e tenta fazer a coisa certa, mas geralmente falha.
Eu reproduzo isso em tty e em um terminal em uma sessão X. Quando clico em Ctrl+ Ve Homevejo sequências diferentes ( ^[OH
em X, ^[[1~
em tty), mas ambas parecem estar na minha /etc/inputrc
:
# do not bell on tab-completion
#set bell-style none
set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
$if mode=emacs
# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[7~": beginning-of-line
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e\e[C": forward-word
"\e\e[D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word
# for rxvt
"\e[8~": end-of-line
# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"\eOH": beginning-of-line
"\eOF": end-of-line
# for freebsd console
"\e[H": beginning-of-line
"\e[F": end-of-line
$endif
echo $TERM
mostra linux
em tty e xterm
em X sessão.
Está
Lançamento do GNU bash, versão 4.2.24 (2) (i686-pc-linux-gnu)
Alguém tem pistas sobre isso?
fonte
PS1='$ '
PS1="\e[0;36m[\u@\h \W]\$ \e[m"
. Existe algo de errado nisso? Digitar 36 caracteres não preenche uma linha (de longe). Além disso, eu não tenho do lado de rolagem no tty :)Respostas:
Você precisa cercar as partes não imprimíveis do seu prompt (incluindo, entre outras, as seqüências de escape para mudar as cores) com
\[
e\]
.Seu prompt original:
\e[0;36m[\u@\h \W]\$ \e[m
prompt fixo:
\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]
O
\[
e\]
digabash
que tudo o que está no meio não é impresso na tela, ou seja, tem comprimento zero. O comprimento calculado do prompt é necessário para saber onde ecoar os caracteres digitados. Deixar de fora\[ \]
causasbash
para calcular um comprimento incorreto de prompt, o que geralmente leva a um comportamento terminal dependente da geometria, devido àbash
idéia de onde o cursor não está correspondendo à realidade.fonte