2010-11-17 22 views
76

Esempio: Voglio di impegnare la chiave F12 al comando echo "foobar" tale che ogni volta che mi ha colpito F12 il "foobar" messaggio verrà stampato a schermo. Idealmente potrebbe essere qualsiasi comando di shell arbitrario, non solo builtins. Come si fa a fare questo?In bash, come si associa un tasto funzione a un comando?

risposta

116

è possibile determinare la sequenza di caratteri emessa da una chiave premendo Ctrl -. v nella 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 terminali possono emettere codici diversi per la stessa chiave.

Al prompt Bash è possibile immettere un comando come questo per abilitare la macro chiave in modo da poterlo provare.

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

Ora, quando si preme F12, si otterrà "foobar" sulla riga di comando pronto per ulteriori modifiche. Se si voleva una sequenza di tasti per entrare immediatamente un comando, è possibile aggiungere una nuova riga:

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

Ora, quando si preme F12, si otterrà la directory corrente visualizzata senza dover premere Invio . Cosa succede se hai già digitato qualcosa sulla linea e lo usi che viene eseguito automaticamente? Potrebbe diventare caotico. Tuttavia, si potrebbe cancellare la linea come parte della macro:

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

Lo spazio fa in modo che il Ctrl - u ha qualcosa da eliminare per mantenere il campanello da suonare.

Una volta che la macro ha funzionato nel modo desiderato, è possibile renderla persistente aggiungendola al file ~/.inputrc.Non c'è bisogno per il comando bind o l'insieme esterno di virgolette singole:

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

Edit:

È inoltre possibile creare una chiave vincolante che eseguirà qualcosa senza disturbare la riga di comando corrente.

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

Poi mentre si sta digitando un comando che richiede un nome utente, ad esempio, ed è necessario conoscere i nomi di utenti che hanno effettuato l'accesso, è possibile premere Alt - Maiusc - W e l'output di who verrà visualizzato e il prompt verrà emesso nuovamente con il comando parziale intatto e il cursore nella stessa posizione nella riga.

Sfortunatamente, questo non funziona correttamente per chiavi come F12 che emettono più di due caratteri. In alcuni casi questo può essere risolto.

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

+2

Cosa succede se voglio aggiungere un'associazione a "ctrl + q"? – kubudi

+5

@kubudi: 'bind '" \ C-q ": menu-completo'' per esempio (o in' ~/.inputrc':' "\ C-q": menu-completo'). Potresti anche aver bisogno di 'stty -ixon' nel tuo ~ ~/.bashrc' per disabilitare il controllo di flusso e rendere^S e^Q disponibili. –

+0

Si dice che '^ [' rappresenta 'esc' e quindi sembra sostituirlo con' \ e' nel tuo esempio. Potresti spiegare perché, per favore? – Remover

6

Questa soluzione è specifica per ambienti X11 e non ha nulla a che fare con bash, ma aggiungendo la seguente alle vostre .Xmodmaps

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

invierà la stringa "pippo" al terminale su di colpire F12.

+0

Ricordare che questo non è lo stesso della shell che esegue un comando. Se in realtà vuoi eseguire un comando, dovrai premere Invio (o avere la stringa inviata per farlo). Probabilmente vorrà anche essere al sicuro e cancellare la linea prima. – Cascabel

+0

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

11

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

< keysym o il tasto nome >: macro

ad esempio:

Control-o: "> output" 

sarà creare una macro che inserisce "> uscita" quando si preme

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

volontà creare una macro che inserisca "echo foobar" quando si preme F1 ... Non so cosa sia fuori mano il keysym per F11.

+0

Bello, ma solo "inserti", corretto? –

+3

puoi usare "\ n" all'interno di una macro, per aggiungere un carattere di nuova riga: –

+0

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

Problemi correlati