Custom keyboard layout (woes)¶
La idea es modificar algunas teclas o arreglar cosas que no funcionan bien.
Compartí mis penas en reddit: https://www.reddit.com/r/linux/comments/hmnipy/xkb_custom_keyboard_layouts_for_kde_in_arck_linux/
Layouts personalizados¶
Ver tambien: logitech-mk470
El layout para poner tildes sin AltGr es este:
Para personalizar las teclas recomiendo usar XKB, agregando una variante de teclado al layout.
Configuracion con xmodmap¶
Para que xmodmap ponga las letritas en las teclas como me gusta:
.xinitrc
if [ -s ~/.Xmodmap_nico ]; then
xmodmap ~/.Xmodmap_nico
fi
exec startplasma-x11
Use info de acá para saber los nombres y los valores por defecto salieron de xmodmap -pke
.
.Xmodmap_nico
keycode 49 = dead_grave dead_tilde degree asciitilde degree asciitilde grave asciitilde dead_grave dead_tilde
keycode 32 = o O Greek_theta Greek_THETA Greek_theta Greek_THETA oacute
keycode 25 = w W Greek_omega Greek_OMEGA Greek_omega Greek_OMEGA
keycode 38 = a A Greek_alpha Greek_ALPHA Greek_alpha Greek_ALPHA
keycode 58 = m M mu mu mu mu
keycode 56 = b B Greek_beta Greek_BETA Greek_beta Greek_BETA
keycode 40 = d D Greek_delta Greek_DELTA Greek_delta Greek_DELTA
keycode 46 = l L Greek_lambda Greek_LAMBDA Greek_lambda Greek_LAMBDA oslash Oslash
keycode 39 = s S Greek_sigma Greek_SIGMA Greek_sigma Greek_SIGMA
keycode 33 = p P Greek_pi Greek_PI Greek_pi Greek_PI
keycode 28 = t T Greek_tau Greek_TAU Greek_tau Greek_TAU thorn THORN dead_ogonek
keycode 17 = 8 asterisk 8 asterisk infinity dead_ogonek threequarters dead_ogonek 8 asterisk threequarters dead_ogonek 8 asterisk threequarters dead_ogonek
keycode 41 = f F Greek_phi Greek_PHI Greek_phi Greek_PHI f F f F f F f F f F
keycode 26 = e E e E Greek_epsilon Greek_EPSILON eacute Eacute e E eacute Eacute e E eacute Eacute
keycode 31 = i I i I includedin includes iacute Iacute i I iacute Iacute i I iacute Iacute
keycode 53 = x X Greek_chi Greek_CHI x X x X x X x X x X x X
keycode 27 = r R r R Greek_rho Greek_RHO registered registered r R registered registered r R registered registered
El problema con esto es que espontáneamente se desconfiguraba, y hacía que abrir terminales fuera lento o me bloqueara KDE.
Configuracion con XKB rústica¶
Lectura util:
- https://wiki.archlinux.org/index.php/Xorg/Keyboard_configuration
- https://wiki.archlinux.org/index.php/Xorg/Keyboard_configuration#Using_setxkbmap
- https://jlk.fjfi.cvut.cz/arch/manpages/man/setxkbmap.1
- https://wiki.archlinux.org/index.php/X_keyboard_extension
El que quiero modificar es "English (US, intl., with dead keys)", está en /usr/share/X11/xkb/symbols/us
.
Para agregar una variante sigo las instrucciones que están acá.
Agregar lo siguiente al final de /usr/share/X11/xkb/symbols/us
:
sudo nano /usr/share/X11/xkb/symbols/us
Esta es una variante de ejemplo, mas abajo esta la definicion completa.
// El layout de nico para tener letras grigas en paz sin xmodmap
// Depende de us(intl)
partial alphanumeric_keys
xkb_symbols "intl_nico" {
include "us(intl)"
key <TLDE> { [ grave, asciitilde, masculine, ordfeminine ] };
key <BKSL> { [ backslash, bar, braceright, dead_breve ] };
};
Agregar una linea a dos archivos en la sección ! variant
:
sudo nano /usr/share/X11/xkb/rules/base.lst
# despues de intl us: English (US, intl., with dead keys)
sudo nano /usr/share/X11/xkb/rules/evdev.lst
# despues de intl us: English (US, intl., with dead keys)
Codigo a agregar:
intl_nico us: English (US, new variant)
Resultado:
Y agregar lineas a base.xml
y evdev.xml
en la misma carpeta:
sudo nano /usr/share/X11/xkb/rules/base.xml
# después del <variant> tag que dice <description>English (US, intl., with dead keys)</description>
sudo nano /usr/share/X11/xkb/rules/evdev.xml
# después del <variant> tag que dice <description>English (US, intl., with dead keys)</description>
Codigo a agregar:
<variant>
<configItem>
<name>intl_nico</name>
<description>English (US, new variant)</description>
</configItem>
</variant>
**Congratulations: You’re done. Now you can (maybe after a logout and a new login) choose the new layout in whatever interface present your distribution/desktop environment. **
Ahora que eso funciona solo falta poner lo que realmente me interesaba cambiar. ¿Cómo es la sintaxis de estos archivos?
key <AE01> { [ 1, exclam, bar, exclamdown ] };
... as for example the one show there: the key “1” will emit the number “1” when pressed alone, the key “exclam” (!) when pressed with shift, the “bar” (|) when pressed with Alt-Gr, and the reverse exclamation sign “exclamdown” (¡) with shift+AltGr.
Así que, por ejemplo lo siguiente podría funcionar. Editar /usr/share/X11/xkb/symbols/us
y reemplazar el snippet anterior con el siguiente:
// El layout de nico para tener letras grigas en paz sin xmodmap
partial alphanumeric_keys
xkb_symbols "intl_nico" {
include "us(intl)"
name[Group1]= "English (US, new variant)";
key <TLDE> { [ grave, asciitilde, degree, asciitilde ] };
key <AE08> { [ 8, asterisk, infinity, dead_ogonek ] };
key <AD09> { [ o, O, Greek_theta, Greek_THETA ] };
key <AD02> { [ w, W, Greek_omega, Greek_OMEGA ] };
key <AC01> { [ a, A, Greek_alpha, Greek_ALPHA ] };
key <AB07> { [ m, M, Greek_mu, Greek_MU ] };
key <AB05> { [ b, B, Greek_beta, Greek_BETA ] };
key <AC03> { [ d, D, Greek_delta, Greek_DELTA ] };
key <AC09> { [ l, L, Greek_lambda, Greek_LAMBDA ] };
key <AC02> { [ s, S, Greek_sigma, Greek_SIGMA ] };
key <AD10> { [ p, P, Greek_pi, Greek_PI ] };
key <AD05> { [ t, T, Greek_tau, Greek_TAU ] };
key <AC04> { [ f, F, Greek_phi, Greek_PHI ] };
key <AD03> { [ e, E, Greek_epsilon, Greek_EPSILON ] };
key <AD08> { [ i, I, Greek_iota, Greek_IOTA ] };
key <AB02> { [ x, X, Greek_chi, Greek_CHI ] };
key <AD04> { [ r, R, Greek_rho, Greek_RHO ] };
key <AC05> { [ g, G, Greek_gamma, Greek_GAMMA ] };
key <AC08> { [ k, K, Greek_kappa, Greek_KAPPA ] };
include "level3(ralt_switch)"
};
Mágicamente los nombres son los mismos que en xmodmap, así que solo tuve que hacer magia con Ctrl+Shift+L en Sublime Text y quedó prolijito (aguante el editor multilínea).
A veces KDE flashea, para cambiar de layout con XKB manualmente se puede hacer:
sudo setxkbmap -query
setxkbmap -print
# setxkbmap [-model xkb_model] [-layout xkb_layout] [-variant xkb_variant] [-option xkb_options]
setxkbmap -model pc102 -layout us,es -variant intl,nodeadkeys
Lamentablemente, intl_nico
falla con error:
Error loading new keyboard description
Configuracion persistente con XKB¶
Es importante basarse en los layouts us_intl
y es
(en vez de us
y latam
). Aunque todavía no entiendo bien por que, esos layouts permiten hacer composición de virgulillas, tildes, acentos, dieresis con otras letras directamente presionando una antes que la otra (sin usar AltGr como compose key, que es más molesto).
Todavía no desculé la diferencia entre esos layouts que hace que uno componga solo y el otro no.
US layout con letras giregas¶
cp /usr/share/X11/xkb/symbols/us /usr/share/X11/xkb/symbols/us_nico
subl /usr/share/X11/xkb/symbols/us_nico
Hacer que aparezca en las opciones de KDE¶
Archivos lst:
subl /usr/share/X11/xkb/rules/base.lst
subl /usr/share/X11/xkb/rules/evdev.lst
Tienen que quedar asi:
! layout
us_nico English (US)
! variant
chr us: Cherokee
haw us: Hawaiian
euro us: English (US, euro on 5)
intl us: English (US, intl., with dead keys)
intl_nico us_nico: English (US, intl. greek letters)
Archivos xml:
subl /usr/share/X11/xkb/rules/base.xml
subl /usr/share/X11/xkb/rules/evdev.xml
Hay que agregar un <layout>
tag apuntando al keymap persomalizado <name>us_nico</name>
despues del de us
.
Es igual al layout de us
pero se llama us_nico
(como el archivo que duplique y modifique al principio: /usr/share/X11/xkb/symbols/us_nico
).
Tecla LSGT¶
xev
dice que la tecla mayo/menor al lado de la Z es 94:
keycode 94 (keysym 0x5c, backslash), same_screen YES,
XKeysymToKeycode returns keycode: 51
Los XKB symbols se corresponden con las teclas en este archivo /usr/share/X11/xkb/keycodes/evdev
donde dice:
cat /usr/share/X11/xkb/keycodes/evdev | grep LSGT
<LSGT> = 94;
Confirmando que esa es la tecla que tengo que cambiar para que funcione bien el teclado log de mierda que tengo.
Agregar a qq
, bajo xkb_symbols "basic"
:
key <LSGT> { [ less, greater, lessthanequal, greaterthanequal ] };
Eso deberia propagarse a los otros layouts latam.
ES layout con letras giregas y LTGT¶
Archivos editados:
Editar /usr/share/X11/xkb/rules/evdev.lst
y /usr/share/X11/xkb/rules/base.lst
:
! layout
...
es Spanish
es_nico Spanish2
! variant
...
ltgt es_nico: Spanish (LTGT)
Editar /usr/share/X11/xkb/rules/base.xml
y /usr/share/X11/xkb/rules/evdev.xml
como corresponde, agregando un es_nico
. Ver el .zip adjuntado arriba.
Configuración con xorg.conf.d¶
Esto no es lo que necesito al final.
Your own configurations can go in /etc/X11/xorg.conf.d/
Este tutorial sirve pero para configuraciones que en Arch no son persistentes:
- hektor.umcs.lublin.pl/~mikosmul/computing/articles/custom-keyboard-layouts-xkb.html
- https://michal.kosmulski.org/computing/articles/custom-keyboard-layouts-xkb.html
Estre tiene pinta de que si sirve:
Let's say you want to configure a PC-style American keyboard with 104 keys as described in base.lst. This can be done by simply writing several lines from below to a new configuration file in /etc/X11/xorg.conf.d, such as /etc/X11/xorg.conf.d/90-custom-kbd.conf
Pero no, solo elige el layout, no lo define.
Aca hay otro:
https://medium.com/@damko/a-simple-humble-but-comprehensive-guide-to-xkb-for-linux-6f1ad5e13450
Logitech MK470¶
Especificaciones¶
https://www.logitech.com/es-es/product/mk470-slim-wireless-combo?crid=1759#specification-tabular
Tiene 102 teclas, con ñ
, ç
y tecla de mayor/menor <>
.
Layout¶
El layout que elegí es Spanish (no dead keys)
.
El compose key no parece funcionar, y no esta Multi_key
en xmodmap -pke
.
Pero con setxkbmap
parece que el layout que elegí puede andar:
setxkbmap -option compose:ralt
Esto es un poco molesto tener que usar compose key para poner tildes.
La mejor solucion es la de XKB explicada arriba.
KDE quirks¶
A veces no me reconoce los layouts disponibles que configuré. Estan en la lista de la GUI, pero al intentar cambiarlo con el atajo, o con el widget graficamente, algunos no se pueden seleccionar.
qdbus org.kde.keyboard /Layouts getCurrentLayout
qdbus org.kde.keyboard /Layouts getLayoutsList
Creo que es un problema de KDE, quizas se lleve mal con localectl y /etc/X11/xorg.conf.d/00-keyboard.conf
.
localectl¶
For convenience, the tool localectl may be used instead of manually editing X configuration files. It will save the configuration in /etc/X11/xorg.conf.d/00-keyboard.conf
El output de localect status
al iniciar el sistema es el mismo que en KDE:
System Locale: LANG=en_US.UTF-8
VC Keymap: n/a
X11 Layout: n/a
No tengo idea por que ahi dice n/a
.
Pero antes de iniciar X corrí sudo localectl set-keymap es
y eso ahora hace que no tenga que usar la compose key para poner tildes y ademas ahora
localectl status
devuelve algo más razonable:
$ sudo localectl set-keymap es
$ localectl status
System Locale: LANG=en_US.UTF-8
VC Keymap: es
X11 Layout: es
X11 Model: pc105
X11 Options: terminate:ctrl_alt_bksp
El X11 Model: pc105
quizas deberia ser pc102 (?). Ademas, seria mejor poner tambien el toggle para poder usar el teclado logitech y el de la compu en la terminal:
localectl set-keymap us es
Con este comando se crea /etc/X11/xorg.conf.d/00-keyboard.conf
que contiene:
# Written by systemd-localed(8), read by systemd-localed and Xorg. It's
# probably wise not to edit this file manually. Use localectl(1) to
# instruct systemd-localed to update it.
Section "InputClass"
Identifier "system-keyboard"
MatchIsKeyboard "on"
Option "XkbLayout" "es"
Option "XkbModel" "pc102"
Option "XkbVariant" "nodeadkeys"
EndSection
Acá dice:
Your own configurations can go in /etc/X11/xorg.conf.d/
Variantes¶
Las variantes se pueden mostrar con:
localectl list-x11-keymap-variants us
localectl list-x11-keymap-variants es
Ahi aparece mi variante de us
llamada intl_nico
, que tiene las letras griegas y eso. Tambien la variante nodeadkeys
que estoy usando ahora del layout es
.
Para el modelo, acá aparece pc102:
localectl list-x11-keymap-models
Segun la documentacion, la sintaxis completa es set-x11-keymap LAYOUT [MODEL [VARIANT [OPTIONS]]]
.
sudo localectl set-x11-keymap es pc102 nodeadkeys
Y para el de la laptop:
sudo localectl set-x11-keymap us pc102
No parece tener efecto en KDE y Konsole, pero tiene efecto inmediato en otra TTY fuera de X.
Ademas podria poner alguna opcion, como para la compose key. Esas opciones se pueden ver con localectl list-x11-keymap-options
. Pero como los tildes se componen por defecto en el layout es
, no es necesario.