Ctrl-Backspace e Ctrl-Canc in bash


14

Mettere su Debian 8.3

stty werase '^H'

o su Arch Linux 2/2016

stty werase '^?'

in .bashrc(ad esempio) make Ctrl- Backspaceelimina l'ultima parola nel terminale. Ancora non è lo stesso comportamento in applicazioni GUI moderne (ad esempio Firefox): Cancella l'ultima spazi di parola -separated, e non l'ultima parola separata da spazi bianchi o caratteri come . : , ; " ' & / ( ).

È possibile fare Ctrl- Backspacecomportarsi nel terminale in modo simile alle moderne applicazioni della GUI? Inoltre, c'è un modo per fare Ctrl- Deleteeliminare la parola immediatamente prima del cursore?


1
La shell potrebbe supportare quelle azioni, che potrebbero essere associate a una determinata chiave.
Thomas Dickey,

@ThomasDickey: sto usando bash. Va bene se funziona solo in bash.
wolf-revo-cats,

Risposte:


27

Qui ci sono due editor di linee: l'editor di linee di base fornito dal kernel (editor di tty line in modalità canonica) e l'editor di linee di bash (implementato tramite la libreria readline). Entrambi hanno un comando di cancellazione alla parola precedente che è associato a Ctrl+ Wper impostazione predefinita. La chiave può essere configurata per l'editor tty line in modalità canonica tramite stty werase; bash imita l'associazione chiave che trova nell'impostazione tty a meno che non venga sovrascritta nella propria configurazione.

L' weraseazione nell'editor tty line non può essere configurata. Cancella sempre (ASCII) parole delimitate da spazi bianchi. È raro interagire con l'editor di tty line - è ciò che ottieni, ad esempio quando digiti catsenza alcun argomento. Se vuoi combinazioni di tasti fantasiose lì, puoi eseguire il comando sotto uno strumento come rlwrap che utilizza readline.

Bash fornisce due comandi per eliminare la parola precedente : unix-word-rubout( Ctrl+ wo come impostato su stty werase) e backward-kill-word( M-DEL, cioè Esc Backspace) che tratta una parola come una sequenza di caratteri alfanumerici nelle_ impostazioni internazionali correnti e . Se vuoi Ctrl+ Backspaceper cancellare la sequenza precedente di caratteri alfanumerici, non impostare stty werasee inserisci invece la seguente riga nel tuo .inputrc:

"\C-h": backward-kill-word

Si noti che ciò presuppone che il terminale invii il carattere Ctrl + H per Ctrl+ Backspace. Purtroppo è una di quelle chiavi senza associazione standard (e Backspacein particolare è un casino per ragioni storiche).

C'è anche un comando simmetrico kill-wordche è associato a M-d( Alt+ D) per impostazione predefinita. Per associarlo a Ctrl+ Delete, devi prima capire quale sequenza di escape invia il tuo terminale, quindi aggiungere una linea corrispondente nella tua .inputrc. Digita Ctrl+ Vquindi Ctrl+ Delete; questo inserirà qualcosa come ^[[3;5~dove l'iniziale ^[è una rappresentazione visiva del carattere di escape. Quindi il legame è

"\e[3;5~": kill-word

Se non sei soddisfatto dell'una o dell'altra definizione di una parola, puoi fornire la tua in bash: vedi il comportamento confuso delle combinazioni di tasti in stile emacs in bash


2
ottima spiegazione! Il Ctrl+Delfunzionato bene. Tuttavia, non riesco a mettermi Ctrl+Backspaceal lavoro. Per il Ctrl+v, Ctrl+Backspacemio terminale dice ^?. Cosa dovrei inserire .inputrc? Grazie
Ciprian Tomoiagă

3
@CiprianTomoiaga "\C-?": backward-kill-wordo qualunque altra funzione readline desideri. Ma puoi definire un'associazione per Ctrl + Backspace diversa dall'associazione per Backspace se inviano caratteri diversi. Se il tuo terminale invia ^?sia Backspace sia Ctrl + Backspace, l'applicazione in esecuzione nel terminale non ha modo di distinguerli. Alcuni terminali possono essere configurati (ad es. Xterm, urxvt), altri (ad es. Emulatori di terminali basati su VTE) no.
Gilles 'SO- smetti di essere malvagio' il

4
è importante notare che la definizione ~/.inputrcdisabilita l'impostazione predefinita /etc/inputrc. per risolvere questo problema devi includere quel file: $include /etc/inputrc(da qui )
Ciprian Tomoiagă

+1 per Esc + Backspace
Celal Ergün

6

Provare

alt+backspace

Nel sistema operativo elementare funziona come desideri (proprio come ctrl+ backspace)


1

Il comportamento del carattere WERASE nell'elaborazione del terminale in modalità Cotto è hardcoded , almeno in Linux:

           if (kill_type == WERASE) {
                   /* Equivalent to BSD's ALTWERASE. */
                   if (isalnum(c) || c == '_')
                           seen_alnums++;
                   else if (seen_alnums)
                           break;
           }

Quindi le parole sono lettere, cifre e trattino basso. Questo è il modo in cui sarà sempre in un terminale su Linux quando non è in esecuzione un'applicazione che esegue la propria elaborazione in modalità cotto.

La versione di readline (usata da bash e altri) sembra essere leggermente diversa dalla versione del kernel, ma sembra anche essere codificata :

Le parole sono composte da lettere e cifre.

Ma questo non sembra corrispondere a ciò che basheffettivamente fa per me: foo+bar^Wcancella tutto, non solo bar. Ci sono maggiori informazioni al riguardo qui .


1. L'utente vi sta probabilmente cercando backward-kill-word(associazione predefinita M-DEL) invece di unix-word-rubout.
Gilles 'SO- smetti di essere malvagio' il
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.