Tecla home agindo de forma estranha no bash (tty e X) em strings de entrada longas

10

Quando eu teco Home se a minha entrada atual é curta o suficiente (digamos, < 36 caracteres), ela funciona bem. No entanto, quando eu digito 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 . Parece que eu não estou no começo, mas tenho 10 caracteres. Embora se eu digitar "cegamente", funciona 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 isso, mas "na verdade" não, porque o lugar que estou "apagando" é "na verdade" 10 caracteres à direita. Assim, se eu tentar apagar o comando, os 10 primeiros caracteres ainda serão exibidos, mas se eu pressionar Enter , ele exibe outro prompt como se a entrada anterior estivesse vazia.

Eu sei que não é a melhor explicação, mas o ponto é que o bash reconhece e tenta fazer a coisa certa, mas muitas vezes falha.

Eu reproduzo isso tanto em tty quanto em um terminal em uma sessão X. Quando pressiono Ctrl + V e depois Início vejo sequências diferentes ( ^[OH em X, ^[[1~ em tty), mas ambas parece estar no meu /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 na sessão X.

GNU bash, version 4.2.24(2)-release (i686-pc-linux-gnu)

Alguém tem pistas sobre isso?

    
por Lev Levitsky 30.03.2012 / 11:29

1 resposta

12

Você precisa cercar as partes não impressas do seu prompt (incluindo, mas não se limitando a seqüências de escape para alterar cores) com \[ e \] .

Seu prompt original: \e[0;36m[\u@\h \W]\$ \e[m
Alerta fixo: \[\e[0;36m\][\u@\h \W]\$ \[\e[m\]

O \[ e \] informam bash que tudo o que está no meio não é realmente impresso na tela, ou seja, tem comprimento zero. O comprimento de prompt calculado é necessário para saber onde ecoar caracteres digitados. Deixar de fora \[ \] faz com que bash calcule um tamanho de prompt incorreto, o que geralmente leva a um comportamento estranho dependente da geometria terminal devido à ideia de bash de onde o cursor não está correspondendo à realidade.

    
por 30.03.2012 / 19:28