================= Keystroke-HOWTU, version 2.0 ================== Linux Keystroke HOWTO por Zenon Fortuna (zenon@netcom.com) Traducido por Luis Hern ndez Rodr¡guez Version: 2.0 4 Abril 1.995 INDEX 0. ¨ Que es "Keystroke-HOWTO" ? 1. Historia de los cambios 2. Peque¤a descripci¢n 3. Herramientas para la modificaci¢n del driver del teclado 4. Modificando el fichero del teclado 4.0 Ejemplo de modificaci¢n de un fichero de teclado 4.1 Modificaci¢n temporal del inicio del teclado 4.2 Modificaci¢n permanente 5. Ejemplo de escritura de una macro 6. Comentarios 7. ¨ M s ideas ? ----------------------------------------------------------------- 0. ¨ Que es el "Keystroke-HOWTO" ? Este documento es para los usuarios, que desean asignar una acci¢n especial a algunas teclas del teclado. El m‚todo sugerido es utilizar loadkeys(1) ¢ modificar el fichero defkeymap.c y volver a linkar el kernel. Este texto NO hace alusi¢n al remapeo del teclado, por ejemplo la tecla de 'Borrado hacia atr s' ¢ la tecla de 'Borrado'. Para obtener m s informaci¢n sobre como remapear el teclado, lea el documento Mini-HOWTO escrito por Stephen Lee. El m‚todo descrito a continuaci¢n ha sido testado en la versi¢n de Linux 1.2.1, del paquete de distribuci¢n Slackware 2.2.0. 1. Historia de los cambios 4 de Abril de 1.995 Versi¢n: 2.0 Adaptado para Linux 1.2.1: - cambios simples en la modificaci¢n de "my_keytable.map". - ejemplo modificado "key_macro" en el volcado de pantalla /dev/vcs* 7 de Mayo de 1.995 Versi¢n: 1.0 La versi¢n inicial del "Keystroke-HOWTO", que funciona en Linux 1.0 2. Peque¤a descripci¢n El terminal virtual de Linux y los drivers de teclado asumen el teclado, por defecto, que est  definido en el fichero drivers/char/defkeymap.c del kernel fuente. Las 12 teclas de funci¢n pueden contener cadenas de mandatos. Despu‚s de pulsar cualquiera de las teclas de funci¢n, ¢ en uni¢n de la tecla Alt ¢ Ctrl, el terminal virtual actual a¤ade la cadena especifica a la entrada y salida de los buffers, emulando la cadena como si se hubiese tecleado. Colocar una cadena en una tecla de funci¢n nos simplifica la ejecuci¢n de un comando, por ejemplo, para poder ejecutar la sentencia "/usr/local/bin/key_macro", la cual podremos crear ¢ modificar cuando deseemos. 3. Herramientas para la modificaci¢n del driver del teclado Podemos utilizar loadkeys(1), dumpkeys(1) y showkey(1): La utilidad loadkeys(1) le ayuda a cargar nuevas cadenas en el buffer del teclado ¢ preparar un nuevo c¢digo en C para modificar el kernel. La utilidad dumpkeys(1) se utilizar  para obtener la tabla actual del teclado, y poder consultarlo ¢ modificarlo. La utilidad showkey(1) nos permite obtener el c¢digo (keycode) de la tecla de funci¢n seleccionada. Si su sistema Linux no dispone de estas utilidades, puede obtenerla a trav‚s de 'anonymous' en ftp como 'kbd-0.89.tar.gz' ¢ 'kbd-0.90.tar.gz' y el conjunto desde sunsite.unc.edu:/pub/Linux/system/Keyboards, ¢ tsx-11.mit.edu:/pub/linux/sources/system Deber  utilizar la utilidad 'tar' de GNU para descomprimir los ficheros. 4. Modificando el fichero del teclado El kernel de Linux incluye el c¢digo compilado defkeymap.c code, el cual se genera con la utilidad loadkeys(1) desde el fichero defkeymap.map. Ambos ficheros est n incluidos en el directorio src/linux/drivers/char. Necesitaremos modificar el fichero defkeymap.map, para hacer una copia local de uno de ellos, tecleando # cp defkeymap.map my_keytable.map ¢ # dumpkeys > my_keytable.map Tambi‚n hay una colecci¢n grande de ficheros de teclados diferentes en el directorio /usr/lib/kbd/keytables, desde el cual "defkeymap.map" se utiliza como src/linux/drivers/char/defkeymap.map file en su sistema. El m‚todo que utiliza la utilidad dumpkeys(1) es el recomendable, debido a que puede suceder que su kernel ya se haya modificado ¢ generado para vd. con el fichero defkeymap.map, que usted haya elegido. Lea el contenido del fichero my_keytable. : hay m s de 300 l¡neas de c¢digo, divididas en 3 grupos de declaraciones: El primer grupo est  compuesto de l¡neas con la palabra "keycode", seguido de las palabras adicionales "Alt", "Control", etc. El segundo grupo se compone de l¡neas con la palabra "string". El tercer grupo agrupa las l¡neas con la palabra "compose". Para obtener m s informaci¢n sobre la sintaxis de keytables(5) lea el documento con el comando % man keytables 4.0 Ejemplo de modificaci¢n de un fichero de teclado Como ejemplo vamos a asignar una cadena (macro) a la tecla de funci¢n F1, para que pulsando las teclas "Ctrl-F1" llamemos a nuestro Shell-script "/usr/local/bin/key_macro". Antes de nada, nos debemos enterar cual es el c¢digo de tecla de funci¢n F1. Utilizaremos la utilidad showkey(1) para encontrar el c¢digo asociado a F1. Nos encontraremos que la cadena "F1" en el fichero "my_keytable.map" tiene asociado el c¢digo 59: keycode 59 = F1 Esto sugiere, que el c¢digo asociado a la tecla de funci¢n F1 es el 59. Tambi‚n define esta l¡nea que despu‚s de pulsar la tecla F1, el driver del teclado enviar  la cadena delimitada por dicha tecla. Para ver el contenido de esta cadena, podemos buscar el patr¢n "string F1", y encontraremos string F1 = "\033[[A" Esto significa, que despu‚s de pulsar la tecla F1, el driver del teclado envia la secuencia "Esc [ [ A" (sin espacios en blanco). No cambie esta cadena, porque hay algunas aplicaciones que dependen de esta cadena, y la toman por defecto como operaci¢n de la tecla F1. No obstante, podemos definir una nueva operaci¢n para Ctrl-F1, siempre que no est‚ reservado por el kernel para otros procedimientos. Para ver los cambios que se producen en la tecla F1, junto con Ctrl-, Shift- u otro modo, examinemos el fichero "my_keytable.map" con # grep 59 my_keytable.map En el caso de que no haya una l¡nea con "control keycode 59", utilizaremos la combinaci¢n Ctrl-F1 sin problemas. (cuando en una l¡nea exista "shift control keycode 59", todo estar  conforme). A¤adamos la siguiente l¡nea al fichero "my_keytable.map" : control keycode 59 = s¡mbolo de la tecla donde el "s¡mbolo de la tecla" define la acci¢n que realiza la combinaci¢n de teclas Ctrl-F1. La versi¢n de Linux 1.2.* le permite una asignaci¢n din mica de cadenas, excepto el nombre del "s¡mbolo de la tecla" que es fijo. Se permite los "simbolos de teclas" entre F1 y F246. Para el fichero "my_keytable.map" de mi sistema la tecla F21 no tiene uso, pero vd. puede examinar mi fichero "my_keytable.map" y elegir un s¡mbolo de tecla apropiado. As¡, podemos colocar una l¡nea al final con control keycode 59 = F21 Ahora tendremos que definir el contenido de la tecla F21, a¤adiendo la l¡nea string F21 = "/usr/local/bin/key_macro\n" Resumiendo, hemos realizado dos cambios en el fichero original "my_keytable.map": hemos declarado la nueva cadena F21, y hemos declarado que Ctrl-F1 puede ejecutar el contenido de F21. 4.1 Modificaci¢n temporal del inicio del teclado Una vez que tengamos modificado el fichero "my_keytable.map", podemos copiarlo, con los cambios realizados, al n£cleo del driver del teclado, utilizando la utilidad loadkeys(1) : % loadkeys my_keytable.map El permiso para modificar el n£cleo del driver del teclado se concede a todo el que tenga acceso de lectura en el dispositivo "/dev/console". Para verificar los cambios realizados, podemos utilizar la utilidad dumpkeys(1) para comprobar el valor de F21, por ejemplo % dumpkeys | grep F21 Veremos en pantalla: keycode 59 = F1 F11 Console_13 F21 string F21 = "/usr/local/bin/key_macro\012" lo que significa que todo est  correcto (OK), debido a que "\012", ¢ LF, equivale a "\n". Ahora, pulsando "Ctrl-F1" se ejecutar  la sentencia: "/usr/local/bin/key_macro" 4.2 Modificaci¢n permanente Los cambios efectuados en el n£cleo del driver del teclado por la utilidad loadkeys(1) no ser n efectivos hasta que no se vuelva a reinicializar el ordenador (¢ la pr¢xima vez que ejecute loadkeys). Podemos modificar el fichero /etc/rc.d/rc.local utilizando para ello loadkeys y le ponemos como argumento el fichero my_keytable.map. O en lugar de ello, modificamos el fichero src/linux/drivers/char/defkeymap.c y volvemos a linkar el n£cleo con los nuevos valores. No debemos modificar manualmente el fichero defkeymap.c, sino generarlo con la utilidad loadkeys(1) : # mv defkeymap.c defkeymap.c.ORIG # loadkeys --mktable my_keytable.map > defkeymap.c Entonces debemos generar el nuevo kernel, esencialmente cambi ndose al directorio raiz donde est n los fuentes del n£cleo de Linux, y despu‚s utilizar make(1). Finalmente, debemos utilizar lilo(1) para instalar y ejecutar nuestro nuevo n£cleo. 5. Ejemplo de escritura de una macro Es muy £til una macro, ya que con una simple pulsaci¢n de teclas podemos ejecutar varios comandos, ¢ imprimir algo. Este ejemplo ha cambiado desde la versi¢n 1.0 de Linux, debido a los cambios en el n£cleo de Linux, que ya no proporciona el comando del sistema ioctl(0,TIOCLINUX). Para leer en la pantalla de la consola virtual, primero se deben preparar algunos ficheros de dispositivos. Como usuario "root" debemos crear los siguientes ficheros: # mknod /dev/vcs1 c 7 1 # mknod /dev/vcs2 c 7 2 ... # mknod /dev/vcs63 c 7 63 Por supuesto, basta con tener s¢lo los ficheros espec¡ficos que tengamos en nuestra consola virtual que estemos utilizando. Las l¡neas que a continuaci¢n se leen son un ejemplo de un posible fichero /usr/local/bin/key_macro : #!/bin/sh # # Este es un ejemplo de lo £til que es la escritura de # una macro # VT_NUMBER=`tty|cut -c9-` FILE=/tmp/vt$VT_NUMBER.dump cp /dev/vcs$VT_NUMBER $FILE echo SCREEN DUMP saved in $FILE # # La l¡nea siguiente se utilizar  si desea hacer un # volcado a la # impresora # lpr $FILE 6. Comentarios No hay practicamente l¡mite en la longitud de las cadenas que deseamos se carguen en el driver del teclado. La longitud del buffer en FUNC_BUFSIZE (fijada en 512 bytes), se ha reemplazado en la versi¢n de Linux 1.2.* por una estrat‚gica distribuci¢n din mica del buffer .... en trozos de 512 bytes cada uno. La copia m s reciente del documento Keystroke-HOWTO puede encontrarla ftp.netcom.com: /pub/ze/zenon/linux/howto 7. ¨ M s ideas ? En el caso de que vd. encuentre algo importante para a¤adir a este documento, por favor envie sus comentarios zenon@netcom.com -- gracias.