Escritos
B. Piropo
Anteriores:
< Trilha Zero >
Volte de onde veio
18/11/1991

< ANSI.SYS - Remapeando o Teclado >


Presumo que você não ficou muito entusiasmado com o Ansi.Sys e talvez se pergunte a razão de se dedicar tanto espaço a um driver que até agora só serviu para brincar com o prompt. De fato, com seus serviços de vídeo não há muito o que fazer, exceto de dentro de um programa. Mas é que o melhor ficou para o fim. Pois não se esqueça que ele é um driver de console e até agora só vimos sua atuação no vídeo. Mas console não é só vídeo: também é teclado. E é justamente aí que o Ansi.Sys brilha. Pois ele nos permite fazer algo que pode ser muito útil: remapear o teclado.

Sim, com o Ansi.Sys instalado você pode mudar o significado de qualquer tecla e fazer com que ao acionar o "A" seu teclado responda, por exemplo, com um "X". Está satisfeito com seu teclado da forma como ele se apresenta e achou a mágica meio besta? Isto é porquê você não se deu conta que existem pelo menos dez teclas que, do prompt do sistema, servem para pouco ou quase nada: as teclas de função. Que tal fazer com que cada uma delas execute um comando ou transformá-las em um menu que chame os programas mais freqüentes? Ah, gostou da idéia? Então vamos ver como.

Sendo o Ansi.Sys um driver de console, oferece também suporte ao teclado. Com um único e solitário serviço. Que é porém mais que suficiente: na verdade, para o usuário comum, é mais útil que todos os serviços de vídeo juntos. A estrutura dos comandos do serviço de suporte ao teclado é idêntica à dos serviços de vídeo: o mesmo prefixo (os códigos ASCII 27 e 91, correspondentes aos caracteres ESC e "abre colchete") seguido de parâmetros e terminados por seu identificador, no caso a letra "p" minúscula. Basta enviar um destes comandos para o console e, com os parâmetros adequados, pode-se fazer maravilhas. Logo veremos um exemplo. Mas para entendê-lo precisamos antes discutir os parâmetros.

Eles se situam entre o prefixo e o identificador. Podem ser diversos, separados por ";" (ponto-e-vírgula). Na verdade precisa-se pelo menos de dois: o código da tecla a ser redefinida e a redefinição da tecla, nessa ordem (adiante veremos os códigos das teclas de função, que são os que nos interessam; os demais podem ser encontrados no manual do DOS). E o que se pode entrar como redefinição das teclas? Praticamente qualquer coisa. Desde um novo código (que substituirá o anterior) até conjuntos de códigos ou cadeias de caracteres. Os comandos, então, sempre terão o formato:

[prefixo][código];[redefinição][p]

Para nossa experiência vamos ainda usar o prompt para enviar o comando ao console. Vamos fazer com que a tecla de função F10 faça algo de útil e apresente o diretório corrente. Para isto vamos remapeá-la de forma a que corresponda à cadeia de caracteres "DIR" seguida de ENTER. O código da tecla F10 é 0;68 (todas as teclas de função têm um código duplo sempre iniciado com zero). O código ASCII de ENTER é 13. Do prompt do sistema, digite a linha de comando:

prompt $e[0;68;"DIR";13p

seguida de ENTER. Seu prompt usual deve desaparecer e o cursor fica piscando um tanto desamparado no início de uma linha em branco. Não se aflija: é só um exemplo e logo tudo retornará ao normal. Agora acione a tecla F10. Se o driver Ansi.Sys foi carregado em seu Config.Sys e se tudo correu bem, o diretório do drive corrente será exibido na tela. Prático, não? Como você vê isto abre possibilidades interessantes: elimina erros na entrada de comandos e pode poupar um bocado de digitação. Agora vamos examinar o comando para entender melhor como ele funciona. Mas antes recupere seu prompt tradicional com o comando prompt $p$g.

O comando se inicia pelo prefixo que antecede a todos os comandos do Ansi.Sys: os caracteres ESC e "abre colchete", representados respectivamente por "$e" e "[". E termina com o identificador, "p". Entre eles, os parâmetros. Note que não se usa ponto-e-vírgula para separar o prefixo e o identificador dos parâmetros: a separação somente é necessária entre os parâmetros. Os dois números iniciais (0;68) correspondem ao código da tecla a ser remapeada, no caso F10. Em seguida vem a cadeia de caracteres "DIR", entre aspas e separada dos demais parâmetros com o ponto-e-vírgula (usando esta convenção você pode entrar com qualquer cadeia de caracteres, contendo espaços ou não, inclusive nomes de programas seguidos de seus parâmetros, e transformar suas teclas de função em um menu para carregá-los). Por fim o número 13, que é o código ASCII de CR ("Carriage Return", ou retorno de carro, que corresponde ao ENTER). Repare que ele não é imprescindível: foi usado somente porquê queríamos que o comando DIR fosse imediatamente executado ao teclarmos F10. Se ele não fosse incluído (experimente entrar com a mesma linha de comando sem ele e o ponto-e-vírgula que o antecede) ao teclar F10 simplesmente apareceria DIR em frente ao prompt e você poderia adicionar alguns switches antes de teclar ENTER para executar o comando. Como você vê, remapear teclado com o Ansi.Sys é tarefa muito simples. E, eventualmente, recompensadora.

Até agora estamos usando o comando prompt para enviar comandos Ansi para o console. Que não é a forma mais adequada caso se pretenda remapear todas as teclas de função (inclusive suas combinações com SHIFT, ALT e CONTROL, o que, se você - e não sua máquina - tiver memória para se lembrar das 48 redefinições, é perfeitamente possível).

Evidentemente você poderia encher seu Autoexec.Bat de uma longa lista de prompts terminada com seu prompt habitual e automatizar o procedimento, mas ainda assim não seria a melhor maneira. Há pelo menos duas opções melhores: editar um arquivo de comandos (com extensão .Bat) constituído de uma série de comandos "echo", cada um contendo uma redefinição, e executá-lo, ou editar um arquivo texto no qual cada linha corresponda a um comando e enviá-lo para o console com um comando "type", eventualmente de dentro do Autoexec.Bat. Nas próximas páginas, além da tabela dos códigos das teclas de função, vamos ver um exemplo prático que usa esta última opção. E nessa ocasião veremos também como contornar o problema de introduzir em um arquivo texto o caractere ESC, de código ASCII 27, incluído obrigatoriamente no início de cada comando.

B. Piropo