Associare back-kill-word a Ctrl + w


23

Sto cercando di passare dall'uso prolungato di Tcsh alla recente esplorazione di Bash.

Sono riuscito a eseguire il porting su tutte le mie funzionalità preferite, ad eccezione di Ctrl + w che tratta spazi e barre come confini di parole, molto probabilmente all'indietro-kill-word. In Bash, tuttavia, readline elimina fino al primo spazio, eliminando tutte le barre tra.

Ho provato molte diverse combinazioni di \ Cw: backward-kill-word in entrambi .inputrc e .bashrc usando bind ma non riesco a farlo funzionare come voglio.

Abbastanza divertente, attraverso Putty da Windows al lavoro posso usare Alt + Backspace, che anche il manuale dice che è l'associazione predefinita, per produrre il comportamento esatto che voglio. Ma in Terminal.app sui miei Mac a casa questo non funziona. Lo stesso vale per qualsiasi server FreeBSD o Linux in cui mi capita di accedere da Terminal.app.

Quindi mi rivolgo al superutente per chiedere aiuto.

Risposte:


40

readlinenon si lega Ctrl- Wpoiché è gestito dal driver del terminale per impostazione predefinita:

$ stty -a
(...) werase = ^W; (...)

Per disabilitarlo, devi eseguire (in ~/.bashrc):

stty werase undef
bind '"\C-w": backward-kill-word'

.inputrcnon sarà di aiuto in quanto viene letto quando Ctrl- Wè ancora assegnato a werase.

Si noti inoltre che i \C-wformati keyeq devono essere racchiusi tra virgolette, come sopra.


È possibile gestire terminali diversi Alt, in modo Backspacediverso.

  • Terminale PuTTY e GNOME (con impostazioni predefinite) send 1b 7f( ESC DEL)
  • Xterm con metaSendsEscape: truesend 1b 08( ESC BS).
  • Xterm senza metaSendsEscape invii 88( HTSo BScon il bit più alto impostato).

Xterm ha alcune impostazioni per controllare il comportamento dei Alttasti (chiamati Metain generale in Xterm e X11). Con metaSendsEscape, tenendo Altpremuto il prefisso verrà premuto un tasto ESC(esadecimale 1b). Senza l'impostazione (modalità predefinita), Altimposterà il bit più alto del carattere di input, risultando in caratteri speciali. (Ad esempio, Alt- Nrisultati in ESC ne îrispettivamente.)

Per quanto posso ricordare, Terminal.app ha anche un'impostazione simile per controllare il comportamento di Meta / Alt / qualunque-Mac-usi.


Questa non è solo la risposta migliore ma estremamente istruttiva, grazie!
Stefan M,

1
@shurane: l' azione "cancella parola", come la normale cancellazione (Backspace), è implementata dal sistema operativo stesso, nel driver "tty device" - nota che sono disponibili anche in programmi che leggono alla cieca da stdin, ad es. cat. Su tutti gli Unix, sttyviene utilizzato per controllare vari parametri tty inclusi questi tasti speciali. (Ecco come appariva UNIX 7th Editionstty .)
Grawity

1
@shurane: Nel frattempo, readline è una libreria dello spazio utente originariamente scritta per la shell bash (sebbene ora utilizzata da molti programmi). È possibile che le altre azioni siano state implementate in readline per evitare di gonfiare il driver tty (che aveva già una notevole quantità di flag e levette, come si vede nel sttymanuale). Inoltre, bash era originariamente destinato al sistema operativo GNU e solo successivamente portato su altri Unix; è molto più semplice mantenere le funzionalità di modifica in una singola libreria che in diversi kernel molto diversi.
Grawity il

3
@shurane: Tecnicamente, tuttavia, tutte queste azioni, inclusa la cancellazione di parole, sono implementate da readline - quando attivo, disabilita completamente Backspace e Ctrl + W dal driver del terminale. readline rispetta semplicemente la sttyconfigurazione per semplicità, ma può essere sostituito dalle impostazioni di readline (come descritto nella risposta di Matt Day).
Grawity,

4
Questa è un'ottima risposta per informazioni, voto positivo. Tuttavia, va notato che questo disabilita Ctrl-w per tutti i programmi a meno che non utilizzino readline, che probabilmente non è quello che qualcuno vuole ..., quindi prova la risposta di @fjarlq.
0

19

grawity ha scritto che questo non può essere controllato nel .inputrcfile, ma che non è corretto.

Se sei set bind-tty-special-chars offnel tuo .inputrc, puoi quindi personalizzare il comportamento dei caratteri speciali del terminale.

Per esempio:

set bind-tty-special-chars off
Control-u: kill-whole-line
Control-w: backward-kill-word

2
E questo ha il vantaggio di funzionare per tutti i programmi che usano readline, ad es python.
wchargin,

3

Per la cronaca, la risposta che si applica a iTerm2 è impostare Alt- Backspace(o Opt ⌥- su Mac) per inviare codici esadecimali 0xb1e 0x7fper eseguire l' backward-kill-wordazione che tratta i caratteri non alfanumerici come delimitatori.

Per distinzione, ecco il comportamento che sto descrivendo, in cui premendo Opt ⌥- una volta cambia questo:

echo "/example/filepath/with_non-alpha.characters@blah:meh

a questa:

echo "/example/filepath/with_non-alpha.characters@blah:

E le successive presse di Opt ⌥- :

echo "/example/filepath/with_non-alpha.characters@

echo "/example/filepath/with_non-alpha.

echo "/example/filepath/with_non-

echo "/example/filepath/with_

echo "/example/filepath/

Ecco come appare l'impostazione in iTerm2: inserisci qui la descrizione dell'immagine

Quindi, specifica per Putty e Terminal, la risposta di Grawity è ottima. Ma dopo aver trascorso una quantità imbarazzante di tempo alla ricerca di come applicare l'impostazione in iTerm2, questo post di superutente sembra apparire più frequentemente, quindi sembrava responsabile fornire le informazioni pertinenti in quanto si applica a iTerm2 come risposta allegata a questa domanda.


Mi ci è voluto davvero molto tempo per capirlo, e questa soluzione funziona davvero su OS X (con iTerm2) quando si accede a una shell bash remota. Grazie!
Martijn,
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.