Escribir Caracteres del Español con Teclado Inglés en Linux: Hackeando XKB sin Permisos de Root

작성자

카테고리:

← 피드로
DEV Community · Fede · 2026-08-13 개발(SW)

Si te dedicas a la programación o infraestructura en Linux, sabrás que la distribución física de un teclado en inglés suele ser superior para escribir código o el manejo de la terminal. Caracteres clave como las comillas ", los paréntesis (), llaves {} y corchetes [] están mejor ubicados que en los teclados en español, sin mencionar lo incómodo que resulta en estos últimos encontrar la virgulilla ~ para hacer referencia al home.

Sin embargo, como hispanohablantes el tener el teclado con el layout en inglés nos impide escribir fácilmente caracteres acentuados o la letra eñe si tenemos que redactar correos, mantener conversaciones por chat, etc.

Frente a esta carencia, la solución tradicional suele ser activar variantes internacionales con teclas muertas (dead keys), pero trae complicaciones severas al programar. Por ejemplo, al intentar escribir un string ('api_key'), pulsar ' seguido de a inserta á. Entonces, para conseguir el símbolo suelto ', debes presionar ' y luego la barra espaciadora para “destrabar la tecla muerta”.

¿Por que las llaman teclas muertas?
Es un mecanismo heredado de las máquinas de escribir mecánicas. En ellas, al pulsar la tecla del acento (como ´ o ¨), se imprimía la marca en el papel pero el carro no avanzaba (“muerta” porque no movía el papel). Al pulsar la siguiente vocal, esta se imprimía justo en la misma posición. Al llevar esta modalidad a los ordenadores, teclas como ', ", ` o ~ quedan bloqueadas a la espera de una segunda pulsación.

Durante un tiempo, mi solución fue configurar el teclado inglés más un mapa de teclado en español (a pesar de tener el teclado físico en inglés) y alternar constantemente entre ambos presionando Alt + Shift según estuviera en el editor de código o en aplicaciones de mensajería. Era un parche incómodo, propenso a errores y requería adivinar continuamente en qué modo estaba el teclado.

La búsqueda de una solución limpia me llevó a descubrir que en la distribución estadounidense existe una joya llamada us(altgr-intl) (EE. UU. AltGr Internacional). Con ella puedes escribir código normalmente (las comillas y backticks responden al instante) y si mantienes presionado AltGr + alguna vocal, obtienes acentos (á, é, í, ó, ú), y con AltGr + n, la ñ.

¿Por qué entonces escribir este post si ya he dado con la solución? Porque el portátil que tengo ahora tiene el teclado británico y esta distribución no tiene su equivalente nativo al us(altgr-intl) entonces toca crear uno que me otorgue esta solución.

Anatomía de XKB: Dónde Residen los Teclados en Linux

En la mayoría de las distribuciones de Linux, la gestión del teclado recae en el subsistema XKB y la librería libxkbcommon. Las definiciones de los mapas de teclado se encuentran centralizadas en el directorio del sistema /usr/share/X11/xkb/symbols/.

Dentro de este directorio, cada fichero representa una distribución base o Layout por país o idioma, como us (EE. UU.), gb (Reino Unido) o es (España), entre otros. A su vez, dentro de cada fichero se definen las distintas Variantes (subconfiguraciones como dvorak, mac o altgr-intl).

Editar directamente el archivo correspondiente a la distribución de nuestro teclado (en mi caso /usr/share/X11/xkb/symbols/gb) parecería lo obvio para obtener el comportamiento deseado. Sin embargo, esto requiere permisos de superusuario y podríamos perder nuestra configuración, ya que cualquier actualización del paquete xkeyboard-config sobrescribirá y borrará todos los cambios.

Por suerte, libxkbcommon implementa una jerarquía estricta de búsqueda para estos ficheros con un orden de prioridad:

1. Usuario (Prioridad Máxima):
   ~/.config/xkb/symbols/  (o $XDG_CONFIG_HOME/xkb/symbols/)
   ~/.xkb/symbols/         (Ruta legacy)

2. Sistema Global Custom (Prioridad Media):
   /etc/xkb/symbols/

3. Paquete del Sistema (Prioridad Baja):
   /usr/share/X11/xkb/symbols/

Enter fullscreen mode Exit fullscreen mode

Esto significa que si colocamos dentro del directorio ~/.config/xkb/symbols/ un archivo llamado gb, el sistema lo evaluará como prioritario, cargándolo con preferencia absoluta sobre la versión del sistema.

Diseñando la Variante altgr-intl en XKB para el layout de teclado británico

La estructura de un fichero de definición XKB se organiza en bloques xkb_symbols y dentro podemos mapear hasta 4 niveles de caracteres por tecla de la siguiente manera:

key <Cod_tecla> { [ Nivel 1, Nivel 2, Nivel 3, Nivel 4 ] };

Enter fullscreen mode Exit fullscreen mode

Donde:

  • Nivel 1: Presionar la tecla sin más.
  • Nivel 2: Tecla + Shift.
  • Nivel 3: Tecla + AltGr (aquí es donde modificaremos su comportamiento).
  • Nivel 4: Tecla + AltGr + Shift (aquí también).

💡 ¿Cómo nombra XKB las teclas físicas?
XKB no identifica las teclas por la letra impresa en el teclado, sino por su posición (de abajo a arriba por filas AA a AE, y de izquierda a derecha por columnas 01 a XX):

  • Fila AE (Números): <AE01> = 1, <AE02> = 2…
  • Fila AD (Letras superiores): <AD01> = Q, <AD02> = W, <AD03> = E…
  • Fila AC (Home Row): <AC01> = A, …, <AC04> = F…
  • Fila AB (Letras inferiores): <AB01> = Z, …, <AB06> = N…
  • Fila AA (Ctrl, Alt, Espacio…): <AA01> = Ctrl Izquierdo, <AA08> = Espacio… Aunque para estas teclas XKB tiene alias como y respectivamente.

Para implementar nuestra variante manteniendo la herencia de gb(basic), tenemos dos opciones:

  1. Copiar el archivo base del sistema /usr/share/X11/xkb/symbols/gb a nuestra ruta local ~/.config/xkb/symbols/gb y añadir nuestro bloque altgr-intl al final. De esta manera, la directiva include "gb(basic)" encontrará la sección basic definida dentro del mismo archivo local.
  2. Crear un archivo con nombre personalizado y guardar nuestro bloque allí como ~/.config/xkb/symbols/gb_custom. Al llamarse distinto del archivo del sistema, XKB buscará la sección basic directamente al fichero oficial /usr/share/X11/xkb/symbols/gb.

La estructura de la nueva variante queda así:

partial alphanumeric_keys
xkb_symbols "altgr-intl" {
    // 1. Heredar la base del teclado británico estándar
    include "gb(basic)"

    name[Group1]= "English (UK, AltGr international)";

    // 2. Mapear acentos y la letra ñ al Nivel 3 (AltGr) y Nivel 4 (AltGr+Shift)
    key <AD03> { [ e, E, eacute, Eacute ] };
    key <AD07> { [ u, U, uacute, Uacute ] };
    key <AD08> { [ i, I, iacute, Iacute ] };
    key <AD09> { [ o, O, oacute, Oacute ] };
    key <AC01> { [ a, A, aacute, Aacute ] };

    key <AB06> { [ n, N, ntilde, Ntilde ] };

    // 3. Habilitar la tecla Alt Derecho (Right Alt) como conmutador de Nivel 3
    include "level3(ralt_switch)"
};

Enter fullscreen mode Exit fullscreen mode

Desglose técnico del código:

  • partial alphanumeric_keys: Le indica a XKB que este bloque no define un teclado completo desde cero, sino una modificación parcial centrada en la sección alfanumérica del teclado.
  • include "gb(basic)": Carga todo el mapeo físico estándar impreso en los teclados británicos para que no tengamos que declarar todas las teclas.
  • key <AD03>: Accede a la 3ª tecla de la fila superior (la E). Al definir [ e, E, eacute, Eacute ], asignamos la é minúscula al pulsar AltGr + e, y la É mayúscula al pulsar AltGr + Shift + e, dejando su comportamiento normal para los dos primeros niveles.
  • include "level3(ralt_switch)": Indica a XKB que la tecla Alt Derecho (Right Alt) actuará como selector del Nivel 3.

Activación en el Entorno

Una vez creado el archivo en ~/.config/xkb/symbols/gb (o gb_custom), el último paso es indicarle al compositor que cargue esta nueva variante.

En mi caso, utilizo Hyprland como gestor de ventanas, por lo que basta con añadir estas líneas en mi archivo de configuración:

En la configuración de Hyprland (~/.config/hypr/hyprland.conf):

input {
    kb_layout = gb          # O "gb_custom" si usaste un archivo independiente
    kb_variant = altgr-intl
}

Enter fullscreen mode Exit fullscreen mode

Al recargar Hyprland, mantengo el 100% de los símbolos impresos en mi teclado británico y gano acceso directo e instantáneo a tildes (á, é, í, ó, ú) y a la ñ simplemente combinando las teclas con AltGr.

Llévalo al Siguiente Nivel: Hacks de Teclado Personalizados

Entender la estructura de xkb_symbols te abre la puerta a adaptar cualquier teclado a tus necesidades específicas.
Ten en cuenta que no es obligatorio definir siempre los 4 niveles: si solo necesitas una combinación con AltGr, basta con declarar 3 elementos dentro de los corchetes [ ].

Te dejo 4 ideas prácticas como ejemplos útiles:

1. Arreglar la Virgulilla (~) en el Teclado Español

En el teclado de España (es), escribir la virgulilla ~ exige presionar AltGr + 4 seguido de la barra espaciadora por actuar como tecla muerta. Puedes hacer que se imprima directamente con AltGr + ñ declarando solo 3 niveles:

key <AC10> { [ ñ, Ñ, asciitilde ] };

Enter fullscreen mode Exit fullscreen mode

2. Descongelar la Comilla Invertida / Backtick (`) en el Teclado Español

Como programador, el backtick ` es un operador crítico. En distribuciones en español actúa como tecla muerta para el acento grave (como en francés à), obligándote a presionar la tecla y luego espacio. Puedes redefinirla para que imprima el backtick directo en Nivel 3:

// Imprime ` de forma directa en Nivel 1, manteniendo Shift + tecla = ^ y AltGr + tecla = [
key <AD11> { [ grave, dead_circumflex, bracketleft ] };

Enter fullscreen mode Exit fullscreen mode

(O si también deseas descongelar el circunflejo ^ para que no sea tecla muerta)

key <AD11> { [ grave, asciicircum, bracketleft ] };

Enter fullscreen mode Exit fullscreen mode

3. Símbolos de Monedas e Iconos Financieros (, £, $, , 💰)

Si trabajas con plataformas internacionales o finanzas, puedes asignar símbolos monetarios en el Nivel 3 y emojis gráficos relacionados en el Nivel 4:

// AltGr + e -> € (Euro) | AltGr + Shift + e -> 💶 (Billete de Euro)
key <AD03> { [ e, E, EuroSign, U1F4B6 ] };

// AltGr + b -> ₿ (Bitcoin) | AltGr + Shift + b -> 💰 (Bolsa de Dinero)
key <AB05> { [ b, B, U20BF, U1F4B0 ] };

Enter fullscreen mode Exit fullscreen mode

4. Emojis y Símbolos de Redacción Rápida

Si redactas documentación con frecuencia y quieres evitar abrir un picker de emojis o buscar símbolos especiales:

// AltGr + s -> 🚀 (U1F680 Cohete) | AltGr + Shift + s -> 💡 (U1F4A1 Bombilla)
key <AC02> { [ s, S, U1F680, U1F4A1 ] };

// AltGr + m -> — (Raya / Guion largo de diálogo U2014)
key <AB07> { [ m, M, U2014 ] };

Enter fullscreen mode Exit fullscreen mode

¿Se te ocurre alguna otra configuración útil? Compártela!

원문에서 계속 ↗

코멘트

답글 남기기