Jun
10
2009

Redefinición de teclas en linux – Introducción a XKB.
Escrito por NomikOS el 10/Jun/2009 | 143 visitas

En un comienzo sólo quería contarles de un hack muy sencillo que encontré en un libro de trucos 100 Linux tips & Tricks que nos permite darle uso a esas teclas con el símbolo de MS-windows de nuestros teclados y que en linux generalmente no usamos.

También ya alguna vez habia intentado redefinir alguna tecla para acceder más rapidamente al slash (/) pero no entendí nada.

De algo vale la pena resistir la tentación de volver a la facilidad de uso de MS-windows. De tal manera que como en todo con lo que te vas familiarizando, las cosas aparecen más sencillas y claras con creciente celeridad.

Ahora no solo he podido redefinir varias teclas, sino que he aprendido bastante sobre XKB (X KeyBoard), la extensión para manejo de teclados en sistemas con X11 (Interfaz gráfica para Unix) como es el caso de linux.

Además descubrí una nueva (2005) distribución de teclado alternativa a QWERTY/Dvorak llamada Colemak que, si bien está diseñada para el inglés, sigue siendo muy superior a QWERTY y se aviene muy bien a las tareas de un programador, que esencialmente escribe en inglés, ya sean comandos o comentarios.

Me tiene bastante emocionado darme la opotunidad de aprender algo totalmente nuevo y desde cero que esté relacionado a mi pega/hobby. En cuanto lo haya practicado un poco me referiré más a él.

Volviendo a XKB, si tú también quieres acceder a información de primera mano:

  • The X Keyboard Extension: Library Specification (pdf)
  • The X Keyboard Extension: Protocol Specification (pdf)

    Redefinición de teclas en linux

    Los archivos involucrados son:

    1
    2
    3
    4
    5
    /etc/X11/xorg.conf
    /etc/X11/xkb/geometry/pc
    /etc/X11/xkb/symbols/es
    /etc/X11/xkb/rules/xorg.lst
    /etc/X11/xkb/rules/xorg.xml

    De los cuales sólo modificaremos /etc/X11/xkb/symbols/es para español. Para otros idiomas busca en el mismo directorio /etc/X11/xkb/symbols/.

    Esto está basado en slackware/zenwalk. Otra locación común para encontrar estos archivos es /usr/share/X11/xkb. Para encontrarlos en tu sistema puedes hacer:

    1
    2
    3
    locate xorg.conf
    locate geometry/pc
    locate symbols/es

    En el archivo /etc/X11/xorg.conf se configura tu teclado:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # **********************************************************************
    # Keyboard section
    # **********************************************************************

    Section "InputDevice"
      Identifier  "Keyboard1"
      Driver  "kbd"
      Option     "XkbRules"      "xorg"
      Option     "XkbModel"      "pc105"
      Option     "XkbLayout"     "es"
    # Option     "XkbVariant"    "us"
      Option     "XkbOptions"    ""
    EndSection

    Es tarea del instalador de tu distribución de linux asignar correctamente esos datos. Para obtenerlos sin buscar en el anterior archivo, puedes ejecutar:

    1
    2
    3
    4
    5
    # xprop desliega las propiedades de X11
    # queremos las de la ventana raiz (root)
    # filtramos la info específica para el teclado (XKB) con grep
    xprop -root | grep XKB [ENTER]
    _XKB_RULES_NAMES(STRING) = "xorg", "pc105", "es", "", ""

    En el archivo /etc/X11/xkb/geometry/pc:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    xkb_geometry "pc105" {

        description= "Generic 105";
        width= 470;
        height= 180;

    # ... etc ...

        }; // End of "Function" section

        section "Alpha" {
        top= 61;

    # quinta fila de teclas alfanuméricas (AE**)
    # TILDE, 1, 2, ...

        row {
            top= 1;
            keys { <tlde>, <ae01>, <ae02>, <ae03>, <ae04>,
               <ae05>, <ae06>, <ae07>, <ae08>, <ae09>,
               <ae10>, <ae11>, <ae12>,
               { <bksp>, "BKSP", color="grey20" }
            };
        };

    # cuarta fila de teclas alfanuméricas (AD**)
    # TAB, Q, W, E...

        row {
            top= 20;
            keys { { <tab>, "TABK", color="grey20" },
               <ad01>, <ad02>, <ad03>, <ad04>, <ad05>,
               <ad06>, <ad07>, <ad08>, <ad09>, <ad10>,
               <ad11>, <ad12>, { <bksl>, "BKSL" }
            };
        };

    # tercera fila de teclas alfanuméricas (AC**)
    # CAPS-LOCK, A, S, D...

        row {
            top= 39;
            keys { { <caps>, "CAPS", color="grey20" },
               <ac01>, <ac02>, <ac03>, <ac04>, <ac05>,
               <ac06>, <ac07>, <ac08>, <ac09>, <ac10>,
               <ac11>, { <rtrn>, "RTRN", color="grey20" }
            };
        };

    # segunda fila de teclas alfanuméricas (AB**)
    # LEFT-SHIFT, < (LEFT GREATER THAN), Z, X, C...

        row {
            top= 58;
            keys { { <lfsh>, "LFSH", color="grey20" },
                <lsgt>, <ab01>, <ab02>, <ab03>, <ab04>, <ab05>,
                <ab06>, <ab07>, <ab08>, <ab09>, <ab10>,
                { <rtsh>, "RTSH", color="grey20" }
            };
        };

    # primera fila de teclas alfanuméricas
    # LEFT-CONTROL, LEFT-WIN, LEFT-ALT, SPACE, ...

        row {
            top= 77;
            key.shape= "SMOD";
            key.color= "grey20";
            keys { { <lctl>, "MODK" }, <lwin>, <lalt>,
               { <spce>, "SPCE", color="white" },
               <ralt>, <rwin>, <menu>, <rctl>
            };
        };
        }; // End of "Alpha" section

        section "Editing" {

    # ... etc ...

    }; // End of "pc105" geometry

    Como ves describe muy claramente la posición de todas las teclas y su nombre genérico. En la última sección row hay algunas llamadas LWIN, RWIN y MENU. Esas son las que no interesan.

    En el archivo /etc/X11/xkb/symbols/es tenemos (fíjate en los comentarios que he hecho):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    // $XKeyboardConfig$

    // based on a keyboard
    // Modified for a real Spanish Keyboard by Jon Tombs
    //
    // $XFree86: xc/programs/xkbcomp/symbols/es,v 1.2 2002/11/22 dawes Exp $

    partial default alphanumeric_keys
    xkb_symbols "basic" {

        include "latin(type4)"

        name[Group1]="Spain";

    # En las siguientes lineas se definen todas las combinaciones para cada
    # tecla de la siguiente manera:

    # Grupo 1 Nivel 1 : presión directa
    # Grupo 1 Nivel 2 : conbinando con [SHIFT]
    # Grupo 2 Nivel 1 : conbinando con [ALT-GR]
    # Grupo 2 Nivel 2 : conbinando con [SHIFT] y [ALT-GR]

    # Lo que en el caso de la tecla 1 es:
    #
    # G-1 N-2     G-2 N-2
    #    !           ¡
    #
    #    1           |
    # G-1 N-1     G-2 N-1

    # El modelo de cada tecla es:
    #  key <****>  { [   G-1 N-1,    G-1 N-2,      G-2 N-1,      G-2 N-2 ] };

       key <ae01>  { [         1,     exclam,          bar,   exclamdown ] };
       key <ae03>  { [         3, periodcentered, numbersign,   sterling ] };
       key <ae04>  { [         4,     dollar,   asciitilde,       dollar ] };
       key <ae06>  { [         6,  ampersand,      notsign,  fiveeighths ] };
       key <ae11>  { [apostrophe,   question,    backslash, questiondown ] };
       key <ae12>  { [exclamdown, questiondown, asciitilde,   asciitilde ] };

       key <ad11>  { [dead_grave, dead_circumflex, bracketleft,  notsign ] };
       key <ad12>  { [      plus,   asterisk, bracketright,  dead_macron ] };

    # Por ejemplo AC10 produce ñ, Ñ, ~, ˝

       key <ac10>  { [    ntilde, Ntilde,   asciitilde, dead_doubleacute ] };
       key <ac11>  { [dead_acute, dead_diaeresis, braceleft,   braceleft ] };
       key <tlde>  { [ masculine, ordfeminine,    backslash,   backslash ] };
       key <bksl>  { [  ccedilla,   Ccedilla,   braceright,   dead_breve ] };

    # AQUI VIENE LO BUENO. ATENCION:
    # Configuración personal para las teclas de MS-WINDOWS
    # ----------------------------------------------------
    key <rwin> { [ asciitilde ] };      // produce ~
    key <lwin> { [ backslash  ] };      // produce \
    key <menu> { [ slash ] };           // produce /
    # ----------------------------------------------------

        include "level3(ralt_switch)"
    };

    Para que los cambios tengan efecto deberás reiniciar tu sistema.

    Definición de cada tecla

    Como hemos visto el modelo para definir cada tecla es:

    1
    #   key <****>  { [   G-1 N-1,    G-1 N-2,      G-2 N-1,      G-2 N-2 ] }

    En donde:

  • G-1 N-1 : Grupo 1 Nivel 1 : presión directa
  • G-1 N-2 : Grupo 1 Nivel 2 : conbinando con [SHIFT]
  • G-2 N-1 : Grupo 2 Nivel 1 : conbinando con [ALT-GR]
  • G-2 N-2 : Grupo 2 Nivel 2 : conbinando con [SHIFT] y [ALT-GR]

    y los asteriscos en: key <****> representan:

    *1: Grupo de teclas
    Posibilidades:
    A: teclas alfanuméricas
    F: teclas de funciones
    K: teclado numérico

    *2: Fila de teclas empezando desde la inferior
    Posibilidades:
    A. B, C, D, E …

    *34: Posición de izquierda a derecha sin contar teclas especiales como [TAB]
    Posibilidades:
    1, 2, 3 …

    Ejemplos de redefinición

    De esta manera puedes redifinir las teclas que tu quieras. Con las que yo te indico puedes, por ejemplo, acceder rápidamente a tu directorio HOME (~):

    1
    cd ~/downloads

    Escapar caracteres especiales dentro de strings:

    1
    2
    echo "<span class=\"$highligt\">PHP expande las variables que se ";
    echo "encuentran entre comillas dobles.</span>";

    Teclas muertas

    Los caracteres cuyo nombre empieza con dead_ como dead_acute y dead_diaeresis se obtienen con las teclas muertas. Las teclas muertas son las que permiten modificar caracteres como por ejemplo, para obtener la a con tilde (á) primero apretas (‘) y luego la letra a. Para escribir la ü en desagüe: (“) y luego la letra u.

    De la misma manera los teclados sin eñe (ñ) pueden ser configurados para obtenerla apretando tilde (~) y luego n.

    <dead_tilde> <N> : Ntilde
    <dead_tilde> <n> : ntilde

    Alguna vez anduve buscando como escribir el tilde circumflejo (^) que se usa mucho en expresiones regulares. Esta tambien es una tecla muerta. En general puedes obtener el caractér de cada tecla muerta apretándola y a continuación la barra espaciadora.

    Conclusión

    Una vez más linux demuestra una de sus características que más nos gustan, su versatilidad. Lo que al final hace que lo sientas más tuyo y que quieras continuar dándole tu tiempo a cambio de estas pequeñas satisfacciones.


    Posts relacionados:

    1. Guake – Un terminal para linux al estilo Quake.

  • Escrito por NomikOS en Linux, June 10 - 2009 @ 23:03 hrs. Tags: , , | 143 visitas

    RSS feed para comentarios en este post

    TrackBack URL

    Deja un comentario

    XHTML: Etiquetas permitidas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

    motor: WordPress. tema: TheBuckmaker modificado por NomikOS.