Capítulo 14. Editando

Índice
14.1. Introdução ao vi
14.2. Configurando o vi
14.3. O uso de tags no vi
14.4. Alternativas ao nvi
Bibliografia

Este capítulo descreve o editor padrão do NetBSD, isto é, o editor vi. A primeira parte do capítulo introduz as bases do uso desse editor, enquanto as seções posteriores descrevem-lhe algumas características avançadas, com referência particular à versão do vi instalada com o NetBSD. Quem deseja aprofundar o argumento pode fazer referência à bibliografia no final deste capítulo e também aos links apresentados nas seções seguintes.

14.1. Introdução ao vi

Não há necessidade de apresentação para o editor vi. Desde quando foi desenvolvido por Bill Joy, na Universidade da Califórnia de Berkeley, tornou-se o editor padrão de quase todas as versões do Unix; o companheiro e amigo fiel dos administradores de sistema, assim como o bicho-papão de quase todos os principiantes.

Vale, pois, a pena dedicar algumas palavras ao uso desse editor, até porque ao final da instalação do NetBSD é o único disponível no sistema (exceção feita ao ed) e é, portanto, o instrumento que deverá ser utilizado para a configuração inicial do próprio sistema. Em um segundo momento, naturalmente, cada um estará livre para instalar o editor que preferir e conhecer melhor, escolhendo na nutrida série dos integrantes da coleção de pacotes (ver o Capítulo 8).

Esta seção contém uma introdução ao uso do vi, que deveria ser suficiente para permitir a um principiante criar e modificar os arquivos de texto. Apenas as características básicas e alguns dos comandos de uso mais comum são descritos sem nenhuma pretensão de completude. Para um abordagem mais exaustiva remete-se aos documentos descritos na Secção 14.2.2.

Os principiantes não devem cometer o erro de julgar o vi a partir dessas poucas instruções. Usado de modo tão "minimalista", vi é sem dúvida muito incômodo. As suas virtudes podem ser descobertas quando nos apropriamos de todos (!) os seus comandos e as funções avançadas começam a ser usadas. Nesse ponto o vi já não é mais o editor hostil do início, para se tornar um instrumento cômodo, potente e confiável. Este guia foi escrito, inútil dizê-lo, utilizando o editor vi.

14.1.1. Primeiros passos

Para iniciar o vi, executar o comando:

$ vi nomedoarquivo	
onde nomedoarquivo é o nome do arquivo a ser editado (que também pode não existir ainda). Se o nomedoarquivo é omitido, vi começa com um arquivo inicialmente vazio (e ainda sem nome. Será necessário dar-lhe um no momento de salvá-lo). Neste exemplo suponhamos a criação de um arquivo novo:
$ vi meuarquivo	
onde meuarquivo é o nome de um arquivo que não existe no diretório corrente.

Uma vez inicializado o vi, a tela mostra uma coluna de acentos til à esquerda e, na última linha, o nome do arquivo junto a algumas informações de significado evidente. Algo desse tipo (mas com mais linhas):

~
~
~
~
~
~
meuarquivo: new file: line 1	
Os acentos til no início da linha indicam que a linha em questão está vazia, isto é, que a linha não contém texto. Uma vez que o arquivo carregado (meuarquivo) não existia, todas as linhas sobre a tela do vi estarão vazias.

Nesse ponto a pressão da maior parte das teclas provoca um sinal acústico ou a visualização de uma mensagem de erro (tente-se, por exemplo, pressionar o j ou o k). Isso é devido ao fato de que o vi é um editor modal e, portanto, as teclas pressionadas têm um efeito diferente de acordo com o "modo" em que se encontra o editor. Na inicialização o vi encontra-se sempre em modo de comando e todas as teclas pressionadas são interpretadas como comandos para o editor ao invés de texto para inserir no arquivo. Portanto, pressionando j o vi não insere um "j" no arquivo, mas procura executar o comando j que, como será visto em breve, significa "desloca o cursor para a próxima linha". Como a arquivo ainda está vazio, não há nenhuma linha seguinte para se deslocar o cursor e será assinalado um erro.

Alguns dos comandos do vi permitem passar do modo de comando para o modo de inserção. Uma vez que se entre nesse modo, tudo o que se escreve é interpretado como texto a ser inserido no arquivo. Vejamos agora um exemplo.

Pressionar i para passar ao modo de inserção e digitar as seguintes linhas de texto (terminar cada linha com Enter):

Primeira linha do texto inserido,
segunda linha do texto inserido,
terceira e última linha do texto inserido.	
ao término da inserção pressionar ESC para voltar ao modo de comando.

Neste exemplo vimos como passar do modo de comando para o modo de inserção pressionando i; como inserir algumas linhas de texto, terminando cada linha com um Enter; e como voltar, por fim, ao modo de comando pressionando ESC. Agora que o arquivo contém um pouco de texto, alguns comandos podem ser experimentados. Os primeiros que veremos são os que permitem o deslocamento no interior do arquivo.

14.1.2. Comandos para deslocar-se no arquivo

Quando nos encontramos em modo de comando, alguns comandos permitem-nos o deslocamento no interior de um arquivo (ou seja, de modificar a posição do cursor). A lista seguinte mostra os principais comandos de deslocamento.

h       cursor à esquerda       (seta para  esquerda)
j       cursor para baixo       (seta para baixo) 
k       cursor para cima        (seta para cima)
l       cursor à direita        (seta para a direita) 
^F      página seguinte         (PgDn)    
^B      página anterior         (PgUp)   
0       cursor no início da linha   
$       cursor no fim da linha
b       palavra anterior
w       palavra seguinte
Enter   primeiro caracter da linha seguinte   (espaços excluídos)
+       primeiro caracter da linha seguinte   (espaços excluídos) 
-       primeiro caracter da linha anterior   (espaços excluídos) 	
(o símbolo ^ indica o pressionamento da tecla Control em conjunto com a tecla que representa a letra que segue. Portanto, ^F significa Control+F). De acordo com a configuração do terminal também é possível que o editor consiga utilizar as teclas de setas e as tecla PgUp e PgDn.

Note-se que, como já foi dito, essas teclas servem para se deslocar quando nos encontramos em modo de comando. Se pressionadas em modo de inserção, contudo, causam a inserção do texto no interior do arquivo (isto é, pressionando h o caracter 'h' é inserido no arquivo). Observemos assim um primeiro fato: em modo de inserção pode-se apenas inserir texto seqüencialmente. Para que se possa deslocar no interior do arquivo é necessário sair do modo de inserção (com ESC), retornando ao modo de comando. Esta é uma das conseqüências do fato de que o vi é um editor modal.

Em modo de comando é possível deslocar-se no arquivo até mesmo especificando o número da linha para a qual queremos ir. Por exemplo:

12G     vai para a linha 12	
O comando G sem prefixo numérico leva o cursor ao fim do arquivo.

Prefixos numéricos: muitos comandos do vi aceitam um prefixo numérico que lhes modifica a interpretação por parte o editor. Mesmo se o uso do prefixo numérico não é descrito aqui, mencionamos alguns exemplos para dar uma idéia dos possíveis usos.

9k      cursor 9 linhas para cima
12dd    deleta doze linhas
3w      cursor à frente de três palavras
5x      delete 5 caracteres	  

Nesta seção descrevem-se alguns dos principais comandos de deslocamento, que podem ser experimentados nas linhas de um texto já inserido. O editor vi dispõe de muitas outras funções sofisticadas para deslocar-se no interior do arquivo. Estas, contudo, não são descritas nesse breve tutorial.

14.1.3. Comandos para mudar o modo

No exemplo inicial já vimos que para passar do modo de inserção para o modo de comando é necessário pressionar a tecla ESC. Se pressionamos a tecla Esc quando o vi já está em modo de comando, o editor emite um sinal acústico inócuo e, portanto, se não nos recordamos qual é o modo corrente, sempre se pode pressionar ESC, com a garantia de se confirmar no modo de comando.

Se ESC é o único método para voltar para o modo de comando, os comandos que permitem entrar em modo de inserção são muitos. Segundo o comando escolhido, o efeito será diferente, como se pode observar da seguinte tabela.

i       insere texto antes do cursor
a       insere texto depois do cursor
A       insere texto no fim da linha
I       insere texto no início da linha
o       abre uma linha vazia depois da linha corrente
O       abre uma linha vazia antes da linha corrente	
A presença de numerosos comandos que fazem coisas similares é uma constante do editor vi. O efeito é o de se ter muitos modos para fazer a mesma coisa e, portanto, muitas possíveis soluções. Um expert em vi geralmente consegue encontrar a solução que lhe permite levar a cabo a função desejada com o menor número possível de comandos. Por exemplo, para inserir a palavra "fim" no fim da linha podem-se utilizar as duas seguintes seqüências equivalentes:
$afimESC
AfimESC	
na primeira, vamos para o fim da linha com o comando $, depois se passa ao modo de inserção com o comando a, acrescenta-se a palavra "fim" e se retorna ao modo de comando com a pressão da tecla ESC. Na segunda seqüência, o comando A combina as funções de $ e de a em uma só tecla.

14.2. Configurando o vi

O editor padrão de que o NetBSD é dotado é, como já foi dito, o vi. Se você não utiliza o vi, esta seção não lhe interessa. Caso contrário, leia-a antes de correr para instalar o vim ou o elvis. O vi do NetBSD é, de fato, o nvi, uma versão histórica do vi com muitas extensões poderosas escrita por Keith Bostic da Universidade da Califórnia de Berkeley nos primeiros anos 90, para ter uma versão livremente redistribuível do vi e tornada, em seguida, a versão oficial do BSD.

Entre as extensões mais interessantes encontramos

14.3. O uso de tags no vi

Este tópico não é estritamente ligado ao NetBSD mas, já que estamos aqui, merece um pequeno aprofundamento; pode ser cômodo para examinar, por exemplo, o código-fonte do kernel ou de um programa complexo, composto de vários diretórios.

Os tags são uma daquelas características que tornam o vi um potente instrumento de edição para programadores. Trata-se, em substância, de um arquivo que contém uma lista de nomes de procedimentos, macros, etc., presentes nas fontes de um programa. Quando se editam as fontes, graças aos tags é possível saltar de um ponto em que uma função é chamada para o ponto em que a própria função é definida. Por exemplo, suponhamos examinar um código-fonte com as seguintes linhas:

for (i = 0; i < len; i++)
	        funcXY(i);      
posicionando o cursor sobre a primeira letra de "funcXY" e pressionando ^] (Control+]), o vi abre automaticamente a fonte em que está presente a definição de funcXY e se posiciona sobre a própria função.
void
	funcXY(i)
	        int i;
	{
		funcZ();
	        ...      
Uma vez examinada/modificada funcXY, pressionando-se ^T (Control+T) retorna-se ao arquivo e à posição inicial (aquela do ciclo for). Note-se que estes "saltos" podem ser aninhados. Se com ^] saltamos à função funcXY, e depois com mais um ^] salta-se à função funcZ, com dois ^T retornamos ao arquivo e à posição inicial.

Para se obter o resultado descrito no parágrafo anterior é necessário que o vi encontre um arquivo (geralmente) chamado tags no diretório corrente ou em uma posição especificada por nós com o comando :set tags=/percurso/nomedoarquivo (este comando também se pode inserir no arquivo .exrc). Tal arquivo, que é um arquivo de texto, é gerado pelo programa ctags. Por exemplo, o comando:

$ ctags *.c *.h      
gera o arquivo tags no diretório corrente. Quando o vi é aberto, o arquivo ./tags é encontrado automaticamente.

Quando examinamos as fontes que se encontram em uma hierarquia de diretórios e subdiretórios, podem-se igualmente gerar e utilizar os tags do vi. O processo é o seguinte.

  1. Deslocamo-nos para o diretório de base das fontes com o comando

    $ cd /percurso	  

  2. Constrói-se o arquivo dos tags em duas passagens: primeiro cria-se uma lista dos arquivos-fonte a examinar e depois se a submete ao programa ctags para criar o arquivo tags.

    $ find . -name "*.[ch]" > filelist
    $ ctags -L filelist
              

  3. Em ./.exrc insere-se a linha

    set tags=/percurso/tags          
    substituindo o percurso apropriado no lugar de "percurso".

14.4. Alternativas ao nvi

O nvi é a versão do vi nativa do NetBSD, mas não é a única existente. Desde logo, é uma das mais próximas do espírito da versão original do programa e, portanto, se você é um purista, não quererá usar outro, como de resto fazem muitos dos próprios desenvolvedores do NetBSD. Todavia, existem muitos "clones" desse programa, alguns dos quais muito difundidos e apreciados. Portanto, para quem se dá bem trabalhando com o vi mas procura "algo mais", há uma ampla gama de escolhas. Para uma panorâmica completa os sites "The VI pages" (http://www.math.fu-berlin.de/~guckes/vi) e "Vi Lovers Home Page" (http://www.thomer.com/thomer/vi/vi.html) são o melhor ponto de partida. Além da descrição e dos links para todos os clones existentes do vi, há links para tutoriais e informações variadas.

Para começar a se desvencilhar da selva de programas aconselho dar uma olhada no vim e no vile. Trata-se de duas versões "turbinadas" do vi, a que foram adicionados muitos comandos, suporte para mouse (nas versões X), evidenciação da sintaxe dos arquivos fonte com cores diversas, possibilidade de se deslocar dentro de um arquivo mesmo quando se está no modo de inserção e muitas, mas muitas mesmo, outras funcionalidades. A filosofia dos dois programas, ambos ótimos e merecedores de serem experimentados, é diferenciada. O vile, em particular, é programável, sendo dotado de uma verdadeira macro-linguagem que permite definir processos e atribuí-los às teclas. Agradará, portanto, aos amantes da personalização extrema. O vim, por sua vez, é talvez o clone mais difundido e amado, dotado de um riquíssimo (até excessivo) sortimento de novos comandos, muitos dos quais estudados especificamente para os programadores.

Bibliografia

[LambRobbins] Linda Lamb e Arnold Robbins, O'Reilly & Associates, 1-56592-426-6, Learning the vi Editor, 6th Edition.

[Robbins] Arnold Robbins, O'Reilly & Associates, 1-56592-497-5, vi Editor Pocket Reference.