Tasto Home che si comporta in modo strano in bash (tty e X) su stringhe di input lunghe


11

Quando premo Homese il mio input attuale è abbastanza breve (diciamo, <36 caratteri), funziona benissimo. Tuttavia, quando ho digitato un comando più lungo e poi voglio tornare all'inizio, sembra che faccia il suo lavoro, ma il comando non viene più visualizzato correttamente. Sembra che non sia all'inizio ma a circa 10 caratteri di distanza. Anche se digito "alla cieca", funziona bene, ma sembra un disastro totale, come se l'intero input fosse spostato a destra, ma non ridisegnato. Quindi lo scrivo, ma "in effetti" no, perché il posto che sto "cancellando" è "in realtà" 10 caratteri a destra. Di conseguenza, se provo a cancellare il comando, i primi 10 caratteri vengono comunque visualizzati, ma se Enterlo premo visualizza solo un altro prompt come se l'input precedente fosse vuoto.

So che non è la migliore spiegazione di sempre, ma il punto è che bash la riconosce e cerca di fare la cosa giusta, ma spesso fallisce.

Lo riproduco sia in tty che in un terminale in una sessione X. Quando premo Ctrl+ Ve poi Homevedo diverse sequenze ( ^[OHin X, ^[[1~in tty), ma entrambe sembrano essere nel mio /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 linuxin tty e xtermin X session.

Suo

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

Qualcuno ha indizi su questo?


1
Quanto dura la tua richiesta? Digitare una riga di comando lunga circa 36 caratteri riempie una riga del terminale e quindi provoca lo scorrimento laterale? Succede ancora se si utilizza questo prompt? PS1='$ '
Mikel,

@Mikel Non so cosa hai in mente, ma probabilmente sei vicino alla strada giusta. Non sembra succedere quando uso il prompt minimalista. Quello che ho usato è stato un po 'modificato rispetto a quello di default: PS1="\e[0;36m[\u@\h \W]\$ \e[m". C'è qualcosa di sbagliato in questo? Digitare 36 caratteri non riempie una riga (di gran lunga). Inoltre, non ho lo scrolling laterale in tty :)
Lev Levitsky

@Mikel Ho seguito il consiglio di jw013 e modificato il prompt, che sembra risolverlo. Forse potresti approfondire quale fosse il problema in modo da poterti ricompensare con un rappresentante come quello per capirlo prima :)
Lev Levitsky

Risposte:


13

Devi circondare le parti non stampabili del tuo prompt (incluso ma non limitato a sfuggire alle sequenze per cambiare i colori) con \[e \].

Il prompt originale: \e[0;36m[\u@\h \W]\$ \e[m
prompt fisso:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]

Il \[e \]dire bashche tutto ciò che sta nel mezzo non viene effettivamente stampato sullo schermo, cioè ha lunghezza zero. La lunghezza del prompt calcolata è necessaria per sapere dove inserire i caratteri digitati. L'esclusione \[ \]provoca il bashcalcolo di una lunghezza del prompt errata, che spesso porta a strani comportamenti terminali dipendenti dalla geometria a causa bashdell'idea di dove il cursore non combacia con la realtà.


Grazie, questo risolve il problema. Gradirei qualche spiegazione, però: qual è stata la ragione di quel comportamento, cosa fanno le parentesi quadre, ecc. Sarebbe bello avere tutto su una pagina e potrebbe aiutare qualcun altro in futuro.
Lev Levitsky,

@LevLevitsky Ho aggiunto una breve spiegazione alla risposta.
jw013

Grazie mille! Questo ha più senso per me ora.
Lev Levitsky,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.