In bash, come associo un tasto funzione a un comando?


91

Esempio: voglio associare la F12chiave al comando in echo "foobar"modo che ogni volta che premo F12il messaggio "foobar" venga stampato sullo schermo. Idealmente potrebbe essere qualsiasi comando di shell arbitrario, non solo i builtin. Come si fa a farlo?

Risposte:


163

Puoi determinare la sequenza di caratteri emessa da un tasto premendo Ctrl- vsulla riga di comando, quindi premendo il tasto che ti interessa. Sul mio sistema per F12, ottengo ^[[24~. Il ^[rappresenta Esc. Diversi tipi di terminali o emulatori di terminale possono emettere codici diversi per la stessa chiave.

Al prompt di Bash puoi inserire un comando come questo per abilitare la macro chiave in modo da poterla provare.

bind '"\e[24~":"foobar"'

Ora, quando premi F12, otterrai "foobar" sulla riga di comando pronto per ulteriori modifiche. Se desideri che una sequenza di tasti immetta immediatamente un comando, puoi aggiungere una nuova riga:

bind '"\e[24~":"pwd\n"'

Ora quando si preme F12, verrà visualizzata la directory corrente senza dover premere Enter. E se hai già digitato qualcosa sulla riga e lo usi che viene eseguito automaticamente? Potrebbe diventare disordinato. Tuttavia, potresti cancellare la riga come parte della tua macro:

bind '"\e[24~":"\C-k \C-upwd\n"'

Lo spazio fa in modo che Ctrl- uabbia qualcosa da eliminare per evitare che il campanello suoni.

Una volta che la macro funziona nel modo desiderato, puoi renderla persistente aggiungendola al tuo ~/.inputrcfile. Non è necessario il bindcomando o il set esterno di virgolette singole:

"\e[24~":"\C-k \C-upwd\n"

Modificare:

Puoi anche creare un'associazione di tasti che eseguirà qualcosa senza disturbare la riga di comando corrente.

bind -x '"\eW":"who"'

Quindi mentre stai digitando un comando che richiede un nome utente, ad esempio, e devi conoscere i nomi degli utenti che hanno effettuato l'accesso, puoi premere Alt- Shift- We whoverrà visualizzato l'output di e il prompt verrà emesso nuovamente con il tuo comando parziale intatto e il cursore nella stessa posizione nella riga.

Sfortunatamente, questo non funziona correttamente per chiavi come quelle F12che producono più di due caratteri. In alcuni casi questo può essere aggirato.

Il comando ( whoin questo caso) potrebbe essere qualsiasi eseguibile: un programma, uno script o una funzione.


2
E se volessi aggiungere un'associazione a "ctrl + q"?
kubudi

5
@kubudi: bind '"\C-q": menu-complete'per esempio (o nella vostra ~/.inputrc: "\C-q": menu-complete). Potrebbe anche essere necessario stty -ixonnel vostro ~/.bashrcPer disattivare il controllo di flusso e make ^ S e ^ Q disponibili.
In pausa fino a nuovo avviso.

Dici che ^[rappresenta esce poi sembri sostituirlo \enel tuo esempio. Potresti spiegare perché per favore?
Remover

1
@Remover: ^[è la rappresentazione dell'output. Il \eè un modo per entrare in esso ( ^[non funziona per quello).
In pausa fino a nuovo avviso.

Come posso associare "\ Cz"? Mi piacerebbe avere qualcosa come quello descritto per zsh su sheerun.net/2014/03/21/how-to-boost-your-vim-productivity
pkoch

19

È possibile definire le associazioni di tasti bash in ~/.inputrc(file di configurazione per la libreria GNU Readline). La sintassi è

<keysym o nome chiave>: macro

per esempio:

Control-o: "> output"

creerà una macro che inserisce "> output" quando si preme ControlO

 "\e[11~": "echo foobar"

creerà una macro che inserisce "echo foobar" quando premi F1... Non so quale sia il simbolo del keysym F11.

Modificare:

.inputrccapisce la \nsequenza di escape per l'avanzamento riga, quindi puoi usare

 "\e[11~": "echo foobar\n"

Che effettivamente "premerà invio" dopo che il comando è stato emesso.


4
puoi usare "\ n" all'interno di una macro per aggiungere un carattere di nuova riga:
Barton Chittenden

Questo funziona meglio per me in quanto definisce la mappatura dei tasti all'apertura di un terminale.
Heldraug

Per Alt, usa \e, ad es "\eo": "> output".
Jānis Elmeris

Per un tutorial più approfondito sull'utilizzo .inputrcvedi hackaday.com/2018/01/19/linux-fu-custom-bash-command-completion
Josh Habdas

1
@ArthurHenriqueDellaFraga Ho modificato la risposta; sarà nella tua directory home. Se non esiste, puoi crearlo.
Barton Chittenden

7

Questa soluzione è specifica per gli ambienti X11 e non ha nulla a che fare con bash, ma aggiunge quanto segue al tuo .Xmodmaps

 % loadkeys
 keycode 88 = F12
 string F12 = "foobar"
 %

invierà la stringa "foobar" al terminale dopo aver premuto F12.


Tieni presente che questo non è lo stesso della shell che esegue un comando. Se vuoi effettivamente eseguire un comando, dovrai premere invio (o farlo fare alla stringa inviata per te). Probabilmente voglio anche essere al sicuro e liberare prima la linea.
Cascabel

2
Sarebbe fantastico, ma comunque non sembra funzionare a partire da Fedora 20. Ho anche provato a usare xev per trovare prima il codice chiave corretto per F12 (nel mio caso, 96) e usarlo invece di 88. Nessuno dei due funziona.
BobDoolittle

2

Volevo legarmi Ctrl+Ba un comando. Ispirato da una risposta sopra, ho provato a usare bindma non sono riuscito a capire in quale serie di criptici scarabocchi ( \e[24~?) Si traducono Ctrl+B.

Su un Mac, vai su Impostazioni dell'app Terminale, Profili -> Tastiera -> +quindi premi la scorciatoia da tastiera che stai cercando e viene fuori. Per me è Ctrl+Brisultato \002che mi sono vincolato con successo al comando

bind '"\002":"echo command"'

Inoltre, se desideri che il comando venga eseguito immediatamente (non solo inserito nel prompt), puoi aggiungere Invio alla fine del comando, in questo modo:

bind '"\002":"echo command\015"'

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.