Alt-Left per saltare le parole non funziona negli emulatori di terminale


16

Su una macchina Debian Wheezy al lavoro precedente, mi ero abituato a Alt + Sinistra e Alt + Destra per saltare tra le parole sulla riga di comando attiva (in bash).

Tuttavia, dato che a casa ho eseguito l'aggiornamento a Jessie (Debian 8.0, ramo di testing) questo non funziona più: invece di saltare alla parola precedente, Alt-Left stampa qualcosa come Do [D. OTOH, se apro ssh e mi collego al mio Debian Wheezy senza testa, funziona perfettamente.

Inoltre, ho appena installato Fedora 20 nel mio nuovo lavoro e qui il comportamento è lo stesso. Questo vale per bash, csh e ksh (iniziato sotto env -i), così come rxvt-unicode e xfce4-terminal, quindi deve essere qualcosa al di fuori di questi livelli.

Dove altro nella pila dovrei cercare per trovare la differenza?


4
Suggerirei di provare alt-b e alt-f (così come il resto dei tasti readline), poiché sono più universali e un certo numero di programmi a riga di comando onora i binding readline.
esiliati il

Risposte:


21

Probabilmente hai definito un file locale ~/.inputrco globale /etc/inputrcche è stato perso durante l'aggiornamento. Una soluzione semplice è quella di creare un ~/.inputrcfile con le seguenti righe:

## enable Alt-arrows 
"\e[1;3D": backward-word ### Alt left
"\e[1;3C": forward-word ### Alt right

Funzioneranno con xterme terminatore gnome-terminalpotrebbero aver bisogno di essere modificati per altri terminali. Sfortunatamente, ogni emulatore di terminale può usare una sintassi diversa. Per ulteriori dettagli, vedi la mia risposta qui .


Intendevo davvero Alt, e funziona ancora sulla macchina remota. Ctrl + Sinistra / Destra è già preso in Rxvt per spostare la scheda sinistra e destra (Maiusc + Sinistra / Destra cambiando le schede e Maiusc + Giù aprendo una nuova).
Alois Mahdal,

1
A proposito, mentre Ctrl + Sinistra / Destra è comune negli editor di GUI, i terminali sono un mondo completamente diverso in cui non ho ancora visto quella combinazione.
Alois Mahdal,

10

terdon mi ha impostato nella giusta direzione: file inputrc .

Il colpevole è che quasi in modo non intuitivo, readline6 utilizza effettivamente ~ / .inputrc invece di / etc / inputrc, che readline (3) non enfatizza né confuta:

Il nome di questo file è preso dal valore della variabile d'ambiente INPUTRC. Se quella variabile non è impostata, il valore predefinito è ~ / .inputrc. Se quel file non esiste o non può essere letto, il valore predefinito è / etc / inputrc.

Così, mentre in su entrambe le macchine Debian / etc / inputrc è identico a quello fornito da libreadline6 pacchetto (la versione è lo stesso pure), sulla nuova macchina ~ / .inputrc esiste con sola riga: set bell-style none. Quando questo file viene eliminato, tutto funziona correttamente (vedere le note di seguito).

Non posso controllare Fedora fino a domani ma immagino sia lo stesso problema. Aggiornamento: su Fedora, ~ / .inputrc non esisteva, qui / etc / inputrc è semplicemente diverso, quindi potrebbe non definirlo. Come aggiornamento rapido ho semplicemente salvato l'input di Debian come ~ / .inputrc.


Appunti:

Il mistero di come è stato modificato durante l'aggiornamento di 7> 8 rimane irrisolto, ma in parte può essere spiegato dalla mia cattiva memoria e da alcune giocolette non intenzionali di dotfile. (A proposito non è stato l'aggiornamento di APT ma piuttosto la reinstallazione e il dotfile manuale in movimento, quindi forse ~ .inputrc si è in qualche modo ostacolato.)

Inoltre, quando dico OK, intendo che funziona con Ctrl ovunque tranne Rxvt (OK, ho controllato solo xfce4-terminal ma sappiamo che Rxvt è il solito ribelle), dove questo è rimappato su Alt, apparentemente perché Ctrl è preso da Rxvt -specifica funzionalità: sposta la scheda attiva nell'elenco.

Come menziona la manpage, con bash puoi usare il comando bind integrato per investigare ciò che hai attualmente.


Bella cattura, +1. In realtà, è più intuitivo di quanto pensi. Il comportamento predefinito prevede che i file dot specifici dell'utente abbiano la precedenza sui valori predefiniti a livello di sistema. Altrimenti, gli utenti non sarebbero in grado di cambiare le loro impostazioni.
terdon

Vedi la risposta aggiornata su come abilitare specificamente le frecce Alt +.
terdon

2
Questo è normale, è necessario $include /etc/inputrcnella parte superiore ~/.inputrcse si desidera leggere anche quello.
Chris Down,

@terdon ha perfettamente senso preferire le impostazioni utente prima dell'intero sistema, ma quello che vedrei più intuitivo sarebbe che ~ / .initrc sarebbe "unito" in / etc / initrc (cioè / etc / initrc sarebbe $included per impostazione predefinita).
Alois Mahdal,

1
Vedi: 1. opzioni hardcoded, 2. / etc / initrc, 3. ~ / .initrc --vs-- 1. opzioni hardcoded 2. / etc / initrc OR ~ / .initrc. Il primo modo è molto più flessibile poiché può essere facilmente esteso a un livello inferiore (ad es. Per progetto, bene, ammetto che questo esempio non ha molto senso con readline ma si ottiene il punto).
Alois Mahdal,
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.