Não costumo fazer guerra religiosa com sistemas operacionais. Sempre ouço falar das facilidades que certos sistemas operacionais oferecem, e tenho que admitir que o Linux às vezes peca na usabilidade. Mesmo me considerando um usuário de Linux avançado, a instalação e configuração de um modem pode se tornar uma tarefas tortuosa. Mesmo assim, usar uma das principais distribuições Linux, para a grande maioria dos casos é fácil e agradável. Muitas coisas no Linux não são mais difíceis, só diferentes. O problema é que tolerar diferenças nunca foi uma das maiores virtudes naturais dos seres humanos.
Difícil ou fácil, o que faz o Linux assunto obrigatório para um profissional de Informática é tornar possível tarefas muito difíceis. A meu pedido recebo alguns boletos bancários em PDF (para evitar gasto de papel desnecesário), pago-os pelo sítio na Internet do banco que sou cliente. O código do boleto é algo como:
23792.37205 66281.169319 11011.260004 1 00000000000000
Não posso simplesmente copiar do boleto e cola no sítio do banco, por causa dos espaço e ponto. Preciso que quando o código for colado no sítio do banco vá sem pontos nem espaço, como:
23792372056628116931911011260004100000000000000
Em Shell posso fazer: echo ‘23792.37205 66281.169319 11011.260004 1 00000000000000‘ | sed ’s/[\.|[:space:]]//g’
A sintaxe do comando de substituição do sed é: s/RegexProcurada/ValorSubstitutivo/
O /g no final do comando faz com que todas as ocorrências que casam com a regex sejam substituída, não só a primeira. Podemos ler a regex usada como: casa com ponto ou espaço. Percebam que o campo referente ao valor a ser substituído está vázio, i.e. o que casar com o padrão será substituído por nada (vazio). Sobre regex, vale apena ler o Expressões Regulares – Guia de Consulta Rápida do Aurélio Marinho Jargas. Entre outras coisa é bem divertido.
Agora, como gravar na área de transferência, depois ler da área de transferência, modificar o conteúdo e gravar o resultado na área de transferência. É hora do milagre chamado DCOP. Com o uso desse protocolo do KDE podemos executar essa tarefa, através de um comando com o mesmo nome do protocolo. O primeiro passo é criar um script shell com os comandos requeridos.
#!/bin/bash parselessString=`/opt/kde3/bin/dcop klipper klipper getClipboardContents` result=`echo $parselessString | sed 's/[\.|[:space:]]//g'` /opt/kde3/bin/dcop klipper klipper setClipboardContents $result
Na primeira linha salvamos o conteúdo da área de transferência em uma variável chamada parselessString. Na segunda, usamos a variável para que o sed possa agir no conteúdo e guardar o resultado em uma variável chamada result. Na terceira, gravamos o conteúdo de volta à área de transferência.
Se dermos mais uma olhada na primeira linha, podemos ver que através do comando dcop, chamamos do módulos klipper do aplicativo klipper, um método chamado getClipboardContents. Esse método retorna o conteúdo da área de transferência. Para gravar o resultado foi usada uma mecânica similar.
Falta ainda vencer um desafio. Como criar atalhos de teclado que de uma só vez copie o texto selecionado à área de transferência e acione o script. A resposta está nas Ações de entrada do KDE, que podem ser acessadas chamando kcontrol. Em geral podemos chegar até elas via o menu do botão principal, ou digitando kcontrol no console ou no Executar Comando (alt+f2). Uma vez no kcontrol (Configurações Pessoais), vá até Regional & Acessibilidade e depois Ações de Entrada. Basicamente temos que criar uma nova ação, dar um nome para ela, designar seu tipo como genérico, escolher o conjunto de teclas que serão gatinho para ação e finalmente acrescentar as duas ações propriamente ditas, que serão executadas ao pressionar-se as teclas gatilho. O acréscismo das ações propriamente ditas é feito com o botão Novo. Precisamos de uma entrada de teclado (ctrl+c) e uma chamada a comando (executa o script). A entrada de teclado funciona como se o usuário tivesse digitado aquela seqüência de teclas, tendo o mesmo efeito da ação real.
No exemplo que fiz com o atalho win+crtl+c, cópio para área de transfência o texto já modificado e com o crtl+v normal colo o resultado.
