lunedì 23 settembre 2013

Rimappare tasti della tastiera e scambiare numeri con simboli

Trovo la configurazione della tastiera italiana su GNU/Linux (guardate l'ultima figura qui) abbastanza comoda, però tutto si può sempre migliorare. In questo post spiegherò come si cambiano le funzioni dei tasti.

Gli strumenti che servono sono due: xev (per scoprire il codice del tasto e il nome della funzione da eseguire) e xmodmap (per modificare le funzioni associate ai tasti). Entrambi questi programmi, che si usano da linea di comando, fanno parte del server grafico X.org e sono preinstallati nella maggior parte delle distribuzioni. I pacchetti che forniscono questi programmi su Debian e Ubuntu sono x11-utils e x11-xserver-utils.

Per prima cosa bisogna scoprire qual è il codice associato a un tasto. Per fare ciò bisogna eseguire in un terminale il comando
xev
Si aprirà una finestra grafica, mentre sul terminale scorreranno dei messaggi. I messaggi che appaiono appena si avvia il programma non sono importanti. A questo punto bisogna premere il tasto di cui si vuole conoscere il codice. Per esempio, premendo il tasto m apparirà nel terminale il messaggio
KeyRelease event, serial 40, synthetic NO, window 0x4600001,
    root 0x251, subw 0x0, time 7126899, (-210,874), root:(330,897),
    state 0x10, keycode 58 (keysym 0x6d, m), same_screen YES,
    XLookupString gives 1 bytes: (6d) "m"
    XFilterEvent returns: False
Le righe che dobbiamo guardare sono la terza e la quarta: nella terza è riportato il keycode, il codice del tasto (nell'esempio il codice è 58) e il nome della funzione fra parentesi, dopo keysym e un numero esadedecimale (nell'esempio la funzione è m). Invece nella quarta riga possiamo vedere qual è il simbolo effettivamente inserito (m nell'esempio). Il codice del tasto è indipendente dagli eventuali tasti modificatori premuti, come SHIFT e ALT GR, il codice è sempre lo stesso, quello che cambieranno saranno le funzioni associate e i caratteri inseriti.

Facciamo un'altra prova: premiamo il tasto n in una sessione di xev, il corrispondente output sarà
KeyRelease event, serial 40, synthetic NO, window 0x4600001,
    root 0x251, subw 0x0, time 8118563, (523,450), root:(1063,473),
    state 0x10, keycode 57 (keysym 0x6e, n), same_screen YES,
    XLookupString gives 1 bytes: (6e) "n"
    XFilterEvent returns: False

Il comando xmodmap permette di rimappare le funzioni dei tasti. La sintassi del comando da usare è
xmodmap -e "keycode CODICE = FUNZIONE"
sostituendo a CODICE il codice del tasto e a FUNZIONE la funzione da eseguire. Per esempio, per inserire una n premendo il tasto m si deve usare il comando
xmodmap -e "keycode 58 = n"
Dopo l'uguale si possono inserire fino a otto funzioni differenti, separate da uno spazio: la prima è la funzione eseguita premendo il tasto da solo, la seconda è quella corrispondente all'azione SHIFT + tasto, la terza è quella eseguita premendo ALT GR + tasto, la quarta è quella corrispondente a SHIFT + ALT GR + tasto. Le ultime quattro funzioni non sono generalmente utilizzate. Quindi per inserire una n premendo il tasto m e una N premendo SHIFT + m bisogna cambiare il comando precedente in
xmodmap -e "keycode 58 = n N"

Il comando
xmodmap -pke
mostra sullo schermo tutte le funzioni associate a tutti i tasti della propria tastiera. L'output sarà qualcosa del tipo:
...
keycode  22 = BackSpace BackSpace BackSpace BackSpace BackSpace BackSpace
keycode  23 = Tab ISO_Left_Tab Tab ISO_Left_Tab Tab ISO_Left_Tab
keycode  24 = q Q q Q at Greek_OMEGA at
keycode  25 = w W w W lstroke Lstroke lstroke Lstroke
keycode  26 = e E e E EuroSign cent EuroSign
keycode  27 = r R r R paragraph registered paragraph
keycode  28 = t T t T tslash Tslash tslash Tslash
keycode  29 = y Y y Y leftarrow yen leftarrow
keycode  30 = u U u U downarrow uparrow downarrow
keycode  31 = i I i I rightarrow idotless rightarrow
keycode  32 = o O o O oslash Oslash oslash Oslash
keycode  33 = p P p P thorn THORN thorn THORN
keycode  34 = egrave eacute egrave eacute bracketleft braceleft bracketleft
keycode  35 = plus asterisk plus asterisk bracketright braceright bracketright
keycode  36 = Return NoSymbol Return NoSymbol Return
keycode  37 = Control_L NoSymbol Control_L NoSymbol Control_L
keycode  38 = a A a A ae AE ae AE
keycode  39 = s S s S ssharp section ssharp
keycode  40 = d D d D eth ETH eth ETH
...
Possiamo sfruttare queste informazioni per scambiare completamente due tasti senza cercare manualmente una a una tutte le funzioni associate a un tasto, insieme ai possibili modificatori. Per esempio, per scambiare i tasti q (codice 24) e p (codice 33) si possono usare i comandi:
xmodmap -e "keycode  33 = q Q q Q at Greek_OMEGA at"
xmodmap -e "keycode  24 = p P p P thorn THORN thorn THORN"

Il comando xmodmap modifica le associazioni dei tasti solo per la sessione corrente del server X.org. Per rendere permanenti le modifiche bisogna salvare le espressioni keycode CODICE = FUNZIONI in un file e fare in modo che xmodmap carichi quel file ogni volta che si avvia il server grafico X.org. Generalmente il file in cui si salvano queste impostazioni si chiama ~/.xmodmaprc (il nome in realtà è lasciato alla libera scelta dell'utente, il nome suggerito deriva solo da una convenzione diffusa), mentre nel file ~/.xinitrc si aggiungerà (se il file non esiste bisogna crearlo) il comando
xmodmap .xmodmaprc

Nelle tastiere dotate di tastierino numerico sono presenti due tasti per inserire ciascuna cifra. Per eliminare questa ridondanza si possono scambiare, nei tasti numerici sopra le lettere, i simboli con i numeri. Per essere più chiari, si può fare in modo che premendo il tasto 1 sia inserito il simbolo !, premendo il tasto 2 sarà inserito il simbolo ", premendo 3 si inserirà £ ecc... mentre per inserire i corrispondenti numeri bisognerà premere SHIFT + tasto. Nelle tastiere con layout italiano l'output del comando xmodmap -pke corrispondente a questi dieci tasti numerici è
keycode  10 = 1 exclam 1 exclam onesuperior exclamdown onesuperior
keycode  11 = 2 quotedbl 2 quotedbl twosuperior dead_doubleacute twosuperior
keycode  12 = 3 sterling 3 sterling threesuperior dead_tilde threesuperior
keycode  13 = 4 dollar 4 dollar onequarter oneeighth onequarter
keycode  14 = 5 percent 5 percent onehalf threeeighths onehalf
keycode  15 = 6 ampersand 6 ampersand notsign fiveeighths notsign
keycode  16 = 7 slash 7 slash braceleft seveneighths braceleft
keycode  17 = 8 parenleft 8 parenleft bracketleft trademark bracketleft
keycode  18 = 9 parenright 9 parenright bracketright plusminus bracketright
keycode  19 = 0 equal 0 equal braceright dead_ogonek braceright
Per realizzare quanto suggerito basta inserire nel file ~/.xmodmaprc le espressioni precedenti invertendo le funzioni numeriche con i simboli (per esempio bisogna invertire exclam con 1 nella riga corrispondente al tasto con codice 10). Per concretezza riporto qui il codice da inserire nel file:
keycode  10 = exclam 1 exclam 1 onesuperior exclamdown onesuperior
keycode  11 = quotedbl 2 quotedbl 2 twosuperior dead_doubleacute twosuperior
keycode  12 = sterling 3 sterling 3 threesuperior dead_tilde threesuperior
keycode  13 = dollar 4 dollar 4 onequarter oneeighth onequarter
keycode  14 = percent 5 percent 5 onehalf threeeighths onehalf
keycode  15 = ampersand 6 ampersand 6 notsign fiveeighths notsign
keycode  16 = slash 7 slash 7 braceleft seveneighths braceleft
keycode  17 = parenleft 8 parenleft 8 bracketleft trademark bracketleft
keycode  18 = parenright 9 parenright 9 bracketright plusminus bracketright
keycode  19 = equal 0 equal 0 braceright dead_ogonek braceright
Bisogna farci l'abitudine, ma questa nuova configurazione può risultare molto conveniente.