Sostituire caratteri dei tasti

A volte sia perché è rotto fisicamente un tasto, sia perché la mappatura non lo identifica correttamente potrebbe essere necessario di imporre un carattere diverso, rimappare uno o più tasti soli. Lanciamo da terminale
xev
che ci apre una piccola finestra bianca, che dobbiamo lasciare a fuoco, mentre premiamo i due tasti che vogliamo scambiare. Esempio vogliamo mettere la d sul tasto ò/ç, nel terminale viene stampato (ci interessa solo le voci con KeyPress:
KeyPress event, serial 36, synthetic NO, window 0x7c00001,
root 0x7c, subw 0x0, time 68514751, (938,793), root:(1416,1016),
state 0x0, keycode 40 (keysym 0x64, d), same_screen YES,
XLookupString gives 1 bytes: (64) “d”
XmbLookupString gives 1 bytes: (64) “d”
XFilterEvent returns: FalseKeyRelease event, serial 39, synthetic NO, window 0x7c00001,
root 0x7c, subw 0x0, time 68514887, (938,793), root:(1416,1016),
state 0x0, keycode 40 (keysym 0x64, d), same_screen YES,
XLookupString gives 1 bytes: (64) “d”
XFilterEvent returns: FalseKeyPress event, serial 39, synthetic NO, window 0x7c00001,
root 0x7c, subw 0x0, time 68519295, (938,793), root:(1416,1016),
state 0x1, keycode 47 (keysym 0xe7, ccedilla), same_screen YES,
XLookupString gives 2 bytes: (c3 a7) “ç”
XmbLookupString gives 2 bytes: (c3 a7) “ç”
XFilterEvent returns: FalseKeyRelease event, serial 39, synthetic NO, window 0x7c00001,
root 0x7c, subw 0x0, time 68519383, (938,793), root:(1416,1016),
state 0x1, keycode 47 (keysym 0xe7, ccedilla), same_screen YES,
XLookupString gives 2 bytes: (c3 a7) “ç”
XFilterEvent returns: False
Ora sappiamo il keycode di d (40) e il keycode di ò/ç, 47:
keycode 40 (keysym 0x64, d)
keycode 47 (keysym 0xe7, ccedilla)keycode 47 (keysym 0xe7, ccedilla)
Basta dare
xmodmap -e ‘keycode 47 = d’
Ovviamente questo funziona solo per la sessione attuale, se vogliamo che sia perenne basta creare uno script in avvio automatico.