2008-05-08

O ex por trás do vi

Nesses últimos dias estou tentando melhorar meu relacionamento com o vi(m) e esse esforço tem rendido algumas descobertas interessantes.

A primeira delas é que o vi é, na verdade, uma interface visual (Visual Interface) do editor ex (EXtended), um editor de linha, por sua vez descendente do ed. Esclarecidas as questões hierarquicas e genealógicas, cabe perguntar: o que vem a ser um editor de linha?

Diz a lenda que, nos tempos idos da informática, os teletipos (TeleTYpewriter, TeleTYpe ou TTY - qualquer semelhança com seu console não é mera coincidência) eram a única interface de saída para o usuário. Agora imagine, da frente do seu monitor de LCD de um zilhão de pixeis e cores, como era complicado editar texto usando somente um teclado e uma impressora! Sem a possibilidade de movimentar um cursor pelo papel, a edição era feita linha a linha, com comandos para imprimir, incluir, alterar e apagar linhas.

Ainda hoje, alguns dos comandos que usamos no vi, aqueles iniciados com ":", são, na verdade, comando do ex. Uma vez no modo de comando do vi (ESC), pode-se acessar o prompt do ex usando a telca Q (maiúsculo). Para voltar ao vi, basta digitar vi no prompt do ex.

O ex dispõe de muitos recursos avançados, um deles é a possibilidade de especificar intervalos de linhas para restringir comandos. Por exemplo, para mostrarmos na tela as linha de 1 até 5 usamos:

:1,5p

Onde 1,5 é o intervalo e p é o comando imprimir. Os dois pontos são o prompt do ex. Também podemos usar $ para denotar a última linha e % para todas as linhas.

Um dos comandos realmente úteis do ex é o s, para procura e substituição. Suponhamos que eu esteja editando um arquivo HTML e deseje colocar todas as ocorrências da palavra linux em itálico, posso usar o seguinte:

:%s/linux/<i>&<\/i>/g

Onde % significa que o comando seguinte irá atuar em todas as linhas do arquivo aberto, s é o comando de substituição, e as barras separam os argumentos desse comando. O primeiro argumento, linux, é o que deve ser encontrado; o segundo argumento especifica pelo que o primeiro deve ser substituído (mais detalhes abaixo); e o terceiro argumento, g, é uma opção que diz para realizar uma substituição global, ou seja, substituir todos as ocorrências encontradas no intervalo especificado, não só a primeira.

O segundo argumento pode parecer complicado, mas não há nada de mais. O símbolo & significa o texto encontrado, no caso linux, e a sequência \/ serve apenas para que a barra do tag não seja interpretada como separador de argumentos.

Um dia eu ainda tento usar o emacs...

Nenhum comentário: