Anda di halaman 1dari 20

Lição 5 - Acesso ao texto: Buscando ocorrências

Os comandos de busca e de substituição são possivelmente os mais difíceis e elaborados do Vim. Suas combinações sintáticas são
extensas e com eles encontramos todo tipo de strings e pedaços de texto. A versatilidade, assim como a complexidade, devem-se ao
uso que se pode fazer das expressões regulares, ou seja, dos padrões de texto que usamos para encontrar o exato trecho de texto que
procuramos.
Não será apresentada nesta página a utilização dos comandos de substituição, pois esta lição se destina à operacionalidade de leitura,
consulta e análise no Vim, e não da edição. Naturalmente, também não especificarei todos os parâmetros ou opções possíveis que
podemos passar às buscas, visto que existe uma infinidade deles. Aconselho que os interessados e necessitados busquem por conta
própria os recursos de que precisam no manual de ajuda do Vim digitando ' :help :/ '. Aprenderemos aqui os comandos de busca mais
básicos e importantes.
Como alguns devem saber, a barra ' / ' é um comando de busca convencionado em silêncio entre os criadores de software para Linux.
Digite ' / ' em um navegador, em um processador de texto ou em um gerenciador de pacotes e será possível realizar uma busca. No Vim
não é diferente. Em modo Normal ao digitar ' / ' é iniciado um comando de busca em modo linha de comando, ou seja, sujeito às
mesmas regras de operação que os comandos iniciados por ' : '. No Vim, o mesmo comando de busca pode ser realizado no sentido
inverso, ou seja, a partir do cursor e para cima, digitando ' ? ' no lugar de ' / '. Porém, fora os comandos de busca no texto que
suportam a sintaxe para buscarmos todo tipo de ocorrência, serão apresentados primeiramente quatro comandos simples de busca de
caracteres na linha corrente.
Não somente estes quatro comandos de busca de caracteres, mas todas as buscas que são realizadas movem o cursor para a posição da
ocorrência encontrada. Portanto, todos os comandos de busca poderiam ser, em algum sentido, também considerados como comandos
de movimentação do cursor. Ainda que eles possam e até devam ser utilizados com essa finalidade, esta não é a função mais importante
de um comando de busca.
Os quatro comandos que serão apresentados agora procuram um caractere especificado na linha atual do cursor e o move até a
ocorrência. O comando " f 'caractere' " procura a primeira aparição do caractere à frente do cursor na linha atual. Já o comando " F
'caractere' " faz a mesma busca atrás do cursor. Este é movimentado até o caractere encontrado.

Ação: digite " f 'caractere' " para mover o cursor até a primeira ocorrência do caractere especificado encontrada após a posição atual do
cursor!

Ação: digite " F 'caractere' " para mover o cursor até a primeira ocorrência do caractere especificado encontrada antes da posição atual
do cursor!

Os próximos dois comandos buscam caracteres somente após o caractere do cursor na linha atual. Eles se diferenciam, no entanto, por
moverem o cursor para antes ou depois do caractere encontrado. " t 'caractere' " move o cursor até a posição anterior do caractere
especificado encontrado na linha atual à frente do cursor. " T 'caractere' " faz o mesmo, mas posiciona o cursor uma coluna após o
caractere encontrado.

Ação: digite " t 'caractere' " para mover o cursor até a posição imediatamente anterior à primeira ocorrência do caractere especificado
encontrada após a posição atual do cursor!

Ação: digite " T 'caractere' " para mover o cursor até a posição imediatamente posterior à primeira ocorrência do caractere especificado
encontrada após a posição atual do cursor!

Como podemos supor, é possível informar um valor numérico antes de todas estas buscas para encontrar a enésima ocorrência do
caractere especificado. Outros dois comandos que convém explicar são os de repetição de buscas. ' ; ', após a realização de uma busca
com ' f ', ' F ', ' t ' ou ' T ' realiza a última busca novamente e ' , ' da mesma forma a repete, mas no sentido inverso.

Ação: informe um valor numérico antes de um dos comandos de busca de caracteres na linha corrente para encontrar a sua enésima
aparição!

Ação: digite ' ; ' para realizar a última busca novamente e sua movimentação de cursor ao próximo caractere que estiver à frente do
cursor; digite ' , ' para fazer a mesma busca na linha atual para trás do cursor!

Busca simples

As buscas de ocorrências no texto utilizam uma pequena sintaxe necessária para que informemos de forma razoável todas as
especificações das expressões regulares que queremos encontrar. Os comandos básicos começam todos com ' / ' e a mesma busca pode
ser realizada no sentido inverso, ou seja, para cima, iniciando-o com ' ? '. Assim como as

buscas de caracteres na linha atual, podemos repetir a última busca com ' n ' e a mesma busca no sentido inverso com ' N '. Apesar
dessa diferenciação, se sabemos que existe somente uma ocorrência no texto do padrão que procuramos, não vai haver diferença entre
procurá-lo com ' / ' ou com ' ? ', pois o Vim considera para as buscas o início do texto como uma continuação do seu final em uma busca
com ' / ' e o final do texto como uma continuação do início em uma busca com ' ? '. Ou seja, o Vim dá uma volta no texto quando
procura por uma ou mais ocorrências até ter vistoriado todo o texto. Ele avisa quando encontra a primeira aparição após ter dado a
volta, que atingiu o topo ou a base, e prossegue a busca na outra ponta: "search hit BOTTOM, continuing at TOP", no caso do aviso de
que foi realizada uma volta para cima (logo, em uma busca com ' / '); e "search hit TOP, continuing at BOTTOM", quando uma volta para
baixo foi feita durante a busca (neste caso uma busca com ' ? '). Como é razoável pensar, se buscamos algo a partir do meio do texto,
ou seja, com o cursor no meio do texto, seja para cima ou para baixo, o Vim dará uma volta até ler todo o texto em sua procura. Pelo
mesmo motivo, se iniciamos uma busca para baixo ' / ' com o cursor posicionado no primeiro caractere do texto, ou na primeira coluna
da primeira linha do arquivo, o Vim certamente não dará volta alguma, encontrando ou não uma aparição da objeto de busca.
As buscas, em princípio, são case sensitive, ou melhor, são sensíveis ao tipo de 'caixa' dos caracteres, se são caixa baixa ou caixa alta.
Logo, se procurarmos a palavra 'ocorrência', a busca não encontra a palavra "Ocorrência" ou mesmo "ocoRRência". Por outro lado, a
busca simples reconhece strings que sejam, ao nossos olhos, somente parte de outra. Logo, se buscarmos "ência", encontramos o
trecho "ência" de "ocorrência" (assim como em "Ocorrência" e em "ocoRRência"). Essa característica da busca é muito natural, visto que
os espaços e outras unidades invisíveis que identificamos entre as palavras são igualmente caracteres do ponto de vista do editor. Esta
é, aliás, a mesma característica que nos permite procurar as ocorrências de uma letra dentro das palvras de uma linha, por exemplo.
O comando de busca de string mais simples possível tem a forma ' /<texto>'. Experimente.

Ação: digite '/<texto>' para encontrar a primeira ocorrência da string "texto" na linha após o cursor!

Busca completa

Introdução às expressões regulares

A princípio, o sistema de busca simples satisfaz àqueles que procuram uma string em um texto redigido. Na verdade, em geral os
processadores de texto e até os editores oferecem somente ferramentas de busca padrão, visto terem em mente usuários que editam e
consultam textos como redações e livros. Naturalmente as ferramentas do Vim são altamente capazes de atender aquelas pessoas que
pretendem escrever também cartas, artigos e etc. O Vim, no entanto, é um editor especialmente desenhado para a edição de códigos,
de textos técnicos e de arquivos de configuração. Nestes arquivos só procurar por uma expressão pode ser obviamente inútil, visto que
muitas vezes existem palavras e strings que se repetem, como, por exemplo, em valores de colunas. Nestes casos não nos é suficiente
buscar por uma ocorrência mesmo com a definição de valores numéricos para a busca. Precisamos, muitas vezes, procurar por uma
mesma expressão repetida, mas que é cercada por características que a distingue, como sua posição na linha e os tipos, tamanhos e
quantidade de caracteres que a antecedem ou que a sucedem, por exemplo. Ou outras muitas vezes precisamos visualizar todas as
expressão que não compartilham nenhum caractere idêntico, mas somente caracteres que possuam alguma espécie de familiaridade
que definimos. Este uso, podemos dizer, é uma terceira função de acesso ao texto de que podemos usufruir com os recursos da ação de
busca.
O primeiro uso possível de uma busca é a simples movimentação do cursor. Podemos fazer uma busca não para "descobrir" uma
ocorrência, mas simplesmente para movermos o cursor rapidamente para ela, como é usualmente o uso de buscas em linha.
O segundo uso que podemos dar à busca é a típica procura por uma determinada aparição de expressão, caractere, frase ou string
perdida. Normalmente é um uso precioso no caso de precisarmos encontrar uma ou mais ocorrências em um texto muito grande ou
mesmo ocorrências complexas em um texto confuso ou de leitura difícil.
A terceira utilidade que podemos dar à ferramenta de busca, considerando que ela seja suficientemente elaborada, é a procura por e/ou
a seleção (colorir, marcar) de uma ou de mais expressões específicas entre as várias que muitas vezes são até obviamente visíveis, que
possuam características singulares que as diferenciam. Este é o uso que fazemos da busca quando queremos selecionar todas as
palavras da primeira coluna de uma tabela e ignorar todas as palavras de todas as outras colunas por exemplo, não importando os
caracteres das expressões elas mesmas. Também a usamos quando precisamos de encontrar entre várias frases idênticas, as únicas que
precedem um ponto final seguido de uma letra maiúscula qualquer - observe que se fosse uma letra maiúscula específica, seria possível
incluí-la na string de busca!
Todos esses recursos que completam a ferramenta de busca do Vim são realizados através da inclusão das chamadas expressões
regulares no comando de busca. Porém se vamos incluir caracteres dentro do comando de busca que não deverão ser interpretados
como sendo literais, mas sim como de controle, certamente teremos de respeitar uma sintaxe que permite o Vim entender o comando.
Os comandos de busca possuem uma sintaxe não somente elaborada, mas especial se comparada à dos outros comandos do Vim em
geral. Além do verbo de busca, do objeto procurado e do seu valor numérico, existe um outro parâmetro que determina a realização da
ação de busca. O Vim precisa saber em que região do texto a busca será realizada. Em uma busca precisamos dizer onde pretendemos
procurar a ocorrência. Esta região pode ser especificada de diversas maneiras inteligentes, mas caso nenhuma região seja informada,
assume-se por padrão que se procura o objeto da busca na linha em que o cursor se encontra atualmente. Como informá-lo sobre a
região da busca? Devemos especificar um trecho do texto apontando para objetos que marcam seu início e seu fim. Ou seja, selecionar
a região apontando os seus objetos limites. Este é o formato típico do parâmetro região dos comandos de busca, mas podemos também
informar um parâmetro simples, com apenas um valor, para apontar a regiões descritíveis com um só objeto em casos especiais como
no caso do objeto ser o texto todo, representado pelo caractere ' % '.
Este parâmetro de região de texto somente se mostra necessário nos usos da busca aliados à ferramenta de substituição de ocorrências,
que veremos quando estudarmos a lição de texto, na segunda parte do curso. A sintaxe dessa ferramenta de substituição de texto
respeita a sintaxe de busca simples e completa, sendo aquela somente um apêndice a esta. Deve-se, portanto, atentar ao máximo à
sintaxe das buscas, que provavelmente é uma das ferramentas mais difíceis do Vim.

Como foi dito, certamente vai haver caracteres que não serão interpretados literalmente - metacaracteres - se quisermos especificar
características gerais a partir de dentro do comando de busca. Esses caracteres de controle podem especificar uma busca por
ocorrências de expressões que estejam no início da linha ou no final, expressões com caracteres únicos e quaisquer indeterminados,
expressões ou parte de expressões que estejam especificamente no início ou no final de outras palavras, ou até strings cujos caracteres
sejam quaisquer dentro de um conjunto de caracteres de determinado tipo. Existem ferramentas também para o armazenamento dos
padrões encontrados em buffers e ferramentas para a repetição da última especificação de expressão regular em uma nova busca.
Provavelmente a função mais básica de todas as expressões regulares seja a representação de um caractere qualquer. Como o asterisco
em sistemas Unix e sistemas baseados no DOS ( como o FreeDOS) o símbolo ' . ' representa a aparição de um caractere único qualquer,
simples assim. Um comando de busca completo que utilize ' . ' em uma sintaxe simples tem o formato " /(s).(s) ". Foi escrito assim pois
o símbolo ' . ' pode ou não aparecer junto de uma string, o que foi indicado com os parênteses, que indicam um uso optativo. Façam
seus testes!

Ação: digitem /(c).(c) para buscar por uma ocorrência qualquer de um único caractere em uma determinada posição da string dada!

Entretanto, construir um comando do tipo " /. " resulta na busca por qualquer caractere possível, ou seja, encontraríamos todos os
caracteres e o cursor andaria, em um texto normal, praticamente casa por casa. Vale notar que os caracteres invisíveis ou fantasmas,
espaços, tabulações, retornos de linha e outros não são possibilidades do símbolo ' . ', o que pode tornar o comando citado acima útil no
caso de querermos manipular ou consultar um texto com raros caracteres vísiveis distribuídos em um vazio amplo e aleatório de
caracteres fantasmas. Imagine buscar a olho nu todas as ocorrências de "x" que se siga a uma string qualquer (que neste caso são
sempre valores binários) em um arquivo texto em proporções gigantescas de dezenas ou centenas de linhas como o do exemplo abaixo:
_________________________
x 1110zy x
e x x 2sd
1 x web ge
01100 p
5y x 01010
001x 011 x
3 73 x x
11 x 10101 2f
x 1010x
:%s/M$/#2&!%@arg/g
0101 010 0001
e e9 x x x
1011100 x 6.4vim
0111 x 10101x
2e1001x 10100011
A2F0 x x x
_________________________

Seria possível achar aqui o que precisamos com um padrão de busca que utilize o símbolo ' . ' com o comando " /.x " . Porém essa é
uma de algumas possíveis soluções ao nosso problema. Nosso senso e capacidade de solução se aperfeiçoará na medida em que
aprendermos a montar mais expressões regulares.

Mas e se eu quiser buscar as ocorrências do ponto final? O Vim procurará por qualquer caractere? Como o símbolo ' . ' é por padrão
interpretado como um metacaractere, caso queiramos procurar pelo caractere ponto ele mesmo devemos inserir o símbolo que indica
literalidade ' \ ' antes do nosso metacaractere a ser interpretado literalmente. Ou seja, se quisermos procurar pela string "fim." devemos
digitar "/fim\.", pois se digitarmos "/fim." vamos encontrar além da string que procurávamos expressões como "fim!" ou "fim?",o seja ,
"fim" com qualquer caractere em seguida.

Alternativamente a construir uma busca para cada padrão que procuramos, o que daria bastante trabalho se precisarmos fazer de forma
intercalada e mais de uma vez em buscas complexas, podemos construir um comando de busca duplo. Nele informamos mais de um
padrão que queremos encontrar, e buscaremos as aparições de cada expressão indicada, ou seja, o comando encontrará na ordem do
texto cada ocorrência de cada padrão indicado. O símbolo responsável por essa estrutura é o pipe: ' | '. Como queremos que seja
interpretado como um meta-caractere e por padrão não era para o ser, devemos antecedê-lo com a barra invertida, ou seja,
acompanhá-lo desta forma '\|'. Logo, um comando desses teria o formato " / s1 \| s2 ". Ou seja, procure pela string um e pela string
dois. Se quisermos procurar por mais de dois padrões simplesmente concatenamos as expressões com o símbolo ' \| ', como em " / s1
\| s2 \| s3 \| s4 ".

Ação: digite / s1 \| s2 \| s3 \| s4 para buscar as ocorrências de todas as strings informadas!

Observem o conteúdo de um texto como este:

txt txt txt txt


txt txt txt txt
txt txt txt txt
txt txt txt txt

Muitas vezes existem strings repetidas que impedem que encontremos e selecionemos o que precisamos com os recursos de uma busca
simples. Pode ser o caso de precisarmos, por exemplo, de selecionar especificamente as strings repetidas que finalizam as linhas, o que
na tabela equivale a todas as quatro últimas expressãos "txt":

txt txt txt txt


txt txt txt txt
txt txt txt txt
txt txt txt txt

Podemos precisar também, por exemplo, encontrar em um texto somente as letras maiúsculas que iniciem linhas novas, ou
exclusivamente pontos finais que as finalizem. Para satisfazer este tipo de necessidade utilizamos dois símbolos que indicam a
regularidade de iniciar ou de terminar linhas procurada nas expressões. Inserir ' ^ ' imediatamente antes da string, ou seja, no início do
comando, indica ao Vim uma busca por uma expressão que deve estar no início de uma ou de mais linhas; por outro lado, se digitarmos
imediatamente após a string procurada o símbolo ' $ ', encontramos somente as ocorrências da string estipulada que estejam no final
das linhas.
Voltando ao nosso exemplo, o comando " /txt$ " resolve o nosso primeiro problema, das palavras da última coluna, enquanto " /^txt "
resolveria o problema de termos de selecionar exclusivamente as palavras da primeira coluna. Façam seus testes!

Ação: digitem /^s para procurar as ocorrências da string ' s ' que estejam exatamente em inícios de linha!

Ação: digitem /s$ para procurar as ocorrências da string ' s ' que estejam exatamente em finais de linha!

Como podemos imaginar, se quisermos buscar os próprios símbolos literais ' ^ ' ou ' $ ' basta digitarmos " \^ " ou " \$ ". No entanto,
note que estes são símbolos só são interpretados como meta-caracteres se estiverem em posições em que eles fariam sentido como
metacaracteres! Ou seja, se buscamos pela string " R$ 1,00 ", não precisamos incluir a barra invertida no comando de busca. Mas se
procuramos exclusivamente as strings" M$ " na linha " M$? Eu não apoio a M$ ", temos de informar que o cifrão deve ser lido
literalmente, com " /M\$ ", caso contrário a busca encontrará não apenas o último " M$ ", mas assim como o final de outras linhas que
terminem com " M ". E se quiséssemos encontrar somente a última aparição de " M$ " na linha exemplificada? Agora teríamos que
buscar assim: " /M\$$ ". E, por fim, para buscar somente a primeira aparição, escreveríamos " /^M\$ ", a não ser caso terminemos o
comando com outro caractere literal, como seria em "/R$ 1,00", que se buscado no início de linha seria "/^R$ 1,00" e, no final, "/R$
1,00$". As mesmas regras valem para o símbolo ' ^ ', mas elas se aplicam para o início do comando construído.

Também pode ser útil buscar somente as ocorrências de um determinado padrão que iniciem ou terminem palavras, em oposição a
linhas. Ou seja, podemos buscar somente as aparições da letra ' o ' que finalizem as palavras. Neste caso o cursor marcaria somente
letras ' o ' como em " subversão ", " anarquismo " e a segunda aparição da letra em " outro ". Para encontrar padrões no início de
palavras usamos o meta-caractere ' < ', e para encontrá-los no final usamos o ' > '. Como estes não são símbolos metacaracteres por
padrão, devemos informar ao Vim inserindo a barra invertida ' \ ' antes deles. Logo, um comando de busca poderia ser " / \ < 123 ",
para encontrar a string ' 123 ' somente nas suas aparições no início de palavras, que poderiam ser, por exemplo, como ' 1234567890 '.
Não encontraríamos o trecho ' 123 ' em uma palavra como ' 0123456789 ', por exemplo. Para encontrar somente os últimos caracteres
de uma palavra que sejam ' 789 ', digitaríamos o comando de busca " / 123 \ > ". Com algum raciocínio vemos que se pode usar esta
ferramenta para encontrar um padrão em suas ocorrências que sempre formem uma palavra separada. Podemos querer encontrar
somente as strings ' ana ', e não ' analógico ' ou mesmo ' Poliana '. Para tanto, podemos escrever " / \ < ana \ > ".
Como podemos imaginar, para procurar por qualquer expressão que contenha os caracteres ' < ' e/ou ' > ' basta incluí-los nas buscas
sem qualquer barra, como na busca " /<Esc> ", que encontrará todas as aparicões de " <Esc> " em quaisquer posições de linha e de
palavra, sendo uma palavra por si só ou não!

Ação: digite / \ < s para encontrar a string em suas ocorrências que iniciem uma palavra!

Ação: digite / s \ > para encontrar a string em suas ocorrências que finalizem uma palavra!

Ação: digite / \ < s \ > para encontrar a string em suas ocorrências que sejam uma palavra!
Aprenderemos agora um conceito muito importante sobre expressões regulares. Ele será chamado de átomo. Existem alguns símbolos
que podem ser incluídos em comandos de busca que só se aplicam e fazem sentido se seguirem um átomo. Átomo é a designação de
um ou mais caracteres que ainda não tenham sido determinados. O átomo leva esse nome pois é uma estrutura que é tratada por
outros símbolos como sendo uma unidade de busca.
Tipicamente, designamos um átomo de busca indicando os possíveis caracteres dentro de colchetes como no comando " / [ c c c c... c ]
" . Um comando com esse formato buscará quaisquer caracteres que estão entre os listados. Podemos também buscar quaisquer
caracteres que não estejam entre os listados com o símbolo ' ^ '.
Repare com atenção que este é o mesmo símbolo que, do lado de fora dos colchetes, se colocado no início do comando, significa a
busca pela expressão dada nos casos em que estejam no início das linhas. Este símbolo se opõem ao ' $ ', quando fora dos colchetes.
Infelizmente, o acento circunflexo quando dentro dos colchetes significam a negação das possibilidades indicadas no átomo. Um
comando do formato " / [ ^ c c c c... c ] " buscará no texto quaisquer caracteres que sejam diferentes das possibilidades indicadas no
átomo de busca. Para ilustrar a confusão um comando do tipo " / ^ [ ^ c c c c... c ] " encontrará quaisquer caracteres que não são
possibilidades da lista e que estejam no início de uma ou mais linhas.

Ação: digite / [ c c ] para buscar as ocorrências de todos os caracteres listados entre os colchetes!

Açãos: digite / [ ^ c c ] para buscar as ocorrências de todos os caracteres que não estão listados entre os colchetes!

Para evitar que tenhamos de digitar muitos caracteres possíveis que componham um átomo podemos listá-los utilizando o símbolo
hífen, ' - '. Ele indica todos os caracteres que estão contidos em um escopo da ordem, por padrão ASCII, de caracteres. Por exemplo, a
construção " [ a - z ] " inclui nas possibilidades de busca todas as letras minúsculas do alfabeto romano, " [ 1 - 5 ] " todos os cinco
números, 1, 2, 3, 4 e 5. Um comando de busca que pretende encontrar todas aparições dos números 1, 2 ou 3 pode ser construído
assim: " / [1 - 3] ". Façam seus experimentos!

Ação: digite / [ c - c ] para buscar as ocorrências de todos os caracteres entre os colchetes que estão listados implicitamente na ordem
de caracteres do escopo indicado pelo símbolo - !

Para elaborar nossa expressão regular, temos a possibilidade de faz algumas referências aos átomos que construímos. Podemos buscar
não somente pelas aparições das possibilidades de um átomo, mas inclusive buscar por nenhuma ou mais aparições consecutivas de
cada possibilidade, ou mesmo buscar por ao menos uma aparição ou mais de um dos caracteres listados.
Determinamos a procura de uma ou mais ocorrências inserindo o símbolo ' \+ ' após o átomo formado. Um comando assim teria o
formato " / [ c ] \ + ". Em geral, para a maioria das finalidades, a diferença entre fazer uma busca por cada aparição singular de um
caractere e fazer uma busca por uma ou mais aparições desse caractere é que ao percorrermos pelas ocorrências encontradas com os
comandos ' n ' ou ' N ' o Vim saltará as aparições consecutivas do caractere buscado.
Determinamos a busca por nenhuma ou mais aparições das possibilidades informadas inserindo o símbolo ' * ' após o átomo de busca.
Um comando desse teria a forma " / [ c ] * ". Ora, mas as buscas em que uso o asterisco encontram todos os caracteres do texto! Ela
não serve pra nada! Mas observe que caso ela encontre aparições consecutivas de um dos caracteres que estava a procurar seu
comportamento será como o da busca por uma ou mais ocorrências: saltará o conjunto de ocorrências seguidas. Imagine um texto em
que a maioria dos caracteres sejam repetidos, e que buscamos justamente pelas diferenças! Além do mais, caso formemos no comando
de busca uma expressão regular complexa, ou seja, que forme um padrão muito exigente, a presença do asterisco será de uma
aplicação eventual, que só será testada caso outros requisitos da expressão também sejam satisfeitos.

Ação: digite / [ c ] \ + para buscar por uma ou mais aparições das possibilidades entre colchetes!

Ação: digite / [ c ] * para buscar por nenhuma das possibilidades entre colchetes!

Apesar de ter apresentado cada recurso das expressões regulares do Vim separadamente, os comandos de busca pelo texto serão em
geral formados com combinações de todas essas ferramentas. Experimente conjugá-las na construção de comandos cada vez mais
específicos de busca!
Lição 6 - Transitando entre os modos

Normalmente um editor de textos sempre nos dispõe um cursor para a inserção de caracteres ou nos permite inseri-los após um ou dois
clics de um mouse. A verdade é que o Vim é fundamentalmente um editor que trabalha em modo texto e a partir da linha de comando.
Existe, para quem preferir, uma versão do Vim destinada ao modo gráfico, o chamado Gvim. Existe também um tipo de Vim que se
pretende funcionar como um editor simplista: o Easy Vim - Evim.
No Vim, no entanto, precisamos para escrever habilitar um modo de operação específico, e então nele operamos praticamente como em
um editor simples até querermos gravar e sair. O Vim é assim porque se acredita que vai ser exigido muito dele.
Quando falamos em "modos de inclusão" nos referimos aos modos de inserção e de substituição, que para quase todos os fins são
análogos.
Já conhecemos um comando simples que nos permite entrar em modo de inserção a partir do modo Normal, o ' i ' de insert. Quando
apertamos ' i ' o cursor mantém-se para inserção exatamente na posição em que estava em modo Normal, e nada mais acontece. Ou
seja, esta provavelmente é a maneira mais básica de se transitar para o modo de inserção. Existem pelo menos doze outras.

Vocês estão analisando e editando o texto em modo Normal e percebem que querem começar a escrever a partir do caractere que se
segue imediatamente após a posição atual do cursor. Não é suficientemente simples andar uma casa para a direita com ' l ' e apertar ' i '
? Pois é, a verdade é que podemos fazer isso com um único comando (ao invés de dois) com ' a '. Experimente.

Ação: digite ' a ' para iniciar o modo de inserção com o cursor um caractere a frente da posição atual!

Se quisermos começar a escrever imediatamente no final da linha corrente podemos digitar ' A '. Mais ou menos analogamente ' I ' (' i '
maiúsculo) inicia o modo de inserção com o cursor no início da linha corrente. Se quisermos começar a escrever no início da linha onde
atualmente está o cursor digitamos ' I ' e já podemos escrever.

Ação: digite ' I ' (' i ' maiúsculo) para iniciar o modo de inserção com o cursor no início da linha atual!

Ação: digite ' A ' para iniciar o modo de inserção com o cursor no final da linha atual!

Estes dois comandos mudam a posição do cursor ao longo da linha atual. Existem outros dois comandos que nos permitem iniciar a
inserção de texto a partir de uma nova linha que pode ser criada tanto acima quanto abaixo da linha corrente. O comando ' o ', cria uma
linha após a atual em modo de inserção. Ele é usado para quando vamos continuar o texto com um novo parágrafo ou linha, se for um
script, por exemplo. Já o comando ' O ' abre uma nova linha entre a corrente e a linha imediatamente acima desta.

Ação: digite ' o ' para iniciar o modo de inserção com o cursor em uma nova linha imediatamente abaixo da atual!

Ação: digite ' O ' para iniciar o modo de inserção com o cursor em uma nova linha imediatamente acima da linha atual!

Como visto em "Sintaxe dos comandos", existem dois tipos de verbos, os simples e o verbos pendentes. Existem duas duplas de
comandos de controle para iniciar o modo de inserção que se distinguem em nada senão em suas categorias de verbos. As duas duplas
de comandos compartilham a caraterística de recortar um objeto de texto antes de iniciar o modo de inserção. Aqulela com verbos
simples é ' s ' e ' S '. O comando ' s ' recorta o caractere sob o cursor em modo Normal e entra em modo de inserção com o cursor
exatamente na mesma posição (considerando o recuo de um caractere que a linha faz), tudo com somente o dígito ' s ', ou seja, com
somente um parâmetro aparente. Já o comando ' S ' recorta toda a linha corrente antes de entrar em modo de inserção, e o cursor
permanece pronto para a inserir texto a partir do início da linha em branco. Teste este dois comandos para compará-los com os
comandos de verbos pendentes.

Ação: digite ' s ' para recortar o caractere sob o cursor e iniciar o modo de inserção!

Ação: digite ' S ' para recortar toda a linha corrente e iniciar o modo de inserção no início da linha em branco!

A outra dupla de comandos também recorta o texto antes de nos permitir incluir novos dados. Porém, um desses comandos espera um
segundo parâmetro explícito para a determinação do objeto da ação. Esse parâmetro pode ser dado com um direcional, mas como
vimos, verbos como esse comportam diversos tipos de objeto, como palavra, linha, parágrafo, texto e inclusive objetos combinados,
exatamente como vimos na lição "Acessar o texto" na página "Movendo o cursor". O comando ' c ' espera a indicação do objeto para
recortá-lo e iniciar o modo de inserção. Se apontamos horizontalmente, para as colunas, ele recorta um caractere somente. Apontando
para a direita após ' c ', o comando se comporta exatamente como quando digitamos ' s '. Apontando para a esquerda o caractere
anterior ao que está sob o cursor é recortado e o cursor recua uma coluna juntamente com toda a linha. Ou seja, ' c ' apontado para a
esquerda é o mesmo que mover o cursor uma casa para a esquerda e digitar ' s '. Podemos também apontar verticalmente, e neste
caso ' c ' recortará duas linhas inteiras, iniciando o modo de inserção com o cursor em uma linha em branco. O objeto também pode ser
indicado digitando novamente ' c ', repetindo o comando simples, parâmetro que é um tipo de padrão no Vim para a execução de verbos
pendentes. Já digitando 'cc' recorta toda a linha, mas somente a linha atual, deixando o cursor no início de uma linha em branco. Como
disse, é claro, podemos indicar qualquer outro objeto a ser recortado, experimentem digitar '3wc', por exemplo.
Digitando ' C ', por sua vez, pode também recortar toda uma linha, mas só se o cursor estiver anteriormente posicionado no início
dessa. Seu funcionamento é recortar todo o texto existente na linha a partir da atual posição do cursor, ou melhor, seu objeto é "o texto
da linha após o cursor". Esse comando não é realizado com um verbo pendente, mas sim simples.
É importante dizer que todos esses quatro comandos, ' s ', ' S ', ' c ' e ' C ' comportam um parâmetro numérico para contar os objetos
sobre os quais agir. Como sabemos, para isso devemos inserir o valor numérico antes do restante do comando, como '2s' que recorta
dois caracteres.

Ação: digite ' c ' com um parâmetro de objeto para recortá-lo e iniciar o modo de inserção!

Ação: digite ' C ' para recortar todo texto existente na linha corrente após a posição atual do cursor!
Ação: indique um valor numérico e digite quaisquer dos quatro comandos anteriores para realizar um comando personalizado!

Como já foi explicado o modo de substituição é normalmente entendido como um sub-modo derivado do modo de inserção, visto que
desempenha um papel semelhante e que não possui as mesmas alternativas de inicialização. O modo de substituição, ao contrário,
possui apenas uma maneira de ser iniciado a partir do modo Normal: ' <Ctrl>+R ', ou melhor, ' <Ctrl>+<Shift>+r ', onde ' R ' tem
como origem Replace em inglês, que é substituir. Outra maneira de iniciá-lo é com o botão ' <Insert> '. Podemos considerar este modo
como um modo independente do de inserção, uma vez que ele apresenta as mesmas relações que este com o outros modos, como
veremos em tópicos futuros dessa lição.

Ação: digite <Ctrl>+R para iniciar o modo de substituição!

Como já foi explicado, existem modos derivados resultantes de combinações entre os modos básicos. Caso estejem inseguros sobre o
que são, quais são ou para que servem os modos de operação, é aconselhável que reler a seção "Modos de operação" do livro
introdutório deste curso "Noções preliminares".
Um exemplo de interação entre o modo Normal e o de inserção poderia ser quando o objeto da ação de um comando em modo normal é
o texto que digitamos em modo de inserção. Fazemos isso passando um comando da forma " n ' i ' " entrando em modo de inserção no
momento de passar o parâmetro de objeto. O parâmetro de verbo foi desconsiderado pois neste caso será por padrão a repetição do
objeto "texto digitado". Depois da sessão em modo de inserção apertamos <Esc> e voltamos para o modo Normal e o comando é
completado e executado. Esse parece de fato ser um exemplo de interação entre dois modos, mas considerado uma sessão de um modo
derivado a parte ele não é.
Basicamente, existem três modos derivados. Todos são combinações realizadas entre os modos inserção/substituição e um dos três
modos Normal, Visual e de Seleção. Tanto o modo de inserção quanto o modo de substituição podem derivar um modo novo com cada
um desses três modos básicos. Vamos considerar que existem três, pois os modos de inclusão de caracteres, ou seja, os modos de
inserção e de substituição, serão tratados como duas variações de um mesmo modo, que são chamados aqui de modos de
inserção/substituição ou de modos de inclusão. Dessa forma existem seis modos derivados possíveis, que são:

Modo de inserção com :


> Modo Normal = modo normal de inserção;
> Modo visual = modo visual de inserção;
> Modo de seleção = modo de seleção de inserção;

Modo de substituição com:


> Modo Normal = modo normal de substituição;
> Modo visual = modo visual de substituição;
> Modo de seleção = modo de seleção de substituição;

O primeiro modo derivado que veremos é o modo normal de inserção, que normalmente não é o mais utilizado. Sua utilidade pode ser
ofuscada pelo uso especial que se faz em geral do modo visual de inserção/substituição. Apesar disso, o uso do modos Normal de
incusão pode virar parte constante do trabalho de edição.
Os modos Normais de inclusão têm como função permitir um trânsito acessível entre os modos Normal e de inserção e entre os Normal
e de substituição. Sua utilidade pode acabar sendo esquecida visto ser antes uma facilitação e não uma ferramenta indispensável. Vale a
pena praticar seu uso para que se torne um movimento natural de acesso e retorno automático aos dois (ou três, com o de substituição)
importantes modos.
Ele só pode ser iniciado de dentro dos modos de inclusão, e o comando possível é apenas esse: ' <Ctrl>+o '. Se de dentro do modo de
inserção digitamos ' <Ctrl>+o ', entramos em modo Normal de inserção. Caso o fizermos a partir do modo de substituição entramos no
modo Normal de substituição. Experimentem.
Podemos notar que ao digitar ' <Ctrl>+o ', o nome do modo no canto inferior esquerdo irá mudar a sua apresentação, colocando-se
entre parênteses e trocando suas letras para minúsculas. Estamos em modo Normal de inserção ou de substituição. E agora? Posso
desenhar uma margem no meu texto? Não podemos fazer nada de especial senão passar um único comando de modo Normal. O Vim
em modo Normal de inclusão espera a execução de um comando de edição e retorna ao modo de inclusão original após sua realização.
Útil não é mesmo? Uma maneira prática de digitar <Esc>, um comando e novamente ' i ' ou ' R ', afinal, às vezes acontece de
precisarmos fazer uma simples ação de edição para poder continuar a escrever, e pode acabar sendo perda de tempo ficar passeando
lentamente entre esses modos de operação.
Naturalmente, podemos apertar <Esc> para sair deste modo direto para o modo Normal completo. Podemos também retornar
manualmente ao modo de inclusão digitando novamente o comando para que ele seja iniciado, como se estivéssemos mesmo em modo
Normal. Pratiquem!

Ação: digite <Ctrl>+o em modo de inserção ou em modo de substituição para, em modo Normal de inclusão, passar um comando de
modo Normal e voltar a digitar!

Modo visual

É recomendado que façamos uma nova leitura da descrição do modo visual no livro "Noções preliminares":
-----------------
O modo visual pode ser visto como uma extensão útil do modo Normal, visto que temos acesso às mesmas operações de edição. Este
modo é destinado à seleção de um trecho de texto com a movimentação dos cursores, que formam como uma hachura sobre as linhas a
serem selecionadas. Passamos comandos como em modo Normal para manipular o trecho marcado. Ele funciona como qualquer editor
visual com suporte a mouse e inclusive podemos configurar o próprio Vim para suportar a utilização de mouse.
Este modo é acessado com o caractere " v " em modo Normal.
Existe um recurso do modo visual que praticamente poderia ser considerado um modo derivado, o bloco visual, ou visual block. Ele é
acessado com "Ctrl-v" a partir do modo Normal. Com ele podemos selecionar blocos quadrangulares de texto, como se ele fosse uma
tabela ou um quadro de caracteres sem linha, nos permitindo selecionar, por exemplo, somente uma coluna de texto para manipulação.
Semelhante a este recurso é o visual line, acessível com "Shift-v" a partir do modo Normal.

----------------

O modo visual é, em uma explicação simples, o modo Normal com um diferente tratamento de objetos. Enquanto em modo Normal
temos de informar um objeto durante a construção do comando para realizar a ação, no modo visual o objeto informado é selecionado
manualmente, e só então passamos o verbo a ser aplicado sobre ele. O modo visual é simplesmente uma ferramenta de seleção do
objeto de ação para dar suporte às operações do modo Normal, tanto que são essas que funcionam em modo visual. Ele é acessado
com o comando ' v '.
Como explicado, existem duas alternativas ao modo visual simples para grifarmos nosso objeto de texto. Podemos também marcar o
texto segundo o padrão de linhas no modo visual do tipo linha, com ' V ' a partir do modo Normal, assim como segundo o padrão de
bloco no modo visual do tipo bloco, o que significa tratar o texto como um quadro, acessado com ' <Ctrl>+v ' a partir do modo Normal.

Ação: digite ' v ' em modo Normal para entrar em modo visual e grifar exatamente o trecho de texto que deseja editar!

Ação: digite ' V ' a partir do modo Normal para entrar em modo visual do tipo linha e hachurar o trecho de texto a se editar por linhas!

Ação: digite ' <Ctrl>+v ' a partir do modo Normal para entrar em modo visual do tipo bloco e hachurar o trecho de texto a se editar por
blocos e colunas!

Modo visual de inclusão

O modo visual de inclusão pode ser compreendido como um tipo possível de modo Normal de inclusão. Seu princípio é o mesmo:
entrando nele podemos realizar até um comando e voltar para o modo de inclusão original. Este modo é, por isso, só uma ferramenta
facilitadora do trânsito entre os modos. Seu uso é bastante razoável e compreensível: a partir do modo de inclusão digitamos '
<Ctrl>+o ' e em seguida ' v '. Ao digitar ' <Ctrl>+o ' entramos no modo Normal de inclusão, e até aqui o caminho é o mesmo. Em
seguida passamos um comando, só que ele é de controle para entrarmos em outro modo! Entramos então no modo visual de inclusão e
no canto inferior esquerdo vai aparecer: -- (insert) VISUAL --, ou seja, a conjunção do modo Normal de inclusão e o modo visual.
Podemos também iniciar o modo visual de tipo linha ou bloco dentro do modo Normal de inclusão, se quisermos.

Ação: digite ' v ' ou ' V ' ou ' <Ctrl>+v ' a partir do modo Normal de inclusão para acessar o modo visual de inclusão e seus tipos!

Modo de seleção

Relembremos da nossa introdução ao modo de seleção:

----------------
O modo de seleção é semelhante ao modo visual, mas ele não trabalha em cooperação com o modo Normal, ou seja, o modo de seleção
não aceita comandos como o visual. Caso seja digitado qualquer caractere que possa ser imprimido entra-se em modo de inserção, ou
seja, sua utilização é análoga a de um editor de texto visual simplista.
Este modo é acessado através do comando "gh", de dentro do modo Normal. O comando "Ctrl-g", a partir do modo visual, é uma das
outras alternativas que serão apresentadas mais tarde.
Existem também os recursos de selection block e selection line no modo de seleção, ativados com "gH" e com "g_Ctrl-h"
respectivamente.
-----------------

O modo de seleção não é análogo ao modo visual, sendo uma ferramenta do modo Normal. Ele é mais como um suporte para o modo
de inserção. Seu funcionamento é semelhante à operacionalidade padrão de um editor ou processador de texto gráfico qualquer com
suporte a mouse. Selecionamos um trecho do texto e podemos usar nossas teclas como em modo de inserção. Se digitarmos ' d ' sobre
o trecho selecionado substituiremos o trecho de texto por ' d ', se teclarmos <Delete> com um trecho selecionado o trecho de texto é
removido. O modo de seleção é provavelmente um modo bastante familiar e é iniciado a partir do modo Normal com ' gh '.
Assim como no modo visual, existem duas formas de selecionar o texto, uma é através do modo de seleção de tipo linha (com '
g_<Ctrl>+h ') e modo de seleção de tipo bloco (com ' gH ').

Ação: digite ' gh ' a partir do modo Normal para inserir ou deletar texto sobre um trecho selecionado!

Ação: digite ' g_<Ctrl>+h ' a partir do modo Normal para inserir ou deletar texto sobre um trecho selecionado linha a linha!

Ação: digite ' gH ' a partir do modo Normal para inserir ou deletar texto sobre um trecho selecionado por bloco!

Modo de seleção de inclusão

Quem entendeu o modo visual de inclusão facilmente pode deduzir como funciona o modo de seleção de inserção ou de substituição.
Como o outro, pode ser entendido como um dos usos possíveis do modo Normal de inclusão, visto que é acessado a partir deste. Para
entrar em modo de seleção de inclusão, primeiramente entramos no modo Normal de inclusão com ' <Ctrl>+o ' a partir de um dos
modos de inclusão. Lá dentro então digitamos ' gh ' para entrar no modo de seleção.
O modo Normal de seleção nos permite passar um comando antes de voltarmos a inserção de caracteres, no entanto, entre os
comandos que podemos passar estão aqueles de inicialização de modos, e entre estes os que fazem diferença são os comandos para
entrar em modo visual e em modo de seleção; afinal, entrar em modo de inserção ou mesmo apertar <Esc> de dentro do modo Normal
de inserção só nos fará perder tempo. Pratiquem.

Ação: digite ' gh ' ou ' gH ' ou ' g_<Ctrl>+h ' de dentro de um dos modos Normal de inclusão para entrar em modo de seleção de
inserção ou de substituição!

Retomando nossa conversa sobre o modo "ex" inciado nas "Noções preliminares":
----------------
O modo ex poderia ser considerado por alguns como uma variante do modo linha de comando, visto que ele é operado de maneira
praticamente idêntica. A diferença está no controle que temos sobre a linha de comando. Enquanto em modo linha de comando se
espera que realizemos uma operação e voltemos para o modo Normal, de certa forma podemos efetuar quantos comandos quisermos e
nos manter como em linha de comando. No modo ex, portanto, não temos que continuar digitando " : " a cada comando e a tela não é
atualizada, listando cada operação que fazemos. Por este último motivo o modo ex é ideal para que configuremos o Vim em pleno uso
com um script "on-line".
Para entrar em modo ex, digitamos " Q ". Também podemos iniciá-lo com " gQ ", o que funciona de forma ligeiramente diferente.
Enquanto com " Q " as linhas de comando são manipuláveis somente com os comandos padrões de inserção de linhas, ou seja, com
<bs>, <del> e comandos como "Ctrl-u", "Ctrl-e", etc., o modo ex iniciado com " gQ " é editável com todos os recursos do modo linha
de comando, como completar automaticamente palavras por exemplo.
----------------

Não há muito o que completar aqui. Para os curiosos, ex era um editor de Unix popular do qual o ed é sucessor.
Como talvez tenham notado, em certo sentido o modo "ex" é como se fosse o verdadeiro modo linha de comando, do qual somente
saímos se pedirmos para sair. De certa forma o modo linha de comando, frente ao modo "ex", parece uma espécie de modo Normal de
linha de comando dentro do qual após realizarmos uma operação voltamos para o modo original.
Podemos entender o modo "ex" como um ambiente de configuração, dentro do qual podemos passar quantos comandos de linha
quisermos sem sair e sem ter sempre que digitar ' : '. Existem duas formas distintas de usar o modo "ex". Uma é acessada com ' Q ', e
neste caso escrevemos o comando como se estivéssemos escrevendo uma linha de texto, com as mesmas ferramentas de edição, ou
seja, os caracteres ASCII do teclado. A outra forma é inciada com ' gQ ', e neste caso podemos editar a linha com os recursos de edição
padrão de uma linha de comando do Vim, assim como do shell. E como sair? Não saímos quando queremos, então, eu quero! Pois bem,
passe o comando " vi " após o ' : ' padrão do modo "ex". " vi " não vem de vi, mas sim de visual, que nada tem a ver com o modo
visual. Aliás, também voltamos ao modo normal digitando " visual " por inteiro.

Ação: digite ' Q ' ou ' gQ ' para entrar no modo "ex" e passar diversos comandos de linha sem voltar para o modo Normal!

Existem alguns outros segredos sobre mudar de modos de operação no Vim. Alguns só
podem ser desvendados descobrindo certas configurações, mas em geral não deve haver problema no trânsito entre os modos se
aprenderam bem o que foi ensinado nas últimas páginas. Portanto, não se preocupem em entender tudo que vai ser lido no texto
abaixo, pois é apenas um apanhado sobre alguns detalhes que dizem respeito à transição entre os modos.
Para todos os fins lembre de configurar o Vim para lhe informá-lo do modo atual digitando ' :set smd ';
Toda esta passagem que se segue foi tirada do Manual de Referência do Vim 6.4,
escrito pelo próprio criador do editor, Bram Moolenaar.

Se por qualquer motivo o modo onde você está for desconhecido, você pode sempre
voltar para o modo Normal digitando <Esc> duas vezes. Isso não funciona para o
modo "ex", entretanto, utilize ":visual".
Vocês saberão que estão de volta no modo Normal quando verem a tela piscar ou
ouvirem o bipe depois de apertar <Esc>. No entanto, quando apertado <Esc> depois
de usar <Ctrl-O> no modo de inserção também ouvimos um bipe, mas ainda estamos
no modo de inserção, digitem <Esc> novamente.
*1 Vai do modo Normal para o de inserção passando o comando "i", "I", "a",
"A", "o", "O", "c", "C", "s" ou S".
*2 Vai do modo Visual para o Normal ao se passar um comando não pendente, que faz
o comando ser executado, ou digitando <Esc> "v", "V" ou "CTRL-V"
(veja |v_v|), que simplismente pára o modo Visual sem efeitos colaterais.
*3 Vai do modo linha de comando para o modo Normal:
- Apertando <CR> ou <NL>, que faz o comando dado ser executado;
- Deletando a linha inteira (e.g., com CTRL-U) e por último um <BackSpace>.
- Apertando CTRL-C ou <Esc>, que sai da linha de comando sem executar o comando.
No último caso o <Esc> pode ser o caractere definido com a opção 'wildchar',
que neste caso iniciará a completamento de linha de comando. Vocês podem ignorar
isso e apertar <Esc> novamente. {Vi: quando apertando <Esc> a linha de comando é
executada. Isto é inesperado para a maioria das pessoas; logo foi mudado no Vim.
Mas quando o <Esc> é parte de um mapeamento, a linha de comando é executada.
Se vocês quiserem o comportamento do Vi também quando apertando o <Esc>,
use ":cmap ^V<Esc> ^V^M"}
*4 Vai do modo Normal para o de seleção:
- Usando o mouse para selecionar o texto enquanto a opção 'selectmode' contiver "mouse";
- Usando um comando não imprimível para mover o cursor enquanto mantém o <Shift>
apertado e a opção 'selectmode' contiver a opção "key";
- Usando "v", "V" ou "CTRL-V" enquanto a opção 'selectmode' contiver "cmd";
- Usando "gh", "gH" ou "g CTRL-H" |g_CTRL-H|;
*5 Vai do modo de seleção para o Normal usando um comando não imprimível para mover o cursor sem manter o <Shift> apertado.
*6 Vai do modo de seleção para o de inserção digitando um caráter imprimível. O que
estiver selecionado é deletado e o caractere é inserido;

Se a opção 'insertmode' estiver ligada, a edição de um arquivo começará no modo


de inserção.

*CTRL-\_CTRL-N* *i_CTRL-\_CTRL-N* *c_CTRL-\_CTRL-N* *v_CTRL-\_CTRL-N*


O comando CTRL-\ CTRL-N ou <C-\><C-N> pode ser usado para ir ao modo
Normal a partir de qualquer outro modo. Isso pode ser usado para termos certeza de
que o Vim está no modo Normal, sem provocar um bipe como o <Esc> faria. No entanto,
isso não funciona no modo "ex". Quando usado depois de um comando que leva um argumento, como |f| ou |m|, o limite de tempo
definido em 'ttimeoutlen' é aplicado.

*CTRL-\_CTRL-G* *i_CTRL-\_CTRL-G* *c_CTRL-\_CTRL-G* *v_CTRL-\_CTRL-G*


O comando CTRL-\ CTRL-G ou <C-\><C-G> pode ser usado para ir ao modo de inserção quando 'insertmode' está setado. Caso
contrário, vai para o modo Normal. Isso pode ser usado para termos certeza de que o Vim está no modo indicado pelo 'insertmode', sem
saber em que modo o Vim está.

Lição 7 - Editar o texto

Vamos iniciar nossos estudos sobre a edição propriamente dita. Até agora aprendemos os diversos recursos necessários para que
possamos consultar e percorrer arquivos de texto com o Vim. Aprendemos o funcionamento da sintaxe de comandos em modo Normal e
vários comandos de movimentação de tela e de cursor, além de como fazer buscas no texto por quaisquer padrões de strings.

Esta segunda seção do curso, que diz respeito à edição, é significativamente mais simples e breve. Isto acontece porque os comandos
de edição são em princípio baseados nos comandos de movimentação do cursor. Em outras palavras, estes comandos são a base para a
construção de todos os comandos de edição, pois a movimentação do cursor é, nos comandos que agora veremos, o que indicará os
parâmetros objeto e valor numérico. Na verdade nas ações de movimento de cursor o verbo do comando é indicado em geral com os
direcionais. Os comandos que agora aprenderemos simplesmente vão atrelar à ação de movimentar o cursor um outro verbo, o de
apagar, copiar e colar. É claro que podemos também construir comandos de edição simples que possam presumir objetos e valores
padrões, e vale lembrar que estamos sempre falando (a não ser se explicitado) de comandos em modo Normal. Estes comandos que se
aliam aos de movimentação de cursor são comandos pendentes, ou seja, que esperam parâmtros. Vamos à prática.

O comando básico de remoção é o ' x ', que equivale a apertar a tecla <Delete>. No entanto, <Delete> não reconhece parâmetros
senão o padrão. Logo se digitado apagará um caractere. A deleção por ' x ', apesar de aceitar parêmetros, é um comando de execução
imediata, e não pendente. Logo o único parâmetro que podemos passar a ele é o numérico. Tentem digitar ' 2 x ' e verão dois caracteres
serem removidos. O ' x ' é designado a apagar caracteres, e seu objeto não é negociável por não ser um verbo pendente.

Ação: digite (n) x para apagar (n) caractere(s)!

O outro popular comando de remoção do Vim é ' d '. Este sim é um comando pendente. Vejamos o que podemos fazer com ele.

Lembre dos comandos de movimentação de cursor. Se digitamos ' 2w ' movimentamos o cursor por duas palavras. Experimente agora
digitar o comando ' 2wd ': verão duas palavras sendo deletadas! Tente também comandos mais ousados como ' $ d ' e ' gg G d ' e
notarão que o comando ' d ' reconhece todo tipo de comandos de cursor. Repare que caso digitemos simplismente ' d ' nada acontecerá
a princípio. Isto acontece justamente por ele ser um comando pendente, e assim não será executado até que passemos algum
parâmetro, nem que este seja apontar em algum sentido com os direcionais. Neste caso ele apagará o objeto padrão que se aponta com
os direcionais, ou seja, caractere se apontarmos para os lados e linha se o fizermos verticalmente.

Como antes dito, comandos pendentes em geral têm algum comportamento padrão que reage a sua repetição, que no caso, é ' dd '.
Apertar ' dd ' apaga a linha sobre a qual está atualmente o cursor - que funciona como ' D ' maiúsculo -, o que é diferente, teste isto, de
digitar ' d ' seguido de um direcional vertical, pois estes apagam duas linhas, a atual e a seguinte apontada pelo direcional.

Ação: digite um comando de cursor para designar objeto, acompanhado de um valor numérico, se quiser, seguido de d para apagar o
objeto designado!

Ação: digite dd ou D para apagar a linha sob a qual o cursor está atualmente!

Existem também aqueles comandos operacionais de transição de modo Normal para o modo de inserção, que também desempenham a
função de remoção. Lembrem dos ' s ' e ' S ' e dos ' c ' e ' C '.

Existe um comando principal de cópia de texto no Vim. Ele é, e precisa ser, um comando pendente, caso contrário não seria capaz de
satisfazer todas as condições de um comando verdadeiramente versátil do Vim.

O comando é ' y ', que vem de yank. Como o comando pendente ' d ', podemos informá-lo de valores e objetos particulares que
satisfazem nossas necessidades. O comando de cursor, como com ' d ', deve vir antes do verbo principal, pois como aprendemos a
ordem sintática do comando é n o v, ou seja, número, objeto e verbo. As mesmas possibilidades de designação de objetos valem para
este comando, ou seja, todos os movimentos de cursor são potenciais objetos dos verbos de edição.

Já o comando duplicado ' yy ', como a maiúscula ' Y ', de forma semelhante ao ' dd ', copia para o buffer padrão toda a linha atual.

Ação: digite y acompanhado de um movimento de cursor para copiar o objeto designado com o comado de cursor para o buffer padrão!

Curiosa e inteligentemente, no Vim vários outros comandos que não o ' y ' também podem ser utilizados com a finalidade secundária de
copiar um trecho de texto. Na verdade, esses outros comandos são todos aqueles de remoção ensinados (exceto a tecla <Delete>). Ou
seja, quando deletamos um objeto qualquer de texto, estamos sempre também o copiando para o buffer padrão, logo tanto o comando '
x ' quanto o ' d ' e os outros de mudança de modo que realizam deleção também copiam os trechos de texto removidos. Em certo
sentido, existem vários comandos de cópia de texto, dentre os quais ' y' é o único que preserva o texto como está, ou seja, sem
removê-lo.

Ora, mas como poderei copiar uma string e colá-la posteriormente se estou realizando diversas remoções? Para isso podemos reservar
buffers que não sejam o padrão. Para tanto devemos nomeá-los. Os nomes possíveis são os seguintes: a-z A-Z 0-9 . % # : - "

Para atribuí-lo, devemos precedê-lo de uma aspas ( " ) : ' "s ' - neste caso por exemplo, estamos apontando para um buffer chamado ' s
', mas ainda não fizemos nada. Para copiar um conteúdo para um buffer chamado ' b ', por exemplo, escrevemos ' "b yy ', e copiamos a
linha atual para ' b '. O último trecho de texto copiado é sempre associado também ao buffer padrão, mas se o atribuímos a um buffer
nomeado podemos sobreescrever à vontade o padrão, que quando digitarmos ' "b p ', no nosso exemplo, o mesmo conteúdo antes
armazenado será transcrito. Por fim, para conferir os buffers atualmente nomeados digitamos ' :reg ', de registers.
Ação: digite "cy mais o objeto de texto para o copiar para um buffer com o nome do c dado!

Ação: digite :reg ou :di para ver os buffers atualmente nomeados!

Para colar o trecho de texto copiado para o buffer padrão existe o comando ' p ', que vem de put. Este comando não é pendente e por
isso só aceita mais um parâmetro, o de quantidade. Podemos colar n vezes o conteúdo do buffer carregado. Como outra alternativa
podemos preferir colar o texto antes da posição do cursor, para isso colamos com ' P '. Caso queiram sofisticar o comando,
experimentem digitar ' gp ' ou ' gP ', e o cursor terminará sempre ao final do texto colado.

Ação: digite (n) p para colar o conteúdo do buffern vezes após o cursor!

Ação: digite (n) P para colar o conteúdo do buffern vezes antes do cursor!

Ação: digite (n) g p ou P para colar o conteúdo do buffern vezes e posicionar o cursor após o texto colado!

Como explicado, podemos definir buffers diferentes do padrão digitando aspas e o nome do buffer, que é um caractere, seguido do
comando de cópia de texto. Para colá-lo, a estrutura do comando é a mesma: ' "c y ' para copiar e ' "c p ' para colar.

Ação: digite "c p para colar o texto armazenado no buffer de nome c!

Outro recurso de edição é o comando equivalente ao ' <Ctrl>+z '. O comando de desfazer (undo) no Vim, não somente é baseado em
um histórico cujo tamanho pode ser definido, ou seja, potencialmente interminável, como também o Vim permite que refaçamos os
comandos desfeitos. O Vim, quando se trata de voltar e avançar comandos, por compreender o arquivo segundo seu histórico, é
também versátil por permitir voltar e avançar números designáveis de ações.
O comando de desfazer é ' u '. Alternativamente, podemos desfazer todas as ações feitas na linha corrente com ' U '. O comando de
refazer comandos, por sua vez, é ' <Ctrl>+R ', de redo. Tanto este quanto ' u ' são capazes de receber um parâmetro numérico, mas
naturalmente não esperam por ele, sendo o padrão 1.

Ação: digite u para desfazer a(s) última(s) ação(ões)!

Ação: digite <Ctrl>+R para refazer a(s) última(s) ação(ões) desfeita(s)!

Ação: digite U para desfazer todas as ações feitas na linha corrente!


Lembrem agora de tudo o que aprendemos sobre buscar ocorrências com ou sem expressões regulares. Tudo aquilo é aplicável
na tarefa de substituir ocorrências, justamente porque aquilo que podemos substituir são ocorrências que encontrarmos com o
comando de busca que executarmos. O comando de substituição é somente um complemento possível dos comandos de busca.
Como foi dito brevemente, os comandos de busca com substituição requerem que seja informada a região do texto cujas
ocorrências encontradas deverão ser substituídas, além do caractere ' s ', de substitute. Essa informação deve vir antes do
comando de busca, conferindo o formato ' : região s/busca '. Temos que informar a string que queremos inserir no lugar das que
encontramos, e isso é feito após o padrão procurado, separando-os por uma barra. Os comandos completos de substituição têm
a forma: ' : região s/busca/substituto '. Após o comando podemos ainda passar algumas opções, sendo as mais populares delas
a opção ' g ', de global, que manda o comando substituir todas as ocorrências dentro da região dada e ' c ', de confirmation, que
pede que o Vim pergunte pelas confirmações das substituições a serem realizadas. Podemos querer usar tambem o parametro ' i
', que faz o vim ignorar a diferenca entre maiuculas e minusculas, enquanto ' I ' o impede disto.
Um comando que substitui todas as palavras ' vi ' por ' Vim ' em todo o texto, por exemplo, poderia ser: ' :1,$s/vi/Vim/g ' .
Como podem reparar, a região foi delimitada apontando para duas posições de linhas separadas por uma vírgula, a primeira com
1 e a última com o símbolo ' $ ', que significa normalmente final de linha. Também podemos passar um símbolo único para
designar o texto todo, que seria ' % '. Lembrem que ' . ' indica a linha atual, e é um símbolo que também podemos incluir na
designação de uma região. Para constar, podemos também simplesmente não designar uma região, como com comandos de
busca, no entanto o comando só funcionará se for aplicável sobre a linha corrente, que é a região de texto padrão considerada
se faltar sua indicação.

Ação: digite : #,# s /expr1/expr2/ [opções] , sendo # um número de linha e #,# uma região do texto, para realizar
substituições sobre as ocorrências encontradas!

Lição 8 - Configuração do Vim e ferramentas especiais

Como foi explicado quando falamos sobre os modos de operação,


as ferramentas de configuração são todas
responsabilidade do modo linha de comando. Este modo foi desenhado
para cuidar especialmente da personalização da sessão
e de comandos relativos ao arquivo e à execução
do programa.
Como já devem ter reparado, os comandos de
linha são sujeitos ao mesmo controle que temos na linha de
comando do shell, pois temos acesso a um histórico de
comandos, a ações como <Ctrl>+u, <Ctrl>+a,
<Ctrl>+e e <Ctrl>+c para cancelá-la. Caso
digitemos <Ctrl>+z de fato suspendemos a execução
do Vim, mas para tanto não precisamos estar em linha de
comando, diferentemente do <Ctrl>+c. Podemos da mesma forma,
para suspender o Vim, digitar ' :sus ', de suspend. O modo
linha de comando no Vim também possui os recursos de listagem
com <Ctrl>+d, como em FreeBSD e com <Tab> e de busca de
comandos do histórico indicando o início da linha, como
se fosse um comando de shell grep.
A maioria das configurações
de uma sessão do Vim são realizadas por variáveis
de ambiente do Vim. Seus valores são acessíveis e
ajustáveis pelo comando de linha set. Basta digitarmos
' :set ' seguido da variável e seu valor ou de valores que já
mostram a variável. Veremos nas ferramentas especiais de
edição alguns valores ajustáveis de configuração
com o comando ' set ', mas existem inúmeras variáveis
no Vim, e seria impossível aprensentá-las todas aqui.
Naturalmente, os comandos de configuração
executados em modo linha de comando, ou seja, de dentro de uma
sessão, só serão válidos para a sessão
atual. Da mesma forma temporárias são as configurações
realizadas na chamada do programa, que também são
possíveis. Para configurar o Vim de forma que possamos
posteriormente chamá-lo com a manutenção das
características confiuradas da sessão temos de preparar
um arquivo externo de configuração para ser lido na
entrada do Vim, chamado ' .vimrc '.
Podem existir dois arquivos de
configuração, um global e um pessoal. O global existe
para que sejam desenhados padrões para serem aplicados sobre
todas as sessões Vim que existirem em uma determinada máquina.
Ele fica localizado na pasta do Vim no diretório etc: "
/etc/vim/vimrc ". O arquivo de configuração local
do Vim também é chamado ' .vimrc ' e deve ser criado na
pasta pessoal de cada usuário que deseja utilizar sessões
personalizadas do Vim.
Quando o Vim é chamado, ele
primeiramente aplica as configurações globais e depois
personaliza a sessão lendo o .vimrc da pasta pessoal do
usuário que o chamou. Logo, caso haja configurações
conflitantes, serão as configurações pessoais
que permanecerão.
Experimente criar o arquivo .vimrc e
editá-lo com uma linha de configuração. Digite
na linha de comando ' vim .vimrc ', e insira na primeira linha ' set
number '. Observe que no arquivo de configuração não
é necessário que digitemos o indicador de comando de
linha ' : ', ainda que não seja proibido digitá-lo.
Agora salvem e saiam e chamem o Vim para ler qualquer arquivo e verão
a sessão já ajustada com a opção de
numeração de linhas!
Uma dica para aqueles que irão
se aventurar na edição do .vimrc e começar a
brincar é o uso de comentários. Para comentar linhas no
.vimrc as iniciamos com aspas duplas ( " ), utilizem-as!
Aproveitem também os exemplos de arquivos de configuração
de sessões do Vim que estará disponível para
download.
Por fim na chamada do Vim podemos passar diversas
opções. O modelo de chamada é ' vim opções
arquivos ', fora as chamadas alternativas como ' view ', ' gvim ', '
ex ', ' gview '... Vale a pena conhecer o que as opções
podem fazer por nós, mas como este conteúdo
ultrapassaria um pouco os objetivos deste curso, recomendo que
consultem o manual do Vim, que apresenta o editor como um programa e
seus argumentos de linha de comando shell.

Pedindo ajuda

Como já devem ter notado, podemos consultar o manual de ajuda do Vim simplesmente digitando ' :help ' ou ' :h '. Caso seja
necessário consultá-lo sobre um item específico basta informá-lo do assunto com ' :h assunto '.

Ação: digite :h assunto para consultar o Vim sobre o assunto dado!

Conferindo a versão do Vim


Para ver a versão do Vim basta digitar ' :version '.

Ação: digite :version para ver a versão corrente do editor Vim!

Informando-se sobre os caracteres

Especialmente aqueles que programam podem se interessar pelo comando ' ga '. Ele apresenta no canto inferior informações
sobre o caractere sob o cursor como seu código hexa e octadecimal e seu valor ASCII.

Ação: digite ga sobre um caractere para saber seus códigos hexa e octadecimal e seu valor ASCII!

Marcando posições no texto

Talvez a mais importante ferramenta especial do tipo consulta é a marcação de texto. Com ela podemos nomear quaisquer
partes do texto tanto para acesso fácil mais tarde quanto para construirmos (ou referenciarmos) novos objetos. Como podemos
ver, o comando de marcação não é um comando de movimento, mas sim de mera nomeação. O cursor não sai do lugar marcado
e aparentemente nada acontece. Para marcar um local do arquivo, digitamos ' m ' seguido de um caractere nomeador que pode
variar de a até z e de A até Z. Para acessarmos a posição anteriormente marcada basta digitarmos aspas simples seguida do
caractere nome ( ' c ). Para utilizar a marca como designador de objeto de texto realizamos um comando pendente cujo objeto é
diferença, ou seja, o espaço entre posição corrente do cursor e a posição da marca. Por fim, para conferirmos as marcas do
texto atual digitamos ' :marks '.

Ação: digite m c para nomear a posição sob o cursor de c e ' c para acessá-la!

Ação: digite ' c e realize um comando para executá-lo sobre todo texto que estiver entre a posição atual do cursor e a posição
marcada c!

Ação: digite : marks para ver a lista de marcas do texto atual!

Numerando as linhas

Se não for a ferramenta de marcação, certamente o comando de numeração de linhas é o maior facilitador de leituras de
arquivos de texto em geral. Com esse recurso podemos visualizar o número das linhas de todo o texto e assim comparar,
armazenar e apontar com maior facilidade. O comando é de linha, ' :set number ', ou ' :set nu '. Esse é um dos mais
importantes e merece ser lembrado.

Ação: digite :set number para numerar todas as linhas do texto e : set nonumber para desfazê-lo!

Mapeando a posição do cursor

Podemos também utilizar o comando ' :set ruler ' ou ' :set ru ' para que o Vim nos indique a posição do cursor medida em
coluna e linha do texto. Para desativar o mapeamento do cursor digitamos ' :set noruler '.

Ação: digite :set ruler para que o Vim nos indique a posição do cursor no texto!

Monitoramento do modo

Como já dito, para facilitar o trânsito que temos de fazer entre os modos podemos solicitar que o Vim sempre apresente no
canto inferior esquerdo da tela o modo de operação em que estamos atualmente com o comando ' :set smd '. Para desabilitá-lo
digitamos ' :set nosmd '. Esta configuração é padrão no Vim e no vi.

Ação: digite :set smd para fazer o Vim sempre nos apresentar o atual modo de operação!

Buscando imediatamente

O Vim nos permite realizar buscas em tempo real, no sentido de que a string de busca vai sendo procurada na medida em que é
digitada. Esta opção trás grandes mudanças e implicações para os comandos de busca, mas certamente pode valer a pena. O
comando é ' :set is ', e para desabilitá-lo digitamos ' :set nois '.

Ação: digite :set is para habilitar a busca imediata da string de busca na medida em que vai sendo digitada!
Hachurando ocorrências

Caso haja muitas aparições da expressão procurada pode ser útil colorí-las para uma melhor visualização. Quando realizarmos
uma nova busca serão as novas ocorrências a ficarem hachuradas. O comando é de linha - ' :set hls '. Para desfazê-lo, ' :set
nohls '.

Ação: digite :set hls para hachurar as ocorrências encontradas de cada busca!

Consultando textos silmultâneos

Não poderíamos esquecer do recurso de divisão do espaço de tela ' : split arquivo '. Com este comando dividimos a tela em duas
ou em mais partes para visualizar textos diferentes ou até partes diferentes de um mesmo texto ao mesmo tempo! Caso seja
preferido, podemos fazer também uma divisão vertical da tela com ' : vsplit arquivo '. Para transitar entre as janelas digitamos '
<Ctrl>+w_w ', mas existem diversas maneiras práticas de transitar entre inúmeras janelas, como ' <Ctrl>+w_b ' ou '
<Ctrl>+w_t ' para alcançar a janela de baixo e a de cima, respectivamente. Existem comandos para mudar a posição das
janelas e comandos para alterar seus tamanhos. Estes são ' <Ctrl>+w_+ ' para aumentar a atual, ' <Ctrl>+w_- ' para diminuí-
la e ' <Ctrl>+w_= ' para igualá-las. Vale a pena conferir a entrada de ' :h split ' para compreender todas as possibilidades e
seus comandos.
Os comandos de edição são aplicados sobre a janela em atuação, e a linha de comando, apesar de ser uma só, se aplica também
sobre a janela atual. Porém a sessão é a mesma, então os buffers, entre outras coisas, são os mesmos, o que nos dá a
possibilidade de copiar e colar de e para textos diferentes.
Caso ' :split ' seja chamado desta forma, ou seja, sem argumentos, será aberto uma janela aprensentando o mesmo texto em
edição atualmente.

Ação: digite :split (arquivo) para abrir dividir a tela em janelas contendo diferentes textos visualizáveis simultaneamente!

Abrindo mais de um texto

Para abrir dois textos em uma mesmas sessão de Vim sem visualizá-los simultaneamente, basta na chamada do programa
invocar mais de um arquivo: ' vim arquivo1 arquivo2 '. Para acessá-los, digitamos os comandos ' :next ' e ' :prev '. Estes
comandos podem receber valores numéricos no caso de haver muitos arquivos abertos.

Ação: digite vim arquivo1 arquivo2 no shell para abrir mais de um arquivo no Vim e :next e :prev para transitar entre os
arquivos!

Consultando manuais

Digitando ' K ' sobre uma palavra no texto em sessão que corresponda a qualquer comando existente no sistema fará o Vim
procurar e tentar abrir seu manual de dentro da sessão do Vim. Quando a consulta ao manual terminar e digitarmos ' q ',
voltamos para dentro do Vim. Essa ferramenta é muito útil para a leitura de scripts cujos comandos desconhecemos, por
exemplo.

Ação: digite K sobre uma palavra que corresponda a um comando para consultar o manual do comando de dentro da sessão do
Vim!

Substituindo um caractere sem mudar de modo

Um
comando que pode ser eventualmente útil é o ' r ', que apesar de não
aceitar os parâmetros padrões é pendente por esperar que seja informado
um caractere para que ele se execute. O ' r ' tem a função do ' R ', a
de substituição, mas ao contrário deste o ele não entra em modo de
operação algum. O ' r ' é um comando de substituição do caractere sob o
cursor, e sua forma é ' r c '.

Ação: digite r sobre o caractere a ser substituído seguido do novo caractere com o qual queremos substituí-lo!

Trocando maiúsculas por minúsculas e vice e versa

Um
recurso um tanto quanto original, mas também útil, é o de trocar o
valor de caixa de um caractere. Digitando ' ~ ' podemos mudar uma letra
de minúscula para maiúscula e vice e versa. Podemos transformar este
comando em um comando personalizado digitando ' g ~ ' e completando-o
com um comando de cursor.
Ação:
digite ' g ~ ' seguido de um comando de movimentação de cursor para
trocar as letras minúsculas por maiúsculas e vice e versa!

Unindo linhas

Apesar de ser uma ferramenta raramente útil senão na edição de scripts e códigos fonte, quando dela precisamos não hesitamos
em reconhecer seu valor. Se digitamos ' J ', de join, trazemos a linha imediatamente abaixo da linha corrente para cima, ou seja,
para junto da linha corrente, unindo-as.

Ação: digite J para juntar as linhas corrente e seguinte!

Avançando e recuando espaços

Uma
alternativa a entrar em modo de inserção e pressionar <Tab> é em
modo Normal utilizar as teclas < e > para tabular as linhas. O
alcance da tabulação será aquele definido pela variável shiftwidth.

Ação: digite << e >> para tabular o texto em modo Normal!

Atualizando a tela

Para
limpar as mensagens que apareceram recentemente na tela do Vim podemos
digitar ' <Ctrl>+l '. Nada acontecerá com o arquivo, somente o
Vim descarregará as mensagens da interface para acalmar os usuários
sobrecarregados.

Ação: digite <Ctrl>+l para redesenhar a tela atual limpando as mensagens obsoletas!

Repetindo comandos

O
comando ' . ' (ponto) é um comando genérico de repetição de comandos de
modo Normal. Ele repete o último comando realizado, logo se ele foi a
colagem de um texto, ' . ' irá colá-lo novamente. Curiosamente, se a
última ação que fizemos foi entrar em modo de inserção e digitar uma
frase qualquer, ao voltarmos ao modo Normal ' . ' irá repetir a
inserção da frase que digitamos.

Ação: digite ' . ' para repetir o último comando ou ação realizados!

Carregando um arquivo para dentro do texto atual

Podemos,
de dentro de uma sessão em que editamos um texto qualquer, inserir o
conteúdo de texto de um arquivo diferente com o comando ' : r arquivo
', de read. O conteúdo do arquivo lido será inserido a partir da posição em que o cursor estava quando chamado o comando.

Ação: digite :r arquivo para inserir o conteúdo de um arquivo dentro do texto em sessão atualmente!

Salvando parte do texto

Se
quisermos podemos no lugar de gravar todo texto salvar apenas o
conteúdo que estiver dentro de uma região delimitada. Para tanto
designamos uma região como fazemos quando construímos um comando de
substituição. O comando de gravação do arquivo tem o formato ' região w
arquivo '.

Ação: digite #,# w arquivo para salvar o conteúdo entre as linhas # e # no arquivo dado!
Desabilitando escrita

Para
garantir que a sessão do Vim não poderá sobrescrever os arquivos
abertos podemos definí-la como somente leitura, o que é o mesmo que ter
aberto o Vim com o comando ' view '. Para tanto digitamos o comando de
configuração ' :set ro '. Para voltar podemos digitar ' :set noro '.

Ação: digite :set ro para tornar a sessão do Vim somente leitura e proibir a escrita do arquivo!

Insensibilizando o Vim a maiúsculas e minúsculas

Para
facilitar certas funções como busca e substituição podemos desabilitar
a sensibilidade que o Vim tem para diferenciar letras minúsculas de
letras maiúsculas. O comando para tal é ' :set ic ', para voltar
digitamos ' :set noic '.

Ação: digite :set ic para tornar o Vim insensível à diferença entre letras maiúsculas e letras minúsculas!

Executando comandos de shell

Uma
das características que tornam o Vim poderoso é a sua capacidade de
interação com o shell. O Vim é capaz tanto de inciar um shell a partir
de dentro de sua sessão quanto de simplesmente executar comandos sem
iniciar uma sessão shell nova. A saída do comando pode, inclusive, ser
inserida dentro do arquivo texto em edição. O comando para iniciar uma
nova shell é ' :shell '. Quando digitarmos ' exit ' voltamos enfim para
a sessão do Vim de onde paramos. O comando para executar comandos de
shell é ' : ! comandodeshell '; neste caso uma tela com a saída do
comando será aprensentada, e qualquer tecla fará o Vim retornar de onde
parou. Caso interesse, o comando ' : ! ! comandodeshell ' pode inserir
a saída do comando no arquivo corrente a partir da posição atual do
cursor.

Ação: digite :! comando para executar um comando de shell de dentro do Vim!

Ação: digite :shell para iniciar uma nova sessão shell a partir do Vim!

Ação: digite :!! comando para inserir a saída do comando de shell dentro do arquivo texto atual!

Criptografando o texto

O
Vim oferece um recurso extremamente valioso, o da criptografia. O
comando é bem simples, ' :X ', e o Vim pedirá por uma chave
criptográfica. Pois bem, depois de informá-la basta salvar o arquivo e
quando sairmos o arquivo já estará criptografado, e sua leitura exigirá
a chave, ainda que não sua escrita. Não se iludam com o poder deste
recurso no Vim, ele visa somente impedir que se veja o conteúdo dos
arquivos indiscriminadamente, mas ele jamais impedirá que pessoas
determinadas o leiam. Mas, de qualquer forma, notem que quanto maior
for a chave utilizada maior será a segurança do seu texto. Para
desabilitar o pedido da chave para a próxima vez que forem acessar o
texto, digitem ' :set key= ' quando o texto estiver descriptografado.

Ação: digite :X e informe uma chave para criptografar o texto corrente!

Completando palavras

Para
facilitar a digitação de textos, o Vim oferece o recurso de completar o
início de palavras com suas terminações prováveis, que são todas
aquelas já digitadas no texto anteriormente. Ou seja, se já havia sido
escrita a palavra ' Vim ' no texto anteriormente, ao digitarmos ' V '
em modo de inserção podemos apertar ' <Ctrl>+n ' e o Vim
apresentará todas as opções de completamento disponíveis até chegar à '
Vim '.

Ação: digite <Ctrl>+n para completar a palavra a ser digitada com alguma terminação antes digitada no texto!

Formatando o texto

Entre
os comandos de configuração ' :set ' existem alguns que visam formatar
e organizar o texto. Essas funções são para definir margem,
quebra de linha, parágrafo, indentação etc. Eis algumas possibilidades:

:set textwidth=80 | ajusta a quebra de linha para 80 colunas, ou caracteres;


:set nowrap | ajusta o Vim para não separar linhas que não sejam quebradas de verdade;
:set wrapmargin=10 | ajusta a margem do texto em 10;
:set tabstop=4 | ajusta a tabulação para 4 espaços;
:set shiftwidth=2 |ajusta o alcance dos comandos <Ctrl>+d e <Ctrl>+t (<, >) para 2 espaços;
:set expandtab | <Tab> avança na verdade espaços;
:set autoindent | indenta automaticamente as linhas que quebrarem;

Um
comando útil nessa hora é ' gq ', que ordena linhas e parágrafos.
Depois de setar as medidas de quebra de linha em um texto já em
execução, experimente digitar n gq, sendo n o número de linhas a serem ajustadas.

Ação: digite n gq para quebrar ordenadamente as n linhas seguintes!

Gravando seqüências de ações

Para
evitar que tenhamos que repetir grandes conjuntos de
comandos, que muitas vezes são trabalhosos e até difíceis de se
reproduzir, existe a ferramenta de gravação. Ao executá-la o Vim
imprime na tela recording, que significa gravando, e ela é iniciada digitando ' q c ', sendo c um caractere qualquer que nomeará
a sessão de gravação, ao final digite
q novamente. Para executar os comandos gravados posteriormente basta
digitarmos ' @ c ', sendo c o caractere escolhido.

Ação: digite qc para inicar e q para finalizar a gravação de uma determinada seqüência de comandos, depois digite @c para
executá-la nova e automaticamente!

Utilizando abreviações

Para evitar digitar palavras frequentemente utilizadas e


compridas, podemos criar abreviações com o comando ' :abbr abreviação abreviado '. Podemos, e até devemos,
criá-las no nosso arquivo de configuração e ao digitar a abreviação em
modo de inclusão a palavra abreviada será transformada automagicamente
no que determinamos como sendo seu correspondente.

Ação: digite :abbr abreviação abreviado para poder escrever palavras abreviadas que são convertidas automaticamente!
".vimrc, por Tomás RC;
"Algumas destas linhas foram tiradas de outros arquivos de configuração do Vim
"e ele deve ser entendido como um arquivo sempre em expansão potencial;
"Ele é dividido em 7 âmbitos de configuração:

"1 Controle de arquivo;


"2 Interface do Vim;
"3 Interface do texto;
"4 Formatação;
"5 Edição;
"6 Comandos;
"7 Programação (em geral).

"Cada um destes possuem comandos de linha atualmente operantes e outros que


"deixei para serem descomentados, se for o caso. Procurei comentar todas as
"linhas do arquivo para aqueles que tiverem interesse em bisbilhotá-lo.
"Experimentem, se quiserem, ler este arquivo de configuração já utilizando ele
"na sua seção para acompanhar sua leitura com a experiência da configuração!

"Controle de arquivo:

:set nocompatible " Pede ao Vim para não se preocupar em simular os comportamentos do Vi!
:set autowrite " Salva automaticamente antes de comandos como :next e :make
:set browsedir=buffer " Lembra o diretório do último arquivo aberto
:set history=100 " Determina o tamanho máximo de linhas (ou de comandos, não sei) do histórico
filetype plugin indent on " Reconhece os tipos de arquivos

set backup "Faz backup do arquivo atual,


set nowritebackup "e deleta o antigo backup posteriormente.
"Estes dois comandos funcionam geralmente juntos,
"vide ':help backup'.

"Interface do Vim:

:set ruler " Mapeia a posição do cursor em linhas e colunas


:set number " Numera as linhas
:set showcmd " Mostra os comandos de modo Normal passados
:set smd " Mostra o atual modo de operação
:set laststatus=2 " Sempre exibe a barra de status

" :set statusline=%F%m%r%h%w [FORMATO=%{&ff}] [TIPO=%Y] [ASCII=\%03.3b] [HEX=\%02.2B]


[POSIX??O=%04l,%04v][%p%%] [TAMANHO=%L]
" Mostra o código ASCII do caractere sob o cursor e outras coisas, mas não tá funcionando bem

"colorscheme darkblue " Esquema de cores legal


":set background=white " Fundo branco anti-claustrofóbico
":set visualbell " Não apita, pisca
":set mousehide " Esconde o mouse

"Interface do texto:

:set showmatch " Mostra os parênteses, chaves e colchetes que abrem o trecho que com eles fechamos
:set hls " Opção maravilhosa para programadores, pois hachura todas ocorrências de uma busca
syntax enable " Faz o mesmo que 'sintax on', mas não sobreescreve minhas configurações

":set incsearch " Busca string enquanto a digitamos


":set guifont=Monospace 12 " Configura a fonte
"sintax on " Colore elementos típicos da sintaxe do texto do tipo de arquivo do texto atual

"Formatação:

:set textwidth=80 " Ajusta a quebra de linha para 80 colunas, ou caracteres;


:set autoindent " Indenta automaticamente as linhas que quebrarem;
:set expandtab " <Tab> avança na verdade espaços;
:set tabstop=4 " Ajusta a tabulação para 4 espaços;
:set shiftwidth=2 " Ajusta o alcance dos comandos <Ctrl>+d e <Ctrl>+t (<, >) para 2 espaços;

":set wrapmargin=10 " Ajusta a margem do texto em 10;


":set nowrap " Ajusta o Vim para não separar linhas que não sejam quebradas de verdade;
":set formatoptions=tcqor " t=text, c=comments, q=format with gq command, o,r=autoinsert comment leader

"Edição:

:set wildmenu " Completa linha de comando de forma melhorada

"Abreviações ortográficas

":abbr ai aí
":abbr ha há
":abbr aa à
":abbr eh é
":abbr so só
":abbr doh dó
":abbr pa pá
":abbr ca cá
":abbr la lá
":abbr va vá
":abbr ta tá
":abbr nao não
":abbr sao são
":abbr pao pão
":abbr tao tão
":abbr vao vão
":abbr veem vêm
":abbr teem têm
":abbr voce você
":abbr po pó
":abbr cao cão
":abbr terca terça
":abbr sabado sábado
":abbr setima sétima
":abbr cetico cético
":abbr magico mágico
":abbr magica mágica
":abbr icone ícone
":abbr unico único
":abbr unica única
":abbr ultimo último
":abbr ultima última
":abbr musico músico
":abbr musica música
":abbr nucleo núcleo
":abbr ideia idéia
":abbr tambem também
":abbr proprio próprio
":abbr propria própria
":abbr proprios próprios
":abbr proprias próprias

"Comandos:
"De substituição ortográfica de texto

"%s/avel\>/ável/g
"%s/ivel\>/ível/g
"%s/evel\>/ével/g
"%s/encia\>/ência/g
"%s/ancia\>/ância/g
"%s/\<ansia\>/ânsia/gi
"%s/ontic/ôntic/gc
"%s/antic/ântic/gc
"%s/omeno\>/ômeno/g
"%s/oria\>/ória/g
"%s/orio\>/ório/g
"%s/aria\>/ária/g
"%s/ario\>/ário/g
"%s/atic/átic/gc
"%s/otic/ótic/gci
"%s/etic/étic/gci
"%s/itica\>/ítica/g
"%s/utica\>/útica/g
"%s/agio\>/ágio/g
"%s/orio\>/ório/g
"%s/icit/ícit/gc
"%s/icio\>/ício/g
"%s/icia\>/ícia/g
"%s/ofica\>/ófica/g
"%s/ofico\>/ófico/g
"%s/osof/ósof/gc
"%s/amic/âmic/gc
"%s/assemos\>/ássemos/g
"%s/issemos\>/íssemos/g
"%s/essemos\>/êssemos/g
"%s/avamos\>/ávamos/g
"%s/enca\>/ença/gc
"%s/ido\>/ído/gc
"
"%s/tambem/também/gi
"%s/ultimo/último/gi
"%s/ultima/última/gi
"%s/icone/ícone/gi
"%s/propri\>/própri/gci
"%s/ultipl/últipl/gc
"%s/conteudo/conteúdo/gi
"%s/nucleo/núcleo/gi
"%s/musico/músico/gi
"%s/musica/música/gi
"%s/ideia/idéia/gi
"%s/\<esta\>/está/gc
"%s/\<para\>/pára/gc
"%s/\<voce\>/você/gi
"%s/ao\>/ão/gc
"%s/cão/ção/gc
"%s/oes\>/ões/g
"%s/cões/ções/g
"%s/\<aa\>/à/gi
"%s/ah/á/g
"%s/ih/í/g
"%s/oo/ô/g
"%s/oh/ó/gi
"%s/ee/ê/gi
"%s/eh/é/gi
"%s/\<ha\>/há/gic
"%s/veem/vêm/g
"%s/teem/têm/g
"%s/\<so\>/só/g
"%s/soh/só/g
"%s/\<ai\>/aí/gci
"%s/pre-/pré-/gi
"%s///g
"
"%s/e-l/ê-l/gc
"%s/a-l/á-l/g
"%s/i-l/í-l/g

"Programação (em geral):

:set cin " indenta códigos .c

Bom, espero que tenham ganho, senão habilidades, ao menos muita familiaridade com o Vim. Não deixe, é claro, de utilizá-lo no
dia-a-dia do seu GNU/Linux e nem de procurar conhecer mais sobre suas capacidades. Procure construir seus arquivos de
configurações, baixe scripts e plugins para suas linguagens prediletas e façam do uso Vim um estilo de vida!

O curso certamente foi bastante teórico, o que infelizmente pode ter feito faltas no aprendizado prático do uso do Vim.
Aproveitem o guia de comandos enquanto puderem e, se interessar, copiem-no. Em seguida indicarei alguns endereços
eletrônicos para consulta sobre o Vim, entre eles os principais sites atrelados oficialmente ao editor e até páginas pessoais com
dicas e exemplos.

www.unb.ca/documentation/UNIX/tips/vim/

www.vi-improved.org/tutorial.php

http://vimdoc.sourceforge.net

www.vim.org

http://www.rayninfo.co.uk/vimtips.html

http://redvip.homelinux.net:81/aggregator/sources/45

http://www.moolenaar.net/habits.html

http://www.ukuug.org/events/linux2004/programme/paper-SMyers/Linux_2004_slides/vim_tips/

http://www.yolinux.com/TUTORIALS/LinuxTutorialAdvanced_vi.html

http://www.iccf.nl/click1.html

http://www.usinglinux.org/editors/

Anda mungkin juga menyukai