Uma Lição de VIM #2.5: Mudando de Modos – Modo de Comando

(Essa é a parte onde você vai aprender a fazer as coisas que precisavam de um menu para serem feitas.)

Existem três “iniciadores” de comandos no modo de… erm… comando:

:
Inicia um comando de edição.
/
Comando de pesquisa.
!
Comando de filtro externo.

Comandos de Edição

Assim como os comandos do modo normal, a quantidade de comandos de edição é grande demais para cobrir de uma vez só. Então vamos dar uma olhada nos mais utilizados:

:q
Sai do VIM. Esse deve ser o comando mais infame da história do editor — pelo menos, para os não iniciados.
:w
Salva o arquivo atual em disco. Edit: Esqueci de mencionar: Você pode passar o nome do arquivo a ser salvo neste ponto. :w, por exemplo, irá salvar o conteúdo com o nome atual; :w outro-nome irá salvar o conteúdo no arquivo “outro-nome”.
:wall
Salva todos os arquivos arquivos. Mais adiante veremos como ter vários arquivos abertos ao mesmo tempo.
:wq
Salva o arquivo atual e o fecha.
:help
Abre o help do VIM no tópico indicado. Por exemplo, :help :w irá apresentar as opções existentes para o comando :w; :help c irá mostrar as opções do comando c do modo normal e assim por diante.
:set
Configura (ou apresenta) alguma configuração do VIM. Mais a frente veremos como configurar o VIM e veremos as opções este comando.
:r
(Ou :read) Não é muito comum, mas permite carregar o conteúdo de outro arquivo para dentro do arquivo atual. sem precisar fazer todo o processo de copiar-e-colar (que veremos mais adiante). Um fato interessante de :r é que se o nome do arquivo a ser carregado começar com !, o VIM irá tentar executar o comando ao invés de carregar o conteúdo. Por exemplo, :r date irá carregar o conteúdo do arquivo date para dentro do arquivo atual enquanto que :r !date irá carregar o resultado do comando date para dentro do arquivo atual.
:noh
(Ou :nohighlight) Desliga a marcação sobre elementos de pesquisa. A seguir nós vamos ver sobre o comando de pesquisa; ao fazer uma, o VIM irá colocar um “realce” (ou “highlight”) sobre as palavras encontradas. Para desligar esses realces no texto, você pode usar :noh.

Aqui eu preciso abrir três parenteses:

  • Quando o vim se recusar a executar um comando, você pode forçá-lo a executar o mesmo de qualquer forma adicionando uma exclamação ! no final do comando. Por exemplo, se o VIM se recusar a sair porque você tem alterações em um arquivo não salvo, :q! irá forçar o editor fechar, perdendo as alterações feitas; se o arquivo não tiver permissão de escrita, :w! irá fazer com que o VIM altere as permissão do arquivo para poder escrever (e, no final, esta alteração das permissões é revertida)[1].
  • Uma coisa que você vai encontrar frequentemente são referências a “buffer” e “arquivo”. Entenda assim: buffer é a representação do arquivo na memória enquanto que o arquivo é a representação do conteúdo no disco. Ao abrir um arquivo, o VIM cria um buffer com o conteúdo do arquivo e o mantém em memória; se o arquivo sumir, o buffer ainda existirá e poderá ser salvo ainda; vários comandos internos do VIM — se você se aventurar a escrever um plugin, por exemplo — fazem referência ao buffer e não ao arquivo, mas existem funções que retornam o buffer de um arquivo com o nome indicado. Em todo esse tempo usando VIM, a distinção entre ambos nunca me pareceu importante e considerar, simplesmente, que “buffer” é o arquivo em memória é o suficiente.
  • Todos os comandos internos do VIM iniciam com uma letra minuscula e plugins, quando adicionam comandos a mais, adicionam com letras maicúlas[2]. Ainda, boa parte dos comandos não precisa ser digitada completa; quando não há mais redundâncias, o comando é aceito. Por exemplo, se houverem os comandos “:Gblame” e “:Gbork“, “:Gb” não será aceito, mas “:Gba” será porque não há mais nenhum outro comando que comece com “:Gba” (por isso que “:noh” funciona como atalho para “:nohighlight“).

Comando de Pesquisa

O comando de pesquisa é, simplesmente, /. Uma vez pressionado, você verá o cursor indo para a última linha da tela esperando a pesquisa. Uma coisa a ter em mente é que o VIM utiliza expressões regulares — então algumas coisas que você procurar não irão funcionar exatamente como você está esperando. “.“, por exemplo. Eu não vou entrar em detalhes sobre expressões regulares porque há pilhas de informações sobre elas na internet — e há praticamente mais sobre elas do que essa série tem (e terá) sobre VIM.

Dois comandos do modo normal que eu não mencionei antes por estarem ligados ao comando de pesquisa são n e N. n irá mover o cursor para a próxima ocorrência da pesquisa, enquanto que N move o cursor para a anterior. Note que eu falei “move o cursor”; isso quer dizer que n e N são comandos de movimentação e, portanto, podem ser usados com outros comandos do modo normal que utilizam movimentação. Por exemplo, procurar por “olá” e, em modo normal, executar cn irá remover tudo da posição do cursor até a próxima ocorrência de “olá” (e entrará em modo de edição).

Comando de Filtro

O comando de filtro pega o conteúdo no editor e passa para outro programa. Por exemplo, se você tiver o aplicativo “rot13”, ao executar !rot13, todo o conteúdo do arquivo será convertido para ROT13. Se você digitar !!rot13, no entanto, o conteúdo ainda será passado para o filtro e o resultado irá substituir o conteúdo do buffer atual.

Não parece ser interessante, mas um dos aplicativos que normalmente vem com o VIM é “xxd”, que converte o conteúdo para sua representação hexadecimal. Ao executar “!xxd”, você verá todo o conteúdo do seu arquivo com os valores hexadecimais de cada caracter.

[1] Não confunda “Não ter permissão de escrita” com “O arquivo pertence ao root”. No primeiro caso, o usuário tem permissão de ler o arquivo e trocar as permissões enquanto que no segundo o editor teria que ter permissões especiais de execução para poder trocar as permissões. O VIM só consegue responder ao :w! se ele próprio — e, no caso, o próprio usuário — tiver permissões suficientes sem requisitar outro aplicativo.

[2] Na verdade, o VIM vem sim com comandos que inicial com letra maíuscula: São os comandos de exploração de diretório :Explore, :Rexplore, :Vexplore e o famigerado :Sexplore, que o pessoal costuma encurtar para :Sex.

Uma Lição de VIM #2.4: Mudando de Modos – Modo Visual

(Esta é a parte em que VIM deixa de ser um editor tão alienígena.)

Na nota de rodapé do primeiro capítulo eu comentei que a maior parte dos comandos do modo visual podem ser feitos no modo de comando. Como já vimos o modo de comando, fica mais fácil entender o modo visual.

Em suma, o modo visual é a versão do VIM para o “Shift+Direcionais” dos demais editores: Vai selecionando texto, deixando visível o que está sendo selecionado. A diferença é que não é preciso ficar segurando o Shift o tempo todo. E todos os demais comandos de movimentação ainda são válidos.

Para entrar no modo visual, você usa, em modo normal, v — e, de novo, você não precisa pressionar ou ficar segurando nenhuma tecla: o modo ficará ativo até que você cancele o modo visual (voltando para o modo normal com [Esc]) ou seja utilizado algum comando de alteração de texto (como s).

Uma vez que a região fique selecionada, você pode usar qualquer comando de alteração de textos para executar somente naquela região. Assim, ao invés de ficar contando quantos tempos a linha tem para chegar no número certo de saltos para o commando f, você pode facilmente ativar o modo visual, navegar a bel prazer, usado qualquer combinação de comandos de movimentação (incluindo repetir f a vontade) até chegar no ponto que quiser e executar o comando somente naquela região.

Além de v, existem outros dois outros comandos para entrar em modo visual: [Shift]+v e [Ctrl]+v.

[Shift]+v é chamado de “modo visual de linha” porque, bem, são selecionadas linhas inteiras neste modo, incluíndo o caracter de nova linha de cada uma das linhas selecionadas. Neste modo, não é possível selecionar apenas parte de uma linha, somente linhas inteiras — que é útil quando se quer remover aquela função inteira[1].

[Ctrl]+v é chamado de “modo visual de bloco” e faz algo que poucos outros editores conseguem: seleção de regiões retangulares. A pergunta que você deve estar se fazendo agora é: e como é que o VIM junta as linhas se eu apagar um bloco inteiro? Resposta indireta: O modo visual de bloco funciona como se várias seleções fossem feitas ao mesmo tempo, o que significa que cada linha é uma seleção diferente e que cada comando de alteração de texto é executado individualmente em cada linha. Assim, se você iniciar o modo visual de bloco, selecionar várias linhas mas apenas uma coluna, e executar o comando c,[Esc], o que vai acontecer é que o VIM irá substituir o caracter na coluna indicada por vírgula em cada uma das linhas. Ou seja, respondendo a pergunta feita logo no começo deste parágrafo: o VIM irá juntar as linhas como se você tivesse ido na primeira linha, executado o comando, retornado a coluna inicial, ido para a linha seguinte, repetido o comando e passado para a próxima linha.

[1] Ou copiar para outro arquivo, que nós vamos ver mais pra frente.

Uma Lição de VIM #2.3: Mudando de Modos – Modo de Inserção

(Esta é a parte em que você vai finalmente começar a editar o texto.)

Agora que você sabe que existe mais de um modo de edição e como o cursor funciona, podemos finalmente começar a ver como se passa de um modo para o outro — e, no processo, entender como editar um texto no VIM.

Primeiro, é preciso saber que o Modo Normal é o ponto central para todos os outros modos — o jeito mais fácil de passar de um modo para o outro é através do Modo Normal. E, de qualquer modo[1], para ir para o modo normal basta pressionar Esc.

Lembre-se: Esc irá sempre voltar para o modo normal para que você possa passar para os demais modos. Esc em modo normal irá continuar em modo normal.

Para passar do modo normal para o modo de inserção, você deve usar o seguinte:

i
Vai para o modo de inserção na posição do cursor (lembre-se do capítulo anterior: o cursor está no canto inferior esquerdo do cursor, logo qualquer coisa que você digitar vai aparecer antes da letra onde o cursor se encontrava antes de pressionar i).
I
Move o cursor para o primeiro caracter que não seja espaço ou tabulação na linha e entra em modo de inserção (semelhante à _i).
a
Move o cursor uma posição pra frente e entra em modo de inserção (ou o mesmo que li).
A
Move o cursor para o fim da linha e entra em modo de inserção (Seria quase um $i, só que $ pára no último não branco da linha — se considerarmos o caracter de quebra de linha um caracter “branco” — e i ficará antes desse não-branco).
o
Insere uma linha em branco depois do cursor e entra em modo de inserção.
O
Insere uma linha em branco acima do cursor e entra em modo de inserção.
R
Entra em modo de inserção, mas substitui as letras atuais ao invés de adicionar mais. Sim, é um modo de substituição (“replace”), mas ainda é considerado um modo de inserção.

Ok, pequena pausa para acertar os ponteiros agora: Uma coisa que eu comentei anteriormente foi que, no modo normal é possível definir o número de vezes que um comando será repetido. Por mais estranho que isso possa parecer, todos os comandos acima também aceitam um número de repetições. Por exemplo, 20A-[Esc] irá repetir o comando A- 20 vezes, efetivamente colocando 20 “-” na linha atual; 20Oolá[Esc] irá adicionar 20 linhas de olá no seu texto, a partir da posição do cursor.

Sua vida acabou de mudar.

Sua vida acabou de mudar.

Quem estava prestando atenção deve ter notado que eu pulei r como opção de modo de inserção e todos os demais comandos tem uma versão em minúsculas e maiúsculas. O motivo é que r tem um funcionamento, digamos, peculiar.

r, por si só, espera por uma tecla para substituir o caracter sob o cursor. Seria o equivalente a fazer R, pressionar uma tecla e, na sequência, pressionar [Esc] para sair do modo de inserção. O estranho, no entando, é quando é definido um número de vezes que r deve ser executado: Neste caso, o caracter sob o cursor é alterado para o caracter indicado, o cursor é movido para o próximo caracter e o processo se repete até o número de vezes indicado (ou seja alcançado o final da linha). 20r-[Esc] irá, efetivametne, substituir os 20 próximos caracteres por - — que não seria o mesmo que digitar, manualmente, r- 20 vezes.

Existem ainda outros dois comandos para entrar em modo de inserção: c e s. Existem algumas diferenças configuráveis entre ambos, mas o funcionamento é o mesmo: Removem os caracteres indicados pela movimentação e passam para o modo de inserção.

Como assim "movimentação"?!?

Como assim “movimentação”?!?

De novo, pausa para acertar os ponteiros: no capítulo #2.2, eu falei sobre comandos do modo normal que movimentam o cursor. Aqui, c e s não vão entrar em modo de inserção até que você adicione uma sequência de movimentação. Assim: s$ irá remover tudo da posição de cursor até o final da linha e entrará em modo de inserção, s% irá remover tudo da posição do cursor até o próximo elemento que “fecha” o elemento atual (aspas, parênteses, colchetes, etc) e entrará em modo de inserção, c2f. irá remover tudo da posição do cursor até o segundo ponto na linha e entrará em modo de inserção e assim por diante.

A ficha finalmente caiu.

A ficha finalmente caiu.

Embora c e s funcionam de forma semelhante, C e S não: C irá apagar tudo da posição do cursor até o final da linha enquanto que S irá remover todo o conteúdo da linha, não importando a posição do cursor. Logicamente, depois de fazerem isso, ambos entram em modo de inserção. Com um número de repetições, no entanto, ambos funcionam da mesma forma — tanto 20S quanto 20C irão remover a linha atual e mais 19 e entrar em modo de edição.

E, só pra lembrar: Pressionar [Esc] irá voltar para o modo normal.

[1] … exceto o modo Ex, mas como eu falei antes, não é um modo muito útil hoje em dia e, portanto, eu estou ignorando ele daqui pra frente.

Nota: Todas as imagens são copyright (C) seus respectivos donos.

Uma Lição de VIM #1: Modos

(Esta é a parte onde eu explico porque você não conseguia sair do VIM na primeira vez que tentou usá-lo.)

Uma das primeiras coisas que é preciso entender sobre VIM é que ele é um editor modal. Enquanto outros editores abrem os arquivos diretamente em “modo de edição” (para começar a usar a nomenclatura que o VIM adota) — permitindo que você possa, imediatamente, editar o texto –, o VIM entra em “modo normal” (que não é o modo “normal” dos outros editores).

Mas o que isso quer dizer?

Mas o que isso quer dizer?

O VIM tem 5 modos:

Modo Normal
O modo Normal é o modo que o VIM entra normalmente. Neste modo, as teclas são traduzidas para comandos de alteração do texto. Na configuração padrão, os comandos sequer são apresentados.
Modo de Inserção
O modo de Inserção é o modo que a maior parte dos outros editores funciona. Qualquer coisa editada irá aparecer/alterar o texto atual.
Modo Visual
O modo Visual é semelhante ao selecionar texto com “shift” em outros editores[1].
Modo de Comando
O modo de comando serve para ações que começam com “:” (comandos Ex), “/” e “?” (procura) e “|” (filtro).
Modo Ex
Semelhante ao modo de comando depois de usar “:”, mas permanece no modo Ex.

Praticamente todos os modos são utilizados, de alguma forma ou de outra, com exceção do modo Ex.

A pergunta que você deve estar se fazendo agora é: E daí?

Você, agora.

Você, agora.

Existem algumas coisas interessantes que podem ser feitas com VIM que não podem ser facilmente replicadas em outros editores justamente pela existência destes modos de operação. Sim, inicialmente, o fato de não poder entrar no editor e sair adicionando código pode parecer frustante, mas a medida que você for aprendendo como utilizar cada modo, você verá que eles fazem sentido e que não é nenhum mistério ficar pulando de modo para modo.

A verdadeira lição começa agora.

[1] Apenas a título de informação, praticamente tudo que pode ser feito em modo visual pode ser feito em modo normal.

Nota: Todas as imagens são copyright (C) seus respectivos donos.