Tecla Home agindo de forma estranha no bash (tty e X) em seqüências de entrada longas

11

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 ( ^[OHem 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 $TERMmostra linuxem tty e xtermem 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?

Lev Levitsky
fonte
1
Quanto tempo é o seu prompt? Digitar uma linha de comando com cerca de 36 caracteres preenche uma linha do seu terminal e, portanto, causa rolagem lateral? Ainda acontece se você usar esse prompt? PS1='$ '
Mikel
@ Mikel Não sei o que você tem em mente, mas provavelmente você está perto do caminho certo. Parece não acontecer quando uso o prompt minimalista. O que eu usei foi um pouco modificada em comparação com o padrão: 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 :)
Lev Levitsky
@ Mikel Segui o conselho de jw013 e ajustei o prompt, que parece resolvê-lo. Talvez você poderia elaborar sobre qual era o problema para que eu pudesse recompensá-lo com algum representante como o único a descobrir isso primeiro :)
Lev Levitsky

Respostas:

13

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 \]diga bashque 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 \[ \]causas bashpara calcular um comprimento incorreto de prompt, o que geralmente leva a um comportamento terminal dependente da geometria, devido à bashidéia de onde o cursor não está correspondendo à realidade.

jw013
fonte
Obrigado, isso resolve o problema. Eu apreciaria alguma explicação: qual era a razão desse comportamento, o que os colchetes fazem etc. Seria bom ter tudo em uma página e ajudar outra pessoa no futuro.
Lev Levitsky 31/03
@LevLevitsky Adicionei uma breve explicação à resposta.
jw013
Ótimo, obrigado! Isso faz mais sentido para mim agora.
Lev Levitsky 31/03