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

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

Quando acerto Homese minha entrada atual for curta o suficiente (digamos, <36 caracteres), ela funciona bem. No entanto, quando digito um comando mais longo e quero voltar ao início, parece que ele faz o seu trabalho, mas o comando não éexibidocerto mais. Parece que não estou no começo, mas com cerca de 10 caracteres de diferença. Embora se eu digitar "às cegas", 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 ele, mas "de fato" não, porque o lugar que estou "apagando" é "na verdade" 10 caracteres à direita. Da mesma forma, se eu tentar apagar o comando, os primeiros 10 caracteres ainda serão exibidos, mas se eu acertar, Enterapenas exibirá outro prompt como se a entrada anterior estivesse vazia.

Eu sei que não é a melhor explicação de todas, mas a questão é que o bash a reconhece e tenta fazer a coisa certa, mas muitas vezes 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 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 $TERMmostra linuxem tty e xtermna sessão X.

Isso é

GNU bash, versão 4.2.24(2)-release (i686-pc-linux-gnu)

Alguém tem pistas sobre isso?

Responder1

Você precisa cercar as partes não imprimíveis do seu prompt (incluindo, entre outras, sequências de escape para alteração de cores) com \[e \].

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

O \[e \]informa 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 \[ \]causa basho cálculo de um comprimento de prompt incorreto, o que geralmente leva a um comportamento estranho dependente da geometria do terminal devido à bashideia de onde o cursor não está correspondendo à realidade.

informação relacionada