Disponemos de teclados de más de cien teclas, todas ellas con unos valores asociados a los que nos acomodamos porque no hay más remedio... ¿o sí lo hay? ¿Qué pasa si no nos gusta la posición original de alguna de ellas?, ¿qué pasa si le queremos dar una utilidad a las teclas con el simbolito de Windows? (a todo esto, ¿por qué diablos tengo en mi teclado teclas con el simbolito de Windows?). ¿Qué pasa si, en definitiva, queremos un teclado a nuestro propio gusto?, ¿podemos elegir?: sí, podemos. Podemos modificar las posiciones originales de cada uno de los caracteres, añadirles nuevas funciones a las teclas, apagar el ordenador, reiniciarlo o lanzar el lector de correo con una simple pulsación; de una forma sencilla se puede asociar cualquier orden a cualquier tecla reconocida por el núcleo[1]. Así podemos asociar hasta doscientos cincuenta y seis valores por tecla, no está mal. Veamos cómo hacerlo.
Los programas mencionados están todos disponibles en el paquete «kbd». El breviaro de teclas es el fichero en el que asociaremos cada tecla con sus correspondientes funciones. Disponemos de breviarios completos clasificados según maquinaria, tipo de teclado e idioma en el directorio «/usr/share/kbd/keymaps/» o «/usr/share/keymaps».
Podemos elegir entre tres opciones:
Optaremos por esta última opción. En cualquier caso, si queremos utilizar uno de modelo podemos usar dumpkeys > breviario y trabajar sobre el fichero que acabamos de crear con todas las definiciones de teclas asociadas a nuestro teclado.
En un principio trabajaremos con y para la consola, si bien las modificaciones que realicemos estarán también presentes en las X añadiendo tan sólo una línea al fichero de configuración de estas últimas.
En esencia, el breviario está compuesto por dos tipos de líneas:
La primera línea define todos los valores posibles para una tecla (declaración completa de valores), la segunda define sólo el valor correspondiente a la combinación de modificadores indicados (declaración sencilla de valores). Nos centraremos en la segunda, aunque explicaré también la primera.
Ese código es un valor númerico (decimal, hexadecimal u octal[2]) asociado a cada tecla, a cada uno de esos cuadraditos de plástico, es decir: cada vez que pulsamos tal o cual tecla se genera un código exclusivo, y es a este código al que asociaremos estos o aquellos caracteres u órdenes. Por tanto, lo primero que haremos es hallar este valor para cada una de las teclas que deseemos personalizar. De esta tarea se encarga el programa Showkey:
Después de ejecutar la orden mencionada podremos pulsar cualquier tecla y aparecerá en pantalla el código vinculado a ella, a su pulsación. Nótese que al soltar la tecla aparece el código correspondiente a su liberación, al cual no prestaremos la más mínima atención —pobre... bueno, la vida es cruel y hoy no tendrá su minuto de gloria—. Al cabo de diez segundos de inactividad regresaremos al apuntador.
Con estos códigos en nuestro poder ya podemos asociarles una nueva función a las teclas a las que corresponden. Antes mencioné la posibilidad de añadir hasta doscientos cincuenta y seis valores a cada tecla; no estaba exagerando. En función de los modificadores activos podemos llegar hasta ese número. Los modificadores son:
Hay que comentar aquí que los cuatro últimos rara vez suelen estar definidos, asociandos a una tecla en concreto, por lo que si deseamos trabajar con ellos deberemos vicularlos antes con un botoncito (y precisamente de eso trata todo ésto). Alguien podría estar pensando ahora, —ah, pero yo tengo mayúsculas izquierda y derecha en mi teclado—, a lo que yo respondo, —así es, sí, pero ambas teclas actúan simplemente como mayúsculas, fuerza uno, a menos que se modifique su comportamiento—. A todo esto, ¿qué es eso de fuerza uno?... pasemos al siguiente párrafo.
Cada modificador tiene una fuerza indicada entre paréntesis (incluyamos fuerza cero para la ausencia de modificadores). Los modificadores pueden combinarse entre sí sumando sus fuerzas; y sumando, sumando... doscientos cincuenta y seis. Bien, vale, «¿qué leches nos estás contando?»... pues esto:
O esto otro, llevado ya a la práctica:
En el ejemplo anterior se asocia a la tecla cuyo código es treinta (la que tiene la letra «A» dibujada) el valor «a» cuando se pulse sin más, «A» cuando se pulse junto con mayúsculas, «comilla latina de apertura» cuando se pulse junto con alt gr (o alt derecho), «menor que» cuando se pulse junto con control, y así hasta el último valor cuando se pulse con todos los modificadores a la vez —que ocurrirá cuando a la raza humana le crezcan otros dos brazos—.
¿Se coge la idea? En esencia esto es lo que hay, y hasta aquí lo referente a la declaración completa de valores[3]. Ahora bien, hay una forma alternativa y más intuitiva de hacer esto sin necesidad de ir calculando las fuerzas resultantes al combinar este con aquel modificador: la declaración sencilla de valores.
Este método define un único valor para una combinación de modificadores, directamente. Usaremos «plain» cuando queramos referirnos a la tecla pulsada sin compañía.
En la última línea de este último ejemplo estamos indicando que al pulsar mayúsculas, alt gr y control a la vez (fuerza 7) junto con la tecla a se mostrará el símbolo del conjunto vacío —y si alguien se ha preguntado alguna vez para qué demonios servía el conjunto vacío... pues para esto, para hacer bonito en un ejemplo de composición de modificadores cuando al autor no se le ocurre nada mejor—.
Una cosa, se están usando los nombres de los modificadores en inglés porque el programa que los leerá, Loadkeys, no sabe idiomas. Los nombres correspondientes a la lista mencionada antes son: Shift, AltGr, Control, Alt, ShiftL, ShiftR, CtrlL, CtrlR.
Entonces, una vez dicho todo esto, o también, una vez soltado el rollo, ya podemos ir haciendo nuestros pinitos en la modificación extrema de teclados. Claro que, dije antes que podíamos asociar también órdenes completas a las teclas y hasta ahora sólo hemos vinculado caracteres individuales. No mentí: demos una calurosa bienvenida a la función «string» —¡Oh, sí, más rollo!, ¡sí!—.
Para asociar una instrucción, por compleja que sea ésta, a una tecla, haremos lo siguiente:
Y ¿qué conseguimos con esto?: pues que las perversas teclas con el simbolito de Windows sirvan por fin para algo. En este caso, una nos mostrará algo de información sobre el sistema, y la otra invocará al programa Fbi para que nos muestre las imágenes del directorio en el que nos encontremos. Pero ya sabéis, la imaginación al poder.
¿Cómo lo hemos hecho?: pues como si de una declaración sencilla de valores se tratara pero asignándoles una tecla de función, cualquiera de la forma FX, donde X es un número elevado para evitar pisar las que ya estén siendo usadas (a partir de cien el riesgo de pisar a alguien es mínimo). Una vez hecho esto continuamos asignándole en una nueva línea a esa misma tecla de función la orden deseada añadiendo al principio «string». Al definir la orden podemos proteger una serie de caracteres para obtener otros especiales: \n para intro, \\ para la barra invertida y \" para comillas dobles.
Para no liarla, si asociamos una tecla con un modificador, tenemos que definirlo para todos los posibles valores[4], algo así:
Pero esto es cansino. Ay, ¿qué haremos, pues, para aliviar este tormento que nos abruma? Hay una solución: «keymaps». Añadamos, al principio del breviario, una línea similar a la salida de esta orden: dumpkeys | head -n1. Algo así:
Que indica que sólo se van a definir los valores de fuerza 0, 1, 2, 4, 6, 8, 9, y 12, en lugar de cada una de las 256 posibilidades (si bien tampoco hace falta definirlos todos para cada tecla[5]. El caso es añadir una línea «keymaps»).
Haciendo esto, cuando definamos una entrada como keycode 125 = Control, conseguimos que automáticamente se asigne «Control» a cada uno de los valores indicados en la línea «keymaps», y desaparecerá el riesgo de dejar activado un modificador y no ser capaces de desactivarlo por mucho que repulsemos su tecla asociada.
En cualquier caso, conviene que una definición de «keymaps» no falte en ningún breviario, así que la añadiremos vayamos o no a asociar modificadores.
Si nos topamos con una tecla que no responde ante showkey, nos habremos topado con una tecla extraña que quizás sí responda ante showkey -s. Estas suelen ser las teclas que los fabricantes colocan en sus teclados para convertirlos en enormes trastos con mil y un botones que a la hora de la verdad sirven más bien para poco, quizás para lucirse ante algún amiguete con fácilidad para el asombro; pero vamos, que para poca cosa. Tenemos dos opciones: devolver el teclado travestido éste o continuar leyendo (vais a continuar leyendo, pero que conste que recomiendo la primera).
Para darles una utilidad a estos botones primero necesitamos saber su código de seguimiento (contrapunto de los códigos de tecla que hemos usado hasta ahora) mediante:
Esto nos devolverá un código de seguimiento similar a 0xe0 0x5e 0xe0 0xde al pulsar la tecla. Nos quedaremos con los dos primeros número hexadecimales (correspondientes a la pulsación) y les quitaremos el cero y la equis. El siquiente paso es asignar a este código de seguimiento un código de tecla con el programa Setkeycodes. Podemos asignar códigos comprendidos entre 1 y 127.
Ese e05e corresponde a los dos números con los que nos quedamos antes, y el 120 es el código de tecla que luego usaremos en nuestro breviario como hemos hecho hasta ahora: keycode 120 = ....
Conviene saber que los códigos de tecla van desde el 1 hasta el 127 y que por supuesto, muchos de ellos ya están asignados a las teclas de nuestro teclado. Para saber los que están libres basta con dar la siguiente orden y buscar las líneas sin un valor definido a la derecha del igual:
Pues bien, llegó la hora de crear el breviario, ya tenemos los conocimientos necesarios para hacerlo sin que nada explote en el proceso. Hale, hale, a ello. Cada cual que haga las modificaciónes que más lo llenen de felicidad y satisfacción.
Con el breviario hecho sólo queda cargarlo, notificarle al controlador del teclado nuestro deseo de cambio. Para eso usaremos el programa Loadkeys:
Y si no hay ningún error en el breviario de teclas éste habrá sido cargado, y a disfrutar.
Como parece que todo fue bien y aún podemos usar el teclado para comunicarnos con nuestro ordenador llegó el momento de hacer estos cambios permanentes de una forma u otra. ¿Cómo lograr esto?:
Las dos primeras opciones automatizan la carga de nuestro breviario, una en el arranque y otra en la autenticación. La tercera consiste en añadir nuestro breviario al código fuente del núcleo, para que éste, después de compilar, sea el que use por defecto. Desde nuestro directorio hogar, después de haber cargado nuestro breviario, haremos lo siguiente:
Explicación: nuestro breviario no contiene todas las entradas para cada una de las teclas, necesitamos uno que sí las tenga y que además incluya nuestras modificaciones: esto lo conseguimos con el programa Dumpkeys. Luego usamos loadkeys -m para crear un fichero que el núcleo pueda entender: «defkeymap.c». El tercer paso es una copia de seguridad rutinaria del fichero que vamos a sustituir en el cuarto paso por nuestro «defkeymap.c». Y ya sólo resta compilar el núcleo.
Con la última opción conseguimos que el núcleo utilice un controlador de teclado que use nuestro breviario sin más, desde el princio, sin necesidad de tocar aquí o allá, o cargar esto o aquello.
Todo esto es muy bonito, o vaya, incluso más que bonito, pero ¿qué pasa si queremos hacer vigentes estos cambios en nuestras sesiones gráficas, en las X?
Disponemos de herramientas anejas a las utilizadas hasta ahora, con un funcionamiento similar, para usar dentro del entorno X: xev o xmodmap. Pero entonces, ¿tanto trabajo para nada? Oy, mi gozo en un pozo... ¿o no? Pues no, con añadir una línea al fichero de configuración de las X solucionado.
Si usamos una versión de las X inferior a la 3.3.6, añadiremos XkbDisable a la sección keyboard; si usamos una versión posterior a la 4.0, añadiremos Option "XkbDisable" a la sección Input. Listo.
Leer los manuales apropiados:
Esta guía no cubre todos los aspectos relacionados con el tema tratado, esos manuales sí lo hacen —No, no, leer no es pecado—.
No la arméis. Es que si lo hacéis, si la liais, podéis inutilizar el teclado (al menos hasta reiniciar el sistema): ¿qué pasaría si por equivocación nos quedamos sin intro?... Avisados quedáis —y ahora es cuando se oyen las carcajadas ominosas de fondo—. Hale, a correr.
[1] Podemos encontrarnos con teclas aparentemente desconocidas para el núcleo. El programa Setkeycodes nos puede ayudar en estas situaciones, claro que, si la situación es peliaguda (si ni siquiera Showkey nos muestra un código al pulsarlas) entonces habrá llegado la hora de utilizar un nuevo controlador de teclado: a parchear tocan.
[2] Notación: en caso de usar valores hexadecimales antepondremos al número un cero y una equis (0xnúmero), si usamos valores octales antepondremos un cero (0número), y usaremos el número tal cual si trabajamos en decimal (número).
[3] Más información en el manual de keymaps (man keymaps), sección «Complete keycode definitions».
[4] Si no hacemos esto, al pulsar la tecla el modificador se activará y se buscará el valor vinculado a esa tecla para la fuerza asociada al modificador; como no hay nada definido para esa fuerza, al soltar la tecla el modificador no se desactivará. —Mmm... Tres tristes tigres comen trigo en un trigal. Venga, una vez más: tres tristes...
[5] Por norma general, los valores que no se definan se considerarán vacíos y no generarán efecto alguno.
© 2009, Zeles Cabal. Todos los derechos reservados.
Gracias por el documento, muy util
Me alegra mucho oírtelo decir, Alejandro, te agradezco el comentario.