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.
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.
Para iniciar o vi, executar o comando:
$ vi nomedoarquivoonde 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 meuarquivoonde 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 1Os 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.
Nota: o texto inserido pertence logicamente ao arquivo meuarquivo (o nome transmitido como parâmetro ao editor) mas, nesse momento, reside somente na memória do editor porque ainda não foi salvo em um arquivo. Todas as operações efetuadas no texto (acréscimos, modificações, etc.) não são salvas no disco enquanto o usuário não o exige explicitamente com um comando de salvamento do arquivo. Portanto é sempre possível abandonar as modificações saindo do editor sem salvar, ficando a cópia do arquivo invariada. Os comandos para salvar/abandonar/sair são descritos na Secção 14.1.9.
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 12O 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.
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 correnteA 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 AfimESCna 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.
A tabela seguinte reúne alguns comandos para a deleção de texto.
dd apaga a linha corrente x apaga o caracter sob o cursor X apaga o caracter antes do cursor dw apaga até o fim da palavra D apaga do cursor até o fim da linhatambém estes comandos só podem ser dados em modo de comando, e não em modo de inserção. Daqui para a frente não será mais indicado o fato de que os comandos operam em modo de comando, uma vez que isso já deve ter ficado evidente. Quando forem descritas algumas funções que podemos acionar no modo de inserção, este fato será indicado explicitamente.
Vejamos agora um exemplo prático que retoma o uso de alguns dos comandos apresentados nas seções precedentes. Suponhamos que o arquivo em curso de edição seja composto das três linhas inseridas no exemplo inicial e que se queira transformar a terceira linha do seguinte modo:
terceira linha de texto iserida no arquivo.Como primeira operação cancelamos da última linha as palavras "e última" e depois inserimos o novo texto "inserida no arquivo" ao fim da linha, antes do ponto.
Suponhamos que o cursor encontre-se sobre a primeira linha (se assim não for, deslocar-se para a primeira linha com o comando 1G). Para ir da primeira para a terceira linha, pode-se usar uma das seqüências seguintes (mas ainda existem muitas outras):
<Enter><Enter> jj 3G /terceira/<Enter>
Uma vez chegados ao início da terceira linha, postamo-nos sobre a primeira das duas palavras a apagar com
wEnfim as duas palavras são apagadas com:
dwdw
Nota: recordando tudo o que foi acenado sobre prefixos numéricos, pode-se intuir que os dois comandos dw recém executados podem ser substituídos por um único comando 2dw, que apaga duas palavras de um só golpe; ou ainda, o que pode parecer surpreendente, por d2w
Para adicionar o novo texto vamos para o fim da linha com o comando $, entra-se em modo de inserção com o comando i e depois se escreve:
inserida no arquivoPressionando ESC retorna-se ao modo de comando.
Para procurar uma expressão dentro do arquivo corrente usam-se os seguintes comandos:
/expressão/ ?expressão?o primeiro comando (seguido de Enter) procura a expressão no arquivo andando para a frente, ou seja, na direção do fim do arquivo a partir da posição do cursor. O segundo comando (também esse seguido de Enter) procura a expressão andando para trás, ou seja, na direção do início do arquivo.
Por exemplo, retornando às três linhas inseridas inicialmente, experimente-se dar os seguintes comandos:
1G/última/e teclar Enter. O comando 1G faz o cursor deslocar-se sobre a primeira linha do arquivo (note-se que não é feito o eco do comando). A seqüência /última (que é vista na última linha da tela) seguida do Enter deflagra a busca da expressão "última" dentro do texto e o deslocamento do cursor para a linha correspondente.
Nota: os comandos de busca constituem assim um método a mais de deslocamento dentro do arquivo, que tem em vista o próprio conteúdo do arquivo.
Para repetir a última busca efetuada sem que seja preciso reescrever, podem-se usar os comandos
n repete a busca na mesma direção N repete a busca na direção oposta
Alguns comandos, geralmente obtidos com a tecla Control, estão disponíveis mesmo quando se está inserindo um texto.
^H apaga o caracter à esquerda do cursor BS apaga o caracter à esquerda do cursor ^W apaga a palavra precedente ^U apaga até o início da linha ESC volta para o modo de comando
Se, uma vez retornados ao modo de comando constatamos ter cometido um erro, é possível utilizar o comando undo (a tecla u) para anular o último comando executado.
Os principais comandos para encerrar o trabalho e sair do vi ou simplesmente para salvar e continuar trabalhando são:
:w salva o arquivo (sem sair) :q sai :wq salva o arquivo e sai :q! sai sem salvar (as modificação são perdidas) :w abc salva o arquivo dando-lhe 0 nome 'abc'Para mudar o nome do arquivo corrente (ou para dar-lhe um se ainda não tem):
:file nomedoarquivo
Os comandos descritos nesta seção exemplificam uma ulterior modalidade de funcionamento do vi, o modo ex, que nesta breve introdução não será descrito. O editor vi nasce de fato da combinação de dois editores distintos, dos quais um (precisamente o vi) serve de interface full screen para o outro (o ex), que fornece as funções básicas de edição. O ex pode ser considerado uma versão evoluída do ed.
Como já foi acenado na introdução, nesta seção foram descritos apenas os comandos mais elementares do editor vi, para que se possam editar arquivos do NetBSD ao término da instalação. Para poder usar esse editor de modo produtivo (e cômodo), é necessário aprofundar o conhecimento dos comandos lendo, por exemplo, os documentos citados na Secção 14.2.2.
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
Expressões regulares estendidas (habilitadas com a opção extended).
Tag stacks.
Undo infinito (ativado de modo um pouco curioso: no primeiro undo pressiona-se o u. Os undo sucessivos são obtidos pressionando-se o caracter ponto (.)).
Busca ampliada (habilitada com a opção searchincr).
Rolagem das linhas (habilitada pela opção leftright. O número das colunas é definido por sidescroll).
Histórico da linha de comando (controlado pela opção cedit).
Completamento da linha de comando (controlado pela opção filec).
Telas que podem ser postas em primeiro plano ou em plano de fundo.
Tela dividida (split screen).
No exemplo seguinte vejamos algunas comandos de configuração que simplificam um pouco a nossa vida.
set showmode ruler set filec=^[ set cedit=^[
A primeira linha habilita a visualização da posição do cursor (linha e coluna) e do modo corrente (Command, Insert, Append) sobre a linha de status. A segunda linha (^[ é o caracter ESC) habilita o completamento dos nomes dos arquivos e a terceira a history da linha de comando. Ambas utilizarão o comando ESC. Por exemplo, escrevendo ':' e depois pressionando-se ESC, abre-se uma janela com a lista dos comandos anteriores. A relação pode ser modificada como se fosse um arquivo. Quando se pressiona Enter sobre uma linha o comando correspondente é executado.
No tarball do código-fonte (src.tgz) está contida uma notável quantidade de documentação original do vi/nvi. Ela se encontra em /usr/src/usr.bin/vi/docs. Em particular podemos encontrar:
Edit: A tutorial
Ex Reference Manual
Página de manual do vi
An Introduction to Display Editing with Vi de William Joy e Mark Horton
Ex/Vi Reference Manual de Keith Bostic, o manual de referência do nvi, que descreve em detalhe todos os comandos do editor.
Vi Command & Function Reference
Vi tutorial (iniciante e avançado)
Quem deseja aprender a usar o vi deve começar lendo An Introduction to Display Editing with Vi de William Joy e Mark Horton, para depois passar a Ex/Vi Reference Manual de Keith Bostic.
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 *.hgera 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.
Deslocamo-nos para o diretório de base das fontes com o comando
$ cd /percurso
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
Em ./.exrc insere-se a linha
set tags=/percurso/tagssubstituindo o percurso apropriado no lugar de "percurso".
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.