Browse Source

Merge branch 'draft/vim-book' into preview

master
Julio Biason 6 years ago
parent
commit
68a20650d8
  1. 8
      content/books/_index.md
  2. 36
      content/books/uma-licao-de-vim/00-intro/index.md
  3. BIN
      content/books/uma-licao-de-vim/00-intro/vim-zero.png
  4. 69
      content/books/uma-licao-de-vim/01-modos/index.md
  5. BIN
      content/books/uma-licao-de-vim/01-modos/so-what.jpg
  6. BIN
      content/books/uma-licao-de-vim/01-modos/whatdoesitmean1.jpg
  7. BIN
      content/books/uma-licao-de-vim/01.01-modo-normal/Mind-Blown.jpg
  8. 85
      content/books/uma-licao-de-vim/01.01-modo-normal/index.md
  9. BIN
      content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/areyoufuckingkiddingme.jpg
  10. 39
      content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/index.md
  11. BIN
      content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/vim-cursor.png
  12. BIN
      content/books/uma-licao-de-vim/01.03-modo-de-insercao/enhanced-buzz-5697-1327086181-19.jpg
  13. BIN
      content/books/uma-licao-de-vim/01.03-modo-de-insercao/iStock_000014784346Small.jpg
  14. 123
      content/books/uma-licao-de-vim/01.03-modo-de-insercao/index.md
  15. BIN
      content/books/uma-licao-de-vim/01.03-modo-de-insercao/jaw-drop.jpg
  16. 57
      content/books/uma-licao-de-vim/01.04-modo-visual/index.md
  17. 146
      content/books/uma-licao-de-vim/01.05-modo-de-comando/index.md
  18. 152
      content/books/uma-licao-de-vim/02-outros-comandos/index.md
  19. 71
      content/books/uma-licao-de-vim/03-recortar-copiar-colar/index.md
  20. 76
      content/books/uma-licao-de-vim/04-registradores/index.md
  21. 72
      content/books/uma-licao-de-vim/05-marcadores/index.md
  22. 60
      content/books/uma-licao-de-vim/06-macros-de-teclado/index.md
  23. 70
      content/books/uma-licao-de-vim/07-procurar-varios-arquivos/index.md
  24. 87
      content/books/uma-licao-de-vim/08-localizar-substituir/index.md
  25. BIN
      content/books/uma-licao-de-vim/09-splits/all.png
  26. BIN
      content/books/uma-licao-de-vim/09-splits/horizontal-split.png
  27. 114
      content/books/uma-licao-de-vim/09-splits/index.md
  28. BIN
      content/books/uma-licao-de-vim/09-splits/vertical-split.png
  29. 44
      content/books/uma-licao-de-vim/10-abas/index.md
  30. 162
      content/books/uma-licao-de-vim/11-config/index.md
  31. BIN
      content/books/uma-licao-de-vim/11-config/muahaha.jpg
  32. 468
      content/books/uma-licao-de-vim/11.01-vimrc/index.md
  33. 108
      content/books/uma-licao-de-vim/11.02-gvimrc/index.md
  34. 70
      content/books/uma-licao-de-vim/12-modelines/index.md
  35. 60
      content/books/uma-licao-de-vim/13-tags/index.md
  36. 112
      content/books/uma-licao-de-vim/14.01-vundle/index.md
  37. BIN
      content/books/uma-licao-de-vim/14.02-airline/airline-everything.png
  38. BIN
      content/books/uma-licao-de-vim/14.02-airline/airline-laststatus.png
  39. BIN
      content/books/uma-licao-de-vim/14.02-airline/airline-nofonts.png
  40. 110
      content/books/uma-licao-de-vim/14.02-airline/index.md
  41. BIN
      content/books/uma-licao-de-vim/14.02-airline/laststatus.png
  42. 66
      content/books/uma-licao-de-vim/14.03-fugitive/index.md
  43. 56
      content/books/uma-licao-de-vim/14.04-commentary/index.md
  44. 100
      content/books/uma-licao-de-vim/14.05-tabular/index.md
  45. 72
      content/books/uma-licao-de-vim/14.06-autopairs/index.md
  46. 60
      content/books/uma-licao-de-vim/14.07-syntastic/index.md
  47. BIN
      content/books/uma-licao-de-vim/14.07-syntastic/syntastic-airline.png
  48. BIN
      content/books/uma-licao-de-vim/14.07-syntastic/syntastic.png
  49. 107
      content/books/uma-licao-de-vim/14.08-snipmate/index.md
  50. BIN
      content/books/uma-licao-de-vim/14.09-ctrlp/ctrlp.png
  51. 105
      content/books/uma-licao-de-vim/14.09-ctrlp/index.md
  52. 52
      content/books/uma-licao-de-vim/14.10-multiple-cursors/index.md
  53. 53
      content/books/uma-licao-de-vim/15-conclusao/index.md
  54. 38
      content/books/uma-licao-de-vim/_index.md
  55. 2
      themes/nighttime

8
content/books/_index.md

@ -0,0 +1,8 @@
+++
title = "My Books"
template = "section-contentless.html"
+++
## Portuguese/Português
* [Uma Lição de Vim](uma-licao-de-vim)

36
content/books/uma-licao-de-vim/00-intro/index.md

@ -0,0 +1,36 @@
+++
title = "Introdução"
date = 2015-12-22
+++
Esta é a parte em que eu explico porque eu escrevi tudo isso e cujo conteúdo
não vai afetar em nada seu conhecimento de VIM ou a sua vida.
<!-- more -->
Em 2000 tive meu primeiro contato com programação em Linux e, como era de se
esperar, o primeiro editor sugerido foi o "VIM".
Foi WTF à primeira vista (e o clássico "Como é que eu fecho isso?").
![Ok, não é a mesma versão que eu usei a 8 anos atrás, mas a sensação é a mesma.](vim-zero.png)
Depois de usar outros editores por algum tempo (*cough* FTE *cough*), finalmente
decidi dar o braço a torcer e passei a usar VIM, continuo usando até hoje. Não
que eu tenha usado somente VIM desde então, utilizei outros editores (TextMate,
Sublime Text 2, Gedit) mas eu sempre sinto falta de alguma coisa nos outros
editores que acabei de acostumando no VIM. E, ainda, VIM ainda é o editor que
eu mais ouço "Cara, como é que tu fez isso?".
Não que VIM seja um editor completo e perfeito. Existem coisas novas surgindo a
todo momento que ninguém sequer imaginava quando VIM foi criado; existem coisas
que pelas próprias limitações do editor, o VIM não faz. Para algumas dessas,
existem plugins -- e eu vou falar de alguns interessantes mais pra frente -- e,
infelizmente, para outras, não há nada que possa ser feito, a não ser saber que
estas "faltas" existem e estar preparados para elas.
E vejamos quantos "Cara, como é que tu fez isso?" vão aparecer até o final
deste livro.
{{ chapters(next_chapter_link="./01-modos", next_chapter_title="Modos") }}

BIN
content/books/uma-licao-de-vim/00-intro/vim-zero.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

69
content/books/uma-licao-de-vim/01-modos/index.md

@ -0,0 +1,69 @@
+++
title = "Modos"
date = 2015-12-22
+++
Esta é a parte onde eu explico porque você não conseguia sair do VIM na
primeira vez que tentou usá-lo.
<!-- more -->
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?](whatdoesitmean1.jpg)
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.](so-what.jpg)
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.
{% note () %}
Todas as imagens são copyright (C) seus respectivos donos.
{% end %}
[^1] Apenas a título de informação, praticamente tudo que pode ser feito em
modo visual pode ser feito em modo normal.
{{ chapters(prev_chapter_link="./00-intro", prev_chapter_title="Introdução", next_chapter_link="./01-01-modo-normal", next_chapter_title="Modo Normal") }}

BIN
content/books/uma-licao-de-vim/01-modos/so-what.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
content/books/uma-licao-de-vim/01-modos/whatdoesitmean1.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
content/books/uma-licao-de-vim/01.01-modo-normal/Mind-Blown.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

85
content/books/uma-licao-de-vim/01.01-modo-normal/index.md

@ -0,0 +1,85 @@
+++
title = "Modo Normal"
date = 2015-12-22
+++
Esta é a parte em que você ainda vai precisar de um arquivo pronto para ver
as coisas funcionando.
<!-- more -->
A apresentação mais clássica do modo normal são todas as demais explicações que
você vai achar por aí que dizem que é preciso usar `h`, `j`, `k` e `l` para
mover o cursor na tela. Tirando o fato que isso é uma balela sem tamanho e que
o VIM suporta movimentação com as teclas direcionais e que você não precisa
ficar pensando em mnemônicos como "j tem uma perna pra baixo, k tem uma perna
pra cima" e outras absurdices, estes são comandos normais válidos: ao
pressionar `k`, o cursor irá mover para a linha de cima, `j` moverá o cursor
para a linha de baixo e assim por diante.
Nem todos os comandos são acionados com apenas uma tecla. Alguns iniciam um
comando, mas ficam esperando mais informações para saber o que fazer ou onde
fazer. Assim, temos comandos que são de movimentação e outros de ação.
## Comandos de Movimentação
Comandos de movimentação são comandos que movem o cursor no texto. Como já
vimos, `h`, `j`, `k` e `l` são comandos de movimentação. Além destes temos[^1]:
### f[letra]
Posiciona o cursor na próxima `[letra]` na linha. Se `[letra]` não existir, não
move o cursor. Por exemplo, `fa` irá mover o cursor para o próximo "a" na
linha.
### F[letra]
O mesmo que `f[letra]`, mas voltando na linha ao invés de ir pra frente.
### t[letra]
Posiciona o cursor uma posição antes de `[letra]` na linha. Praticamente o mesmo
que `f[letra]`, mas uma posição antes.
### T[letra]
Assim como "F" faz o mesmo que "t", mas voltando na linha.
### 0
Move o cursor para a coluna 0.
### _
Move o cursor para a primeira letra que não seja espaço ou tabulação na linha.
### $
Move o cursor para o final da linha.
### %
Move o cursor para o outro elemento do par (por exemplo, % quando cursor
estiver sobre um "(" irá mover o cursor para o ")" correspondente).
Até aqui eu acredito que você esteja pensando "nada que mude minha vida". Bom,
então aqui vem a primeira grande dica:
> Se você digitar um número antes de fazer um comando, VIM irá repetir o
> comando quantas vezes o número indicar.
![](Mind-Blown.jpg)
Ok, talvez não tenha sido a revelação do século, mas isso quer dizer que se
você digitar `3f.`, VIM irá mover o cursor para o terceiro ponto na linha atual.
E isso também pode não parecer importante, mas daqui pra frente isso vai fazer
sentido.
{% note() %}
Todas as imagens são copyright (C) seus respectivos donos.
{% end %}
[^1] De forma alguma, esta é uma lista completa de todos os comandos de
movimentação existentes, apenas os mais interessantes.
{{ chapters(prev_chapter_link="./01-modos", prev_chapter_title="Modos", next_chapter_link="./01-02-entendendo-o-cursor", next_chapter_title="Entendendo o Cursor") }}

BIN
content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/areyoufuckingkiddingme.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

39
content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/index.md

@ -0,0 +1,39 @@
+++
title = "Entendendo o Cursor"
date = 2015-12-22
+++
Esta é a parte em que você vai lembrar quando o texto não parar exatamente
onde você pensava que ele iria parar.
<!-- more -->
Antes de passar para comandos do modo normal que realmente alteram o texto, é
preciso entender como o VIM entende o cursor, porque o funcionamento pode
parecer um pouco diferente dos demais editores.
Para todos os efeitos, considere que o cursor está sempre na parte inferior
esquerda do bloco do cursor.
![](vim-cursor.png)
![Mais uma foto de você, nesse exato momento.](areyoufuckingkiddingme.jpg)
Porque é importante ter isso em mente?
Porque a maior parte dos editores trata as coisas um pouco diferentes: Por
exemplo, se houver uma linha inteira no clipboard, o VIM irá inserir (com o
comando padrão de colar, que vamos ver mais adiante) a nova linha abaixo na
linha atual -- a maior parte dos outros editores cola a nova linha no lugar da
linha atual e move a antiga linha uma posição abaixo.
Apenas tenha isso em mente agora que vamos começar a mudar de modo e alguns
comandos consideram a posição do cursor desta forma e tem uma "contraparte"
para ações antes do cursor -- e por isso o próximo capítulo parece ter comandos
repetidos.
{% note() %}
Todas as imagens são copyright (C) seus respectivos donos.
{% end %}
{{ chapters(prev_chapter_link="./01-01-modo-normal", prev_chapter_title="Modo Normal", next_chapter_link="./01-03-modo-de-insercao", next_chapter_title="Modo de Inserção") }}

BIN
content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/vim-cursor.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
content/books/uma-licao-de-vim/01.03-modo-de-insercao/enhanced-buzz-5697-1327086181-19.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

BIN
content/books/uma-licao-de-vim/01.03-modo-de-insercao/iStock_000014784346Small.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB

123
content/books/uma-licao-de-vim/01.03-modo-de-insercao/index.md

@ -0,0 +1,123 @@
+++
title = "Mudando de Modos – Modo de Inserção"
date = 2015-12-22
+++
Esta é a parte em que você vai finalmente começar a editar o texto.
<!-- more -->
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[^2].
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.](iStock_000014784346Small.jpg)
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"?!?](enhanced-buzz-5697-1327086181-19.jpg)
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 finalmetne caiu](jaw-drop.jpg)
Embora `c` e `s` funcionem 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.
{% note() %}
Todas as imagens são copyright (C) seus respectivos donos.
{% end %}
[^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.
[^2] ... O que explica porque vários programadores experientes em VIM tem a
mania de, algumas vezes, ficar pressionando `[Esc]` rapidamente quando
algo sai errado.
{{ chapters(prev_chapter_link="./01-02-entendendo-o-cursor", prev_chapter_title="Entendendo o Cursor", next_chapter_link="./01-04-modo-visual", next_chapter_title="Modo Visual") }}

BIN
content/books/uma-licao-de-vim/01.03-modo-de-insercao/jaw-drop.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

57
content/books/uma-licao-de-vim/01.04-modo-visual/index.md

@ -0,0 +1,57 @@
+++
title = "Mudando de Modos – Modo Visual"
date = 2015-12-22
+++
Esta é a parte em que VIM deixa de ser um editor tão alienígena.
<!-- more -->
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 pontos 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.
{{ chapters(prev_chapter_link="./01-03-modo-de-insercao", prev_chapter_title="Modo de Inserção", next_chapter_link="./02-outros-comandos", next_chapter_title="Outros Comandos") }}

146
content/books/uma-licao-de-vim/01.05-modo-de-comando/index.md

@ -0,0 +1,146 @@
+++
title = "Mudando de Modos – Modo de Comando"
date = 2015-12-22
+++
Essa é a parte onde você vai aprender a fazer as coisas que precisavam de um
menu para serem feitas.
<!-- more -->
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. E ele ainda aparece na tela inicial do VIM, se
você prestar atenção.
## :w
Salva o arquivo atual em disco. 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á
executar o comando `date` e "colar" o resultado 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 maiúsculas[^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": porque não há nenhum outro comando que
inicie com "noh").
## 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`.
{{ chapters(prev_chapter_link="./01-04-modo-visual", prev_chapter_title="Modo Visual", next_chapter_link="./01-05-modo-de-comando", next_chapter_title="Modo de Comando") }}

152
content/books/uma-licao-de-vim/02-outros-comandos/index.md

@ -0,0 +1,152 @@
+++
title = "Outros Comandos"
date = 2015-12-22
+++
Esta é a parte em que eu comento alguns comandos que você vai usar
esporadicamente.
<!-- more -->
Neste ponto você deve estar entendendo como os modos do VIM funcionam, para que
cada um funciona e tento uma idéia básica de como editar arquivos. Como eu
falei já duas vezes, a quantidade de comandos disponíveis é gigantesca, então
vamos aproveitar esse pequeno momento em que as coisas começam a fazer sentido
para ver mais alguns comandos.
## [Shift]+j (Modo normal)
"Junta" a linha abaixo do cursor com a atual. Pode não parecer muito, mas o VIM
irá colocar um espaço no final da linha atual[^1] antes de juntar com a linha
abaixo e removerá todo caractere branco da linha de baixo antes de juntar as
duas linhas.
## x (Modo normal)
Apaga o caractere sob o cursor. O mesmo que `[Del]`.
## gq (Modo normal)
Reformata o parágrafo. Não faz muito sentido para código (com algumas
exceções), mas se você tiver configurado a coluna máxima (vou explicar como
fazer isso na parte de configuração do VIM), você pode selecionar um comentário
em modo visual e usar gq para que o VIM alinhe o comentário no espaço definido.
Também serve para quando você estiver editando arquivos de markup (MarkDown,
reSTRUCTURED text, HTML, etc).
## gg e G (Modo normal)
`gg` move o cursor para o início do arquivo e `G` move o cursor para o fim do
arquivo. Efetivamente, fazer `ggdG` (mover o cursor para o início do arquivo,
remover tudo até o final do arquivo) irá remover todo o conteúdo do arquivo.
## = (Modo normal)
Reidenta o código usando a sintaxe atual.
## u e [Ctrl]+r (Modo normal)
Undo e redo, respectivamente.
## [Ctrl]+y e [Ctrl]+e (Modo normal e Modo de inserção)
Dois comandos que funcionam de forma diferente se executados em modo normal ou
modo de inserção.
No modo normal, `[Ctrl]+y` irá rolar o conteúdo do texto para baixo, mantendo o
cursor na mesma posição enquanto que `[Ctrl]+e` irá rolar o conteúdo para cima,
ainda mantendo o cursor na mesma posição. Se você abusar destes comandos,
movendo a linha onde o cursor se encontra para fora da área visível, o cursor
irá se mover.
No modo de inserção, no entanto, `[Ctrl]+y` irá copiar o caractere da linha de
cima na mesma coluna na posição atual; `[Ctrl]+e` faz o mesmo, mas com a linha de
baixo.
## . (Modo normal)
Repete o último comando. Note que `.` irá repetir o último comando completo. Por
exemplo, quando eu falei sobre `ggdG`, estamos falando, na verdade, de dois
comandos completos: `gg` e `d{movimentação}`. `.`, neste caso, irá repetir o comando
`dG`. Mais adiante veremos como criar "macros de teclado" e efetivamente permitir
a execução de coleções de comandos.
## :e e :files (Modo de comando)
Edita um arquivo. Se não for passado o nome do arquivo depois do comando, o
mesmo arquivo é recarregado do disco (em outras palavras, o buffer é atualizado
com o conteúdo do arquivo). `:e#` recarrega o último arquivo aberto (por exemplo,
se você estiver com o arquivo "arquivo" aberto e fizer `:e arquivo2`, usar `:e#`
irá recarregar "arquivo" para o editor; usando `:e#` de novo, "arquivo2" será
apresentado).
Você pode ver os últimos arquivos abertos na sessão atual do VIM com `:files`. Se
quiser recarregar algum destes arquivos de novo, basta usar `:e#{número}`, onde
{número} é o número do arquivo na lista.
## :sh (Modo de comando)
Abre um shell dentro do VIM. Para retornar ao VIM, basta encerrar o shell.
## :{número} (Modo de comando)
Pula para a linha indicada. Por exemplo, `:100` irá para a centésima linha do
arquivo.
## [Ctrl]+] e [Ctrl]+t (Modo normal)
`[Ctrl]+]` pula para a tag sob o cursor e `[Ctrl]+t` retorna. Mais adiante veremos
como criar um arquivo de tags para que o VIM consiga navegar pelo código. A
mesma idéia é usada no help do VIM: se você digitar `:help` irá ver a primeira
página de ajuda do editor; para navegar entre os tópicos apresentados (marcados
de forma diferente, dependendo do esquema de cor utilizado), é utilizado
`[Ctrl]+]` para avançar e `[Ctrl]+t` para retornar para a página anterior.
## ~ (Modo normal)
Altera o caractere sob o cursor para maiúscula se for minúscula e vice-versa e
move o cursor uma posição pra frente.
## gu{movimentação}, gU{movimentação} e g~{movimentação} (Modo normal)
`gu{movimentação}` altera todos os caracteres em {movimentação} para minúsculas.
`gU{movimentação}` altera todos os caracteres em {movimentação} mara maiúsculas.
`g~{movimentação}` faz `~` nos caracteres em {movimentação} (ou seja, os caracteres
da posição do cursor até movimentação ficarão em maiúsculas se estiverem em
minúsculas e vice-versa).
## [Ctrl]+p e [Ctrl]+n (Modo de inserção)
Auto-complete. `[Ctrl]+p` tenta completar a palavra antes do cursor voltando no
texto enquanto que `[Ctrl]+n` tenta completar com palavras mais a frente no
texto.
## [Ctrl]+a e [Ctrl]+x (Modo normal)
Incrementa (`[Ctrl]+a`) ou decrementa (`[Ctrl]+x`) o número sob o cursor. O VIM
automaticamente detecta se o número está em decimal, octal ou hexa.
E MAIS!
## w (Modo normal)
Move o cursor para o começo da próxima palavra.
## e (Modo normal)
Move o cursor para o fim da próxima palavra.
## b (Modo normal)
Move o cursor para o começo da palavra anterior.
## ge (Modo normal)
Move o cursor para o fim da palavra anterior.
[^1] ... a não ser que o primeiro caractere (não branco) da linha de baixo seja
um ")"; neste caso, o VIM não adiciona o espaço.
{{ chapters(prev_chapter_link="./01-05-modo-de-comando", prev_chapter_title="Modo de Comando", next_chapter_link="./03-recortar-copiar-colar", next_chapter_title="Recordar, Copiar e Colar") }}

71
content/books/uma-licao-de-vim/03-recortar-copiar-colar/index.md

@ -0,0 +1,71 @@
+++
title = "Recortar, Copiar e Colar"
date = 2015-12-22
+++
Essa é a parte que você não deve fazer muitas vezes quando estiver
programando.
<!-- more -->
Assim como outros editores, o VIM tem um sistema de copiar e colar. E, como
vimos vendo desde o começo, o VIM tem seu modo peculiar de lidar com isso.
Toda a parte de copiar-e-colar do VIM é feita em modo normal. E sem que você
soubesse, você já stava vendo a parte de recordar textos desde a parte de
comandos do modo normal: Qualquer comando que exclua texto imediatamente
transfere a parte excluído para a área de transferência do VIM. A única parte
que ficou faltando foi como você “cola” estes textos de volta.
E, para colar, você usa `p` (de "paste", veja só!).
E, obviamente, existe o `[Shift]+p` também. E a diferença é facilmente explicada
se voltarmos para o capítulo #2.2.
Quando falamos do cursor, eu disse que o cursor encontra-se na parte inferior
esquerda do bloco do cursor. O colar do VIM é feito depois do cursor. Assim, ao
pressionar `p`, o texto irá aparecer depois do caractere sob o cursor; se for
pressionado `[Shift]+p`, o texto será colado antes do caractere atual, empurrando
o mesmo pra frente.
O funcionamento muda um pouco se você recortar o texto usando o modo visual de
linha (ou recortar usando algum movimento que desconsidere a coluna atual).
Nestes casos, o VIM entende que você quer colar uma linha inteira e, ao invés
de mover o conteúdo da linha atual, o texto é colado abaixo da linha atual,
desconsiderando a posição do cursor. `[Shift]+p` irá colar o texto antes da linha
atual.
(Embora pareça complicado, a medida que você for se aclimatando com o
copiar-e-colar do VIM, você verá que não é tão diferente dos demais editores --
com a exceção que os outros editores tentam adivinhar quando você quer fazer
copia de linhas inteiras ou apenas pedaços, enquanto que o VIM deixa você mesmo
decidir quando fazer isso.)
A única coisa que ficou faltando agora foi como copiar o texto sem remover o
mesmo antes -- porque, vamos admitir, recortar e colar de novo seria muita
burrice.
O comando para copiar é `y{movimentação}`. Normalmente, ele é chamado de "yank"
(arrancar) e por isso muitos chamam o sistema de "copy'n'paste" do VIM de
"yank'n'paste".
Para copiar a linha inteira, você pode usar `yy`. Isto copia toda a linha,
incluindo o marcador de nova linha, e o VIM vai entender que, na hora de colar,
você quer colar a linha inteira, seguindo as mesmas regras que eu expliquei
acima sobre o modo visual de linha.
Assim como outros editores, o VIM mantém a área de transferência entre arquivos
(com isso, você pode abrir um arquivo, copiar um texto, abrir outro arquivo e
colar a parte selecionada do primeiro) e, normalmente, o VIM ainda consegue
manter a área de transferência entre execuções. Entretanto, uma coisa que você
pode não gostar é que a área de transferência pertence e é gerenciada
exclusivamente pelo VIM -- ou seja, ele não usa a área de transferência do
sistema operacional[^1]. Assim, você não vai conseguir copiar do VIM e colar no
seu browser ou vice-versa.
.. a não ser que você use registradores, que nós vamos ver a seguir.
[^1] E não, o "botão do meio dentro do X" não é a mesma coisa a área de
transferência.
{{ chapters(prev_chapter_link="./02-outros-comandos", prev_chapter_title="Outros Comandos", next_chapter_link="./04-registradores", next_chapter_title="Registradores") }}

76
content/books/uma-licao-de-vim/04-registradores/index.md

@ -0,0 +1,76 @@
+++
title = "Registradores"
date = 2015-12-22
+++
Essa é a parte que o VIM fica melhor que os outros editores.
<!-- more -->
No capítulo anterior eu mencionei que o VIM tem uma área de transferência
própria e que ela não se comunica diretamente com a área de transferência do
sistema operacional, apenas através de registradores.
A forma mais simples de pensar em registradores é: são marcadores para áreas de
transferência com nomes[^1].
Para acessar os registradores, você deve usar `"{nome do registrador}`, onde
{nome do registrador} é uma letra apenas. Assim, para copiar texto para um
registrador, é utilizado `"{registrador}y{movimento}`; para retirar depois este
texto do registrador, é utilizado `"{registrador}p`.
Enquanto você estava vendo yank'n'paste do VIM, o VIM estava guardando o texto
numa área de transferência apontanda pelo "registrador sem nome". E eu não
estou brincando aqui: O próprio help do VIM chama este registrador de
"registrador sem nome". A letra do registrador sem nome é `"` (ou seja, `""yy` e
`yy` ambos irão copiar a linha atual para o registrador sem nome).
Números são registradores especiais. 0 contém o último texto copiado para área
de transferência; de 1 a 9 ficam os textos excluídos, em forma de pilha (o mais
recente no registrador 1, o anterior a este no 2 e assim por diante; e quando
mais texto é excluído, o conteúdo vai para o registrador 1, o conteúdo do
registrador 1 vai para o registrador 2 e assim por diante).
`-` é um registrador que guarda qualquer coisa excluída que for menor que uma
linha inteira.
Registradores com letras de "a" a "z" funcionam exatamente como esperado: `"ayy` irá
copiar a linha atual para o registrador "a" enquanto que `"bp` irá colar o conteúdo
do registrador b.
Note que até agora eu chamei os registradores normais com minúsculas. O motivo
é que, ao copiar algo para um registrador, o conteúdo anterior é removido, a
não ser que você passe o nome do registrado em maiúsculas. Neste caso, o
conteúdo movido para a área de transferência do registrador é adicionado ao
conteúdo já existente. Assim, você pode copiar linhas não-contíguas usando `"ayy`
para a primeira linha, `"Ayy` para as demais e depois colar com `"ap` (para o paste
não há diferença entre maiúsculas e minúsculas).
Outros registradores especiais são:
## =
Registrador de expressões. Você pode entrar fórmulas e depois colar o resultado
no conteúdo com `p`. Uma coisa a cuidar aqui é que não é possível fazer `"=p`; o
VIM irá imediatamente abrir espaço para entrar a fórmula ao digitar `"=`; ainda,
o conteúdo é perdido se depois de digitar a fórmula você utilizar qualquer
comando que não seja `p` (incluindo os comandos de movimentação).
## _
Registrador "buraco negro" (de novo, eu não estou brincando, o help do VIM
chama esse registrador de "buraco negro"). Qualquer coisa enviada para este
registrador é perdida; paste deste registrador retorna nada. Útil quando você
quer excluir algum texto sem mexer no registrador sem nome.
## +
Registrador da área de transferência do sistema operacional. Somente disponível
para aplicações GUI, já que estas tem acesso direto ao sistema (no caso do VIM
console em Linux, o "sistema operacional" seria o próprio shell, que não tem
uma área de transferência -- se você pensar nas bibliotecas envolvidas, a coisa
faz sentido).
[^1] Registradores também são usados para outras coisas, mas veremos isso mais pra frente.
{{ chapters(prev_chapter_link="./03-recortar-copiar-colar", prev_chapter_title="Recortar, Copiar e Colar", next_chapter_link="./05-marcadores", next_chapter_title="Marcadores") }}

72
content/books/uma-licao-de-vim/05-marcadores/index.md

@ -0,0 +1,72 @@
+++
title = "Marcadores"
date = 2015-12-22
+++
Essa é a parte em que você não vai mais precisar se lembrar da última linha
que estava editando.
<!-- more -->
Algumas vezes você precisa ficar pulando entre partes diferentes do seu
arquivo. Alguns editores oferecem a funcionalidade de "bookmark" para linhas
específicas e ficam "pulando" entre estes bookmarks. O VIM tem uma
funcionalidade semelhante, chamada "Marcadores". A diferença é que enquanto os
demais editores só tem um estado para marcadores (ativo ou não), o VIM permite
que você tenha até 26 marcadores únicos -- e que podem ser acessados
diretamente.
Para marcar uma linha, você deve usar `m{nome do marcador}` em modo normal, onde
`{nome do marcador}` é uma letra de "a" a "z". Para ir diretamente para um
marcador, é só usar `'{nome do marcador}` para simplesmente mover o cursor para o
primeiro caractere não branco na linha do marcador ou `\`{nome do marcador}` para
mover o cursor exatamente para a posição do marcador (ambos também em modo
normal).
Como tudo no VIM, maiúsculas e minúsculas fazem diferença.
Criar um marcador com um nome em minúsculas signifca que o marcador é valido
somente dentro do arquivo. O marcador "a" do arquivo "arquivo1" não é o mesmo
marcador "a" do arquivo "arquivo2". Quando um marcador é criado em maiúsculas,
ele se torna global: Se você fizer `mA` no arquivo "arquivo1" e abrir o arquivo
"arquivo2", `\`A` irá voltar para o arquivo "arquivo1" (na posição do marcador,
obviamente).
E como tudo no VIM, sempre existem os comandos mágicos.
## \`\` ou ''
Retorna para a última posição onde foi feito um "pulo". Por exemplo, se você
está na linha 100 do arquivo atual, e fizer um pulo para o marcador "a" (com `\`a`,
por exemplo), ``\`\`` irá retorna para a linha 100. Note que isso não gera um
marcador per se, já que fazer ``\`\`` de novo irá retornar para a posição do
marcador "a" (pois foi lá que aconteceu o último pulo).
## \`. ou '.
Retorna para a última posição onde houve alteração de texto. O exemplo que eu
posso pensar neste caso é quando você está digitando um comando e não se lembra
se fez o #include ou import necessário. Neste caso, você simplesmente termina
de digitar o comando, usa `gg` para ir para o começo do arquivo para verificar se
o include/import está lá e, se tiver, usa `\`.` para retornar para a posição
original.
## \`[ ou '[ e \`] ou ']
Retorna para a posição onde o texto foi copiado ("yanked") para a área de
transferência (qualquer área de transferência). `[` irá mover para o primeiro
caractere copiado e `]` para o último.
## \`" ou '"
Move para a última posição do arquivo quando o arquivo foi fechado. Isto
normalmente é controlado pelo arquivo de inicialização, que veremos mais a
frente.
E, para ver onde estão as marcas atuais, você só precisa usar `:marks` no modo de
comando.
{{ chapters(prev_chapter_link="./04-registradores", prev_chapter_title="Registradores", next_chapter_link="./06-macros-de-teclado", next_chapter_title="Macros de Teclado") }}

60
content/books/uma-licao-de-vim/06-macros-de-teclado/index.md

@ -0,0 +1,60 @@
+++
title = "Macros de Teclado"
date = 2015-12-22
+++
Essa é a parte em que você repete várias coisas sem repetir várias coisas.
<!-- more -->
No capítulo #3, eu falei rapidamente do commando `.`, que repete o último comando
completo. Mas como repetir comandos que são, na verdade, uma composição de
vários outros comandos?
A resposta são macros de teclado.
Macros de teclado permitem que você grave uma execução qualquer e depois a
repita quantas vezes quiser.
Para fazer uma macro de teclado, você deve, em modo normal, executar
`q{registrador}`. Ao fazer isso, a última linha do VIM irá mostrar "recording",
indicando que o editor está agora gravandos todas as teclas pressionadas no
registrador. Para encerrar a gravação pressione `q` novamente (desta vez, sem o
registrador). Para "tocar" a macro, é necessário usar `@{registrador}`.
Quem prestou atenção no capítulo #5, deve ter notado que eu usei a palavra
"registrador" de novo. E a base da questão é que realmente os dois são a mesma
coisa: Se você copiar algo para o registrador `a` (`"ayy`, por exemplo) e depois
gravar a macro "a", o conteúdo copiado para a área de transferência será perdido.
Em compensação, se você criar a macro no registrador "a", você pode ver
exatamente a sequência de comandos usados usando `"ap`. Ou ainda, você pode
colocar a sequência de comandos desejada num arquivo (ou no próprio arquivo),
copiar para o registrador necessário e depois só "tocar" o registrador.
Como exemplo, imagine que você tem uma lista de constantes que você quer
transformar em uma lista de strings. No caso, você teria que adicionar uma aspa
no começo, uma aspa no final, uma vírgula e passar para a próxima linha. Se
forem apenas 4 constantes, é fácil repetir os comandos em cada linha; mas se
forem 100, a coisa fica diferente.
Neste caso, você faria o seguinte: Na primeira linha, executaria
`qaI"[Esc]A",[Esc]jq` -- ou seja, iniciaria a macro "a", entraria em modo de
inserção no primeiro caractere não branco da linha (`I`), colocaria uma aspa,
sairia do modo de inserção, entraria novamente no modo de inserção mas desta
vez movendo o cursor para o último caractere antes (`A`), adicionaria a aspa que
encerra a string e uma vírgula, moveria para a linha de baixo e encerraria a
macro de teclado. Até aqui espero que não tenha nada de surpresas. Agora você
pode repetir `@a` 99 vezes para as próximas linhas ou simplesmente executar `99@a`
e deixar o VIM repetir a macro 99 vezes. No final, bastaria simplesmente
remover a última vírgula.
Uma coisa a ter em mente -- além da questão do registrador -- é que o VIM
encerra tanto a macro quanto o número de repetições se houver qualquer
problema. Por exemplo, se no meio da sua macro você colocar um `f.` para mover
o cursor para o próximo ponto, mas no meio da execução não for encontrado
nenhum ponto, a macro será interrompida e qualquer execução posterior será
encerrada, não importando se for a 99<sup>a</sup> execução da macro ou a
1</sup>a</sup>. Se você perceber que a execução não terminou onde deveria,
basta executar `u` em modo de comando para desfazer a execução da macro.
{{ chapters(prev_chapter_link="./05-marcadores", prev_chapter_title="Marcadores", next_chapter_link="./07-procurar-varios-arquivos", next_chapter_title="Procurar em Vários Arquivos") }}

70
content/books/uma-licao-de-vim/07-procurar-varios-arquivos/index.md

@ -0,0 +1,70 @@
+++
title = "Procurar em Vários Arquivos"
date = 2015-12-22
+++
Essa é a parte em que mais uma vez você vai ter que pesquisar sobre
expressões regulares.
<!-- more -->
Já vimos o comando de pesquisa, que tem um modo inteiro só pra si[^1].
Mas como fazer para encontrar ocorrências de uma palavra em mais de um arquivo?
Para isto, existe o comando `:grep`.
O grep é uma ferramente comum em Unixes (e Linux) em geral, mas o VIM tem
scripts que fazem a mesma coisa em outros sistemas operacionais (por exemplo,
Windows). Assim, o mesmo comando vai funcionar da mesma forma não importando
qual sistema você esteja utilizando.
Como o `:grep` usa outras funcionalidades existentes no VIM, iremos ver um pouco
mais do que simplesmente "Procurar", mas isso é necessário.
Como o modo de pesquisa, `:grep` precisa de uma expressão regular. Ao contrário
do modo de pesquisa, o `:grep` também precisa de uma lista de arquivos a serem
pesquisados. Por baixo dos panos, o que o VIM faz é chamar o comando "grep" (do
Unix), verifica o resultado e permite pular facilmente entre os elementos
encontrados (então todas as opções disponíveis para o grep podem ser passadas
diretamente de dentro do VIM).
Por exemplo, para pesquisar por arquivos que contém a palavra "void", você só
precisa executar o comando `:grep void *` (onde `:grep` é o comando, `void` é a
expressão a ser pesquisada e `*` é a lista de arquivos a serem pesquisados). Como
o grep (o aplicativo do Unix) somente pesquisa arquivos no diretório
especificado (no nosso caso anterior, como não foi passado diretório algum,
será considerado o diretório atual), o `:grep` (o comando do VIM) também não vai
entrar em nenhum subdiretório (de novo, porque o VIM simplesmente chama o grep
[aplicativo do Unix] e facilita pular entre os elementos encontrados). Para
fazer uma procura que encontre a expressão além do diretório atual, basta
adicionar a opção "-r" para o grep (`:grep void -r *`).
Ok, agora que você sabe usar o `:grep`... Como é que você vê os resultados?
Primeira informação periférica: O VIM tem um tipo de "janela" especial, chamada
"Quickfix". Essa "janela" é, na verdade, um "split" da tela (e mais a frente
veremos como trabalhar com "splits" e abas). Para exibir o Quickfix, é usado o
comando `:copen`; para fechar o Quickfix, basta usar `:copen` de novo. Para
passar para o próximo elemento existente no Quickfix, use `:cnext` (ou
simplesmente `:cn`); para passar para o elemento anterior, use `:cprevious` (ou
simplesmente `:cp`); para mover o cursor para a posição do elemento atual do
Quickfix, use `:cc` (que é simplesmente `:cc` mesmo).
A segunda informação periférica: Como eu falei, usar `:grep {expressão} *` irá
procurar "{expressão}" a partir do diretório atual. Para descobrir qual é o
"diretório atual" para o VIM, use `:pwd` (de "print working directory", que
também é um comando Unix); para mudar para outro diretório, utilize o comando
`:cd {diretório}`, como você faria num shell normal.
(E antes que alguém pergunte: Sim, você pode fazer um grep fora do diretório
atual passando o diretório em questão no próprio comando do grep: `:grep void
/tmp -r` irá procurar por "void" em todos os arquivos existentes no diretório
/tmp.)
[^1] Apenas para lembrar, `/` entra no modo de pesquisa, onde só é preciso entrar
a expressão regular a ser encontrada; para passar para a próxima
ocorrência, use `n` em modo normal; para passar para a ocorrência anterior,
use `N` também em modo normal; para remover o realce das palavras
encontradas, use `:noh` em modo de comando.
{{ chapters(prev_chapter_link="./06-macros-de-teclado", prev_chapter_title="Macros de Teclado", next_chapter_link="./08-localizar-substituir", next_chapter_title="Localizar e Substituir") }}

87
content/books/uma-licao-de-vim/08-localizar-substituir/index.md

@ -0,0 +1,87 @@
+++
title = "Localizar e Substituir"
date = 2015-12-22
+++
Essa é a parte em que você vai precisar aprender expressões regulares — mais
uma vez.
<!-- more -->
Uma coisa relativamente comum quando se está programando é substituir todas as
ocorrências de uma palavra por outra[^1].
Para fazer "localizar e substituir" ("search and replace") existe o comando
`:substitute` em modo de comando (ou simplesmente `:s`).
Até aí sem problemas, mas existe uma pequena pegadinha (na verdade, duas, mas
uma de cada vez): `:s` é, na verdade, `:{range}s`, onde "{range}" é a parte do
texto que o comando `:s` deve ser executado -- e sim, eu sei que não falei
sobre este tipo de comando antes, mas essa era a melhor oportunidade.
Então, {range}. {range} é opcional e, se não for passado, o comando será
executado da linha atual. Isto, obviamente, não é muito útil. {range} é formado
por um par[^2], separado por vírgulas, indicando o início e o fim da execução do
comando.
O uso básico de {range} é "linha inicial,linha final". Por exemplo, `:1,5s` irá
executar o comando `:s` entre as linhas 1 (a primeira, não existe linha 0 no
VIM) e 5.
E, mais uma vez, existem indicadores especiais, inclusive para {range}.
Um número indica o número da linha, como já comentei. "$" é a última linha do
arquivo (assim, `:1,$s` irá executar `:s` em todo o arquivo); "%" é um alias
para "1,$" (ou seja, todo o arquivo); `'{marcador}` irá, obviamente, utilizar
os marcadores (ou seja, `:'a,'bs` irá executar `:s` entre o marcador "a" e o
marcador "b" -- E marcadores entre arquivos [em maiúsculas] não são
permitidos).
(E existe outros dois marcadores especiais que eu não comentei antes por achar
que não há uso fora do `:s` que são `'<` e `'>` que indicam, respectivamente, o
início e o fim da região visual -- mas o VIM vai adicionar estes dois
marcadores automaticamente se você tiver uma região visual selecionada e
pressionar `:` e por isso ficaram pra trás. Então não se assuste se o VIM
começar a colocar coisas na linha de comando sem que você tenha digitado.)
Daqui pra frente, eu vou colocar o comando como `:%s`, já que esta é a execução
mais comum do comando. Mas lembre-se que `%` = `1,$` = do começo ao fim.
`:%s` funciona, assim como a pesquisa, com expressões regulares, só que ao invés
de termos uma expressão, teremos duas: a de pesquisa e a de substituição. Em
casos mais simples, onde você quer substituir "palavra 1" por "palavra 2", o
comando será `:%s/palavra 1/palavra 2`. Mais uma vez, conhecer expressões
regulares vai ajudar aqui -- e fica a dica para olhar sobre "grupos".
A segunda pegadinha é que `:%s` executa o comando em cada linha do range e, como
padrão, somente a primeira ocorrência é substituída. Assim, se "palavra 1"
existir mais de uma vez em uma linha, somente a primeira será alterada.
Para resolver isso, você deve usar o terceiro parâmetro de `:%s`, {flags}. As
flags mais comuns são:
<dl>
<dt>g</dt>
<dd>Substitui todas as ocorrências da expressão de procura na linha, não apenas
a primeira.</dd>
<dt>i</dt>
<dd>Ignora maiúsculas e minúsculas ("ignore case")</dd>
<dt>c</dt>
<dd>Pede confirmação em cada alteração.</dd>
</dl>
Concluindo: para substituir "void" por "int\*" em todo o arquivo mas apenas no
começo da linha, ignorando se está em maiúsculas ou minúsculas (porque o
estagiário pensou que estava digitando uma monografia), mas confirmando cada
mudança, você faria `:%s/^void/int*/ic` (como é apenas no começo da linha e nós
forçamos isso na expressão regular -- o `^` ali -- não precisamos usar a flag "g",
já que não teria efeito nenhum).
[^1] E, mas pra frente, veremos que existem plugins que deixam esta parte mais
fácil.
[^2] Na verdade, não e um par mas, de novo, fazer substituição em apenas uma
linha não é muito útil, principalmente considerando os comandos que o VIM
tem para movimentação do cursor.
{{ chapters(prev_chapter_link="./07-procurar-varios-arquivos", prev_chapter_title="Macros de Teclado", next_chapter_link="./09-splits", next_chapter_title="Splits") }}

BIN
content/books/uma-licao-de-vim/09-splits/all.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
content/books/uma-licao-de-vim/09-splits/horizontal-split.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

114
content/books/uma-licao-de-vim/09-splits/index.md

@ -0,0 +1,114 @@
+++
title = "Splits"
date = 2015-12-22
+++
Essa é a parte em que você vai passar uma hora dividindo a tela em pedacinhos
cada vez mais pequenos.
<!-- more -->
Até agora, enquanto falávamos de editar textos no VIM, vimos apenas como editar
um arquivo por vez. Existem formas de editar mais de um arquivo (usando `:e` e
`:e#{número}`) mas estas estão longe de serem fáceis de serem utilizadas.
Existem duas formas de manter dois (ou mais) arquivos abertos ao mesmo tempo.
Uma delas são "splits". Basicamente, splits permitem que você "reparta" a tela
em pedaços, podendo mostrar outros arquivos (ou até mesmo outra vez o mesmo
arquivo).
Para criar splits, existem dois comandos que devem ser usados em modo de
comando: `:sp` e `:vsp`. Ambos comandos aceitam o nome do arquivo a ser aberto no
novo split; se não for passado o nome de um arquivo, o arquivo que já está
aberto será carregado.
A diferença entre eles é que `:sp` irá criar um split horizontal...
![](horizontal-split.png)
... enquanto que `:vsp` irá criar um split vertical.
![](vertical-split.png)
Dentro de cada split, comandos executados irão afetar apenas o buffer atual: `:w`
irá salvar apenas o arquivo apresentar no split atual, `:e` irá abrir um arquivo
no split atual e assim por diante.
Note que eu falei "buffer atual". Como falei antes, "buffer" é o nome dado para
a representação do arquivo em memória e que tanto `:sp` quanto `:vsp` sem
parâmetros irão abrir um split com o arquivo atual -- que, na verdade, é o
buffer atual. Se você fizer isso e começar a editar o texto em um dos splits, o
conteúdo do outro também irá mudar, já que ambos estão apresentando o mesmo
buffer.
Para fechar um split, basta fechar o arquivo, tanto com `:q` quanto `:wq` ou
qualquer outro comando que feche um arquivo. O split será removido e o cursor
irá para o próximo split. Se não houverem mais splits, o VIM irá fechar, como
já vinhamos vendo desde o começo.
E sim, você pode fazer quantos splits e de formas diversas quantas vezes quiser
(até que não sobre mais espaço na tela, quer dizer).
![](all.png)
Para "manusear" splits, você irá utilizar comandos que começam com, em modo
normal, `[Ctrl]w`. `[Ctrl]w`, por si só, não faz nada (a não ser que você
repita o comando, mas isso é outra coisa) e requer uma ação a ser executada no
split (assim como alguns comandos requerem uma movimentação).
## [Ctrl]wj ou [Ctrl]w[direcional para baixo]
Move o cursor para o split abaixo do atual. Se não houverem outros splits
abaixo do atual, permanece no mesmo. Aceita um número de repetiçoes, ou seja,
`3[Ctrl]wj` irá imediatamente pular para o 3o. split abaixo do atual.
## [Ctrl]wh ou [Ctrl]w[direcional para a esquerda] e [Ctrl]wk ou [Ctrl]w[direcional para cima] e [Ctrl]wl ou [Ctrl]w[direcional para a direita]
O mesmo que [Ctrl]wj, mas indo para o split da esquerda, acima ou direita,
respectivamente.
## [Ctrl]w+ e [Cltr]w-
Aumenta ou diminui o tamanho do split em uma linha. Se for passado um número
antes do comando -- por exemplo `3[Ctrl]w+` -- o número de linhas afetas será o
número indicado.
## [Ctrl]w> e [Ctrl]w<
O mesmo que `[Ctrl]w+` e `[Ctrl]w-`, mas altera o número de colunas ao invés do número de linhas.
## [Ctrl]w\_ e [Ctrl]w|
Deixa o split com o maior altura possível (ou seja, coloca o máximo de linhas
possíveis para o split) ou com a maior largura possível (ou seja, coloca o
máximo de colunas possíveis para o split).
## [Ctrl]w=
Altera o tamanho dos splits para que estes fiquem o mais equilibrados
possíveis.
## [Ctrl]wH, [Ctrl]wJ, [Ctrl]wK,/tt> e [Ctrl]wL
Move o split atual para o canto mais a esquerda, abaixo, acima ou direita,
respectivamente (note que a letra de movimentação está em maiúsculas).
## [Ctrl]ww
Move o cursor para o split anterior. Se você está em um split qualquer e fizer
`3[Ctrl]wj` para ir para o 3<sup>o</sup> split abaixo do atual, `[Ctrl]ww` irá
mover o cursor de volta para o split original (e `[Ctrl]ww` irá mover o cursor
de volta para o 3<sup>o</sup> split abaixo do atual).
## [Ctrl]wf
Abre o arquivo com o nome sob o cursor em um novo split.
Quando falei do grep, eu comentei que existe o comando `:cope` para abrir a
janela do Quickfix. Bom, se você quiser ficar pulando entre a janela do
Quickfix e o texto, os comandos `[Ctrl]w` acima irão ajudar.
Existem ainda alguns outros comandos para splits, mas veremos estes mais a
frente.
{{ chapters(prev_chapter_link="./08-localizar-substituir", prev_chapter_title="Localizar e Substituir", next_chapter_link="./10-abas", next_chapter_title="Abas") }}

BIN
content/books/uma-licao-de-vim/09-splits/vertical-split.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

44
content/books/uma-licao-de-vim/10-abas/index.md

@ -0,0 +1,44 @@
+++
title = "Abas"
date = 2015-12-22
+++
Essa é a parte me que você acha coisas que já fazia antes.
<!-- more -->
Além dos splits, que vimos no capítulo anterior, VIM também tem suporte à abas.
O mais interessante é que você pode usar abas tanto no VIM gráfico (também
chamado de GVim) quanto no console.
Para abrir um arquivo no VIM, sabemos que temos que usar o comando `:e`; para
abrir o arquivo em uma aba, o comando é `:tabe`.
Ao contrário de splits, criar uma nova aba sem passar um arquivo não cria uma
nova aba com o buffer atual; `:tabe` sem um nome de arquivo irá criar uma nova
aba com um buffer em branco. E sim, você pode abrir o mesmo arquivo em mais de
uma aba e as alterações feitas em uma irão refletir na outra.
Para pular entre abas, você poder usar o comando `gt` em modo normal ou `:tabn` em
modo de comando. Se você usar um número de repetições (p.ex. `3gt` ou `:tabn 3`) o
VIM irá pular diretamente para aquela aba (no caso, para a terceira), não
importando a aba atual. `gT` em modo normal ou `:tabp` move o cursor para a aba
anterior.
Se quiser mover abas de posição, você deve usar `:tabm`. `:tabm` irá mover a aba
atual para ficar depois da aba indicada (p.ex., `:tabm 3` irá mover a aba atual
para depois da terceira aba). `:tabm` também aceita parâmetros considerando a aba
atual: `:tabm +2` irá mover a aba atual duas abas pra frente (para a direita) e
`:tabm -2` irá mover a aba duas abas pra trás (para a esquerda).
Atalhos padrão para mover para a próxima aba do sistema operacional também são
aceitos por padrão. `[Ctrl][PageDn]` e `[Ctrl][PageUp]` no Linux e
`[Command][Shift]]` e `[Command][Shift][` no OS X, por exemplo. Como não existe
nenhum padrão para consoles, não há nenhum atalho padrão e devem ser usados os
comandos de seleção de abas que vimos antes.
Mais pra frente, quando estivermos falando do arquivo de configuração, eu vou
explicar um "truque" para pular diretamente para a aba desejada, assim como
funciona no Firefox e no Chrome.
{{ chapters(prev_chapter_link="./09-splits", prev_chapter_title="Splits", next_chapter_link="./11-config", next_chapter_title="Arquivos de Configuração") }}

162
content/books/uma-licao-de-vim/11-config/index.md

@ -0,0 +1,162 @@
+++
title = "Arquivos de Configuração"
date = 2015-12-22
+++
Essa é a parte em que eu menti.
<!-- more -->
Lembram que bem no começo, quando estávamos falando dos modos de execução, eu
comentei que o modo Ex não era usado?
Bom, eu menti. MUAHAHAHAHA!
![](muahaha.jpg)
Na verdade, o Modo Ex não é chamado comumente, mas os arquivos de configuração
do VIM são um grande amontoado de comandos executando em modo Ex.
E o que é o modo Ex, afinal de contas? O modo Ex nada mais é que o modo de
comando sem a necessidade de usar `:` na frente de todos os comandos. Como
ficaria complicado para, por exemplo, entrar no modo Ex, executar e arquivo,
sair do modo ex e entrar em modo de inserção, até o momento temos usado o modo
de comando para isso, já que economiza um monte de tecladas. Como não iremos
ficar indo para o modo de inserção o tempo todo, e não faz sentido fazer um
arquivo gigantesco com várias linhas começando com `:`, também faz sentido que o
arquivo de configuração seja executado em modo Ex.
O VIM tem um arquivo de configuração global (conhecido com "vimrc") e um arquivo
para execução em modo gráfico ("gvimrc")[^1]. Ainda, existem duas versões de cada
um destes arquivos: uma versão global para todos os usuários e uma versão
definida para o usuário atual. Daqui pra frente, iremos ver as configurações do
usuário, já que estas sobrepõem as globais.
"vimrc" e "gvimrc" ficam no diretório dos dados do usuário; em qualquer um dos
sistemas operacionais hoje, você consegue descobrir o diretório destes arquivos
com `:echo $HOME` dentro do próprio VIM. Apenas note que embora eu venho chamando
os arquivos de vimrc e gvimrc, os nomes são, na verdade, ".vimrc" e ".gvimrc" (ou
"\_vimrc" e "\_gvimrc" no caso do Windows).
Como existem muitas opções, não vou aqui explicar cada uma delas -- mas, no
próximo capítulo eu vou mostrar o arquivo que eu estou usando para servir de
guia.
O que você vai ver quando abrir um arquivo de configuração:
## set
`set` é, efetivamente, a forma de "setar" alguma configuração no VIM.
Existem dois tipos de configurações: As com valores e flags.
Flags é mais fácil de ser explicado: você simplesmente seta a configuração. Por
exemplo, fazer com que o VIM mostre uma coluna com o número de cada linha,
você pode usar `:set number` (ou simplesmente `set number` dentro do arquivo de
configuração). Para desligar uma opção deste tipo, você só precisa adicionar
"no" na frente (para desligar number é usado `:set nonumber`).
"Valores" é exatamente o que significa: Ao invés de ser uma simples flag, a
opção recebe uma string ou número. Por exemplo, `:set tabstop=4` irá definir que
o tamanho da tabulação é de 4 espaços. `:set notabstop` não tem efeito aqui, já
que não é uma flag.
Para fazer com que uma configuração volte ao seu valor/estado original, use
`:set {opção}&`; para verificar o valor de uma opção, use `:set {opção}?`.
Talvez a coisa não esteja muito clara aqui, mas quando examinarmos um arquivo
de configuração real, as coisas irão clarear.
## let
`let` é usado para definir o valor de uma variável. Uma variável tem sempre um
valor -- ou seja, não existem "variáveis flags". Variáveis são normalmente
utilizadas por plugins ou arquivos de sintaxe e, portanto, as variáveis que
você terá que usar vão depender do que você está usando.
(Obviamente, se você estiver escrevendo seu próprio plugin — que eu não vou
abordar aqui — o uso de variáveis vai ser praticamente obrigatório.)
## if
`if`, como em qualquer linguagem de programação, serve para execução
condicional. Você pode, por exemplo, verificar se alguma feature foi ativada na
compilação do binário, se alguma opção está ligada, etc.
Por exemplo, para verificar se o suporte à scripts Python foi adicionado, você
pode fazer:
```viml
if has('python')
" configuração em python vai aqui
end
```
Para verificar se alguma opção está ativa:
```viml
if &compatible
" configuração em modo de compatibilidade com o VI original
end
```
ou para conferir um valor:
```viml
if &t_Co > 2
" configuração quando há suporte a mais de 2 cores.
end
```
E assim por diante.
## map, imap (e outros)
`map` pode ser usado para mapear teclas para outras funções. Por exemplo `:map Y
y$` irá mapear "Y" para executar `y$` (copiar da posição atual do cursor até o fim
da linha). Com excessão de [Shift], qualquer modificador pode ser usado:
* C - para `[Control]`
* M - para `[Alt]` (que normalmente é chamado de "Meta" em sistemas Unix — e por isso "M")
* O - para `[Command]` (somente em Macs)
Por exemplo, `:map C-m yy` irá adicionar `[Ctrl]m` para copiar a linha inteira.
Ainda, a diferença entre `map` e `imap` é que `map` é global enquanto que
`imap` só irá funcionar em modo de inserção (e assim você pode imaginar o que
`nmap` e `vmap` fazem, certo?)
## au (ou autocmd)
Comandos que são executados em determinadas condições. Condições podem desde
"FileType" para ações confirme o tipo de arquivo e "BufRead", "BufWrite" e
relacionados quando um buffer for aberto ou fechado.
O que seriam os "relacionados"? Bom, alem de ser na leitura/escrita do arquivo,
podem ser adicionados comandos antes da execução ("BufReadPre", "BufWritePre"),
depois da execução ("BufReadPost", "BufWritePost") e durante ("BufReadCmd",
"BufWriteCmd").
(Existem ainda auto-comandos para quando o editor entrar em modo de edição,
abrir o VIM gráfico, VIM está fechando, e assim por diante. Para ver todos os
eventos, digite `:help autocmd-events`.)
Por exemplo, `au FileType smarty set ai` para ligar a auto-identação quando VIM
detectar que você está editando um arquivo Smarty (engine de templates para
PHP). Ou ainda `au BufRead set nocompatible` irá configurar o editor para entrar
em modo de não-compatibilidade com VI depois de abrir qualquer arquivo.
Ainda, é possível encadear auto-comandos, por exemplo, `autocmd FileType python
autocmd BufWritePre :%s/\s\+$//e` irá fazer com que quando o tipo de arquivo for
"python", seja criado um auto-comando que antes de salvar o arquivo, seja
executado um comando de substituição no buffer -- que remove espaços em branco
no final da linha).
(Se você está perdido com o que está vendo aqui, não se preocupe -- a tendência
é que, ao ver um arquivo de configuração real, você entenda o que está
acontecendo).
[^1] Existe um terceiro, .exrc, mas honestamente, em todo esse tempo usando o
VIM, eu nunca tinha ouvido falar que este arquivo sequer existia.
{{ chapters(prev_chapter_link="./10-abas", prev_chapter_title="Abas", next_chapter_link="./11-01-vimrc", next_chapter_title="Meu .vimrc") }}

BIN
content/books/uma-licao-de-vim/11-config/muahaha.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

468
content/books/uma-licao-de-vim/11.01-vimrc/index.md

@ -0,0 +1,468 @@
+++
title = "Meu .vimrc"
date = 2015-12-22
+++
Essa é a parte em que você vai ver um arquivo de configuração meio
estranho.
<!-- more -->
Como falamos sobre arquivo de configuração, eu vou mostrar o que eu tenho hoje
configurado no meu VIM, explicando o que cada comando faz. Boa parte do que eu
tenho veio da configuração global do VIM, que eu copiei apenas para garantir
que não importando onde eu esteja ou qualquer alteração que seja feita neste
arquivo, as funcionalidades que eu estou acostumado continuarão funcionando
como esperado.
```viml
set encoding=utf-8
```
Garante que os arquivos salvos estarão em UTF-8, ao invés de tentar converter
para o encoding do sistema operacional.
```viml
set nocompatible
```
Desativa o modo de compatilidade com o VI original. Existem algumas diferenças
entre ambos (por exemplo, depois de um fazer um undo (`u`), no VI original fazer
undo de novo desfazia o undo anterior (efetivamente, fazendo um "redo") e para
continuar fazendo undo, o primeiro comando depois de undo deveria ser `.`; no
VIM, fazer um undo depois de um undo irá continuar desfazendo o que foi entrado
no texto, até retornar ao estado original) e a não ser que você seja fã do VI
original, eu não recomendaria usar o modo de compatilibidade.
```viml
set backspace=indent,eol,start
```
Apenas garante que o backspace consiga remover identações, apagar o fim da
linha e o começo de uma linha (neste último, forçando a linha atual e se juntar
com a anterior). Esse é o funcionamento normal de qualquer editor.
```viml
" Don’t use Ex mode, use Q for formatting
map Q gq
" Map Y to do the same (well, almost) as the D command
map Y y$
```
Estes dois mapeamentos eu peguei da configuração global, mas nunca efetivamente
usei. Mas, por via das dúvida...
Ainda, uma coisa que eu não havia comentado: Comentários. Você pode comentar
qualquer linha começando a mesma com aspas (") sem as aspas finais (senão o VIM
irá interpretar o conteúdo como string). Então: Uma aspa, comentário; duas
aspas, string; mais de duas, erro.
```viml
if &t_Co > 2 ||&
syntax on
set hlsearch
endif
```
Ah, nosso primeiro encontro com ifs. Se o terminal tiver mais de duas cores
(`&t_Co > 2`) ou estivermos rodando em GUI (`has("gui_running")`) então o
suporte à sintaxes deve ser ligado (`syntax on`) e pesquisas devem marcar todas
as ocorrências encontradas no último comando de pesquisa(`set hlsearch`)[^1].
```viml
" ------------------------
" Those are my settings
" ------------------------
set tabstop=4 " tabs are displayed as 4 spaces
set shiftwidth=4 " by default, when auto-identing, add 4 spaces (or 1 tabstop)
set foldmethod=marker " fold on markers
set scrolloff=1 " always show one line around the cursor
set laststatus=2 " always show the status bar (’cause I like to see the line and column, always)
set showtabline=2 " always show the tabline
set showmatch " show matching bracket
set noerrorbells " no error bells
set autowrite " write the file when switching between files or something
set nowrap " do not wrap long lines
set nobackup " do not keep a backup file, use versions instead
set history=50 " keep 50 lines of command line history
set ruler " show the cursor position all the time
set showcmd " display incomplete commands
set incsearch " do incremental searching
set formatoptions=tcq " wrap with textwidth, wrap comments, insert commend leader (twice), format comments
set smartindent " smart identation
set number " show line numbers
set wim=longest,list " file auto-completion
set background=dark " to follow most of the colorschemes I use
set vb t_vb= " convert bells to visual bells and do nothing as visual bell
set t_Co=256 " 256 color terminals
let mapleader="," " use comma to start user-defined (in plugins) functions
```
Um grande bloco de configurações. Vamos ver um por um:
* `set tabstop=4`: Define o tamanho da tabulação. Se estiver usando o caractere
"tab" ao invés de espaço, estes caracteres serão mostrados como 4 espaços
(quando o padrão são 8).
* `set shiftwidth=4`: Quando o VIM for identar um pedaço de texto sozinho[^2]. Se
"shiftwidth" for igual a "tabstop" e você não tiver configurado para usar
espaços ao invés de tabulações (calma que eu já explico como se faz isso), o
VIM irá adicionar uma tabulação inteira; se "shiftwidth" for menor que
"tabstop", espaços serão usados; se "shiftwidth" for maior que "tabstop",
será usada uma mistura de tabulações e espaços até que o tamanho especificado
seja alcançado.
* `set foldmethod=marker`: "Folding" foi algo que eu não comentei até agora
porque eu até agora não consegui me aclimatar com folding (até porque eu não
consegui pensar num mnemônico para lembrar dos comandos). Mas, basicamente,
"folding" permite que você "oculte" partes do código com alguma condição.
Alguns arquivos de sintaxe definem início e fim de funções e isso pode ser
usado para ocultar toda uma função (apenas para exibição, a função continua
existindo lá). "marker" define que o método de folding são marcadores e os
marcadores padrão são "\{\{\{" para o início e "\}\}\}" para o fim.
* `set scrolloff=1`: Número de linhas que devem sempre ficar visíveis ao redor do
cursor. "1" significa que antes de chegar à primeira ou última linha da tela,
o VIM irá rolar o texto e apresentar a linha anterior (ou próxima) -- enquanto
possível.
* `set laststatus=2`: Quando estávamos vendo splits, você deve ter notado que o
VIM adicionou uma barrinha indicando a posição do cursor (e talvez mais
algumas outras informações). Esse é o padrão para "1" (mostrar a barra de
status quando houver splits); "0" nunca mostra e "2" mostra sempre.
* `set showtabline=2`: Assim como "laststatus", se você estava vendo abas em modo
de console, deve ter reparado que a linha com as abas aparecia apenas quando
haviam duas ou mais abas. "2" define que essa linha de abas deve ser sempre
mostrada, mesmo quando há apenas uma aba.
* `set showmatch`: Quando estiver sobre um caractere como parênteses, colechetes
ou chave, faz o highlight do elemento que abre ou fecha o correspondente.
* `set noerrorbells`: Se ocorrer um erro, não utilize erros sons para
notificações[^3].
* `set autowrite`: Quando o VIM passar o controle para outro aplicativo ("grep",
"make" ou mesmo o "shell"), salva o arquivo atual antes de passar a execução.
* `set nowrap`: Quando uma linha for maior que a tela, desabilita a "quebra" da
linha e, com isso, é necessário "rolar" o conteúdo horizontalmente para ver o
resto. Um aviso: se você usar "wrap" (`set wrap`) o VIM vai continuar lidando a
linha como uma coisa só, desconsiderando como a mesma está sendo apresentada;
assim, se você estiver na primeira parte de uma linha que foi quebrada por
wrap, usar qualquer comando que vá para a próxima linha irá ir para a próxima
linha, não para a parte quebrada.
* `set nobackup`: Não grava arquivos de backup. Por padrão, antes de salvar um
arquivo, o VIM guarda uma cópia do original com o mesmo nome seguido de "~".
* `set history=50`: Quando você usa um comando, o VIM pode guardar esse comando
para execução futura, como o prompt do shell. Aqui é definido quantos destes
comandos são guardados.
* `set ruler`: Sempre que possível, mostre a posição do cursor. Se "laststatus"
for "0" (ou "1" e não houver nenhum split), a posição é exibida na última
linha da tela, no canto direito; se "laststatus" for "2" (ou "1" e houver
pelo menos um split), a posição é exibida dentro da barra de status[^4].
* `set showcmd`: Você deve ter notado que comandos que esperam mais informações
(por exemplo, aqueles que requerem uma movimentação) não são mostrados em
lugar algum. "showcmd" irá mostrar o comando até que ele seja concluído.
* `set incsearch`: Enquanto você estiver digitando uma pesquisa, já vai
posicionando o cursor na primeira ocorrência encontrada. "noincsearch" irá
manter o cursor na mesma posição até que o mesmo seja concluído.
* `set formatoptions=tcq`: Opções de formatação de textos. Cara um dos caracteres
representa algo diferente: "t" indica que se "textwidth" estiver definido, o
editor deve quebrar as linhas[^5]; "c" significa que se o texto for quebrado
durante um comentário (definido pela sintaxe atual), um novo caractere de
comentário deve ser adicionado; "q" indica que comentários podem ser
quebrados por "textwidth".
* `set smartindent`: Utiliza identação inteligente, se a sintaxe não definir
nenhuma. Existem quatro tipos de identação: Nenhuma ("nosmartindent")
indicando que ao adicionar uma nova linha, nenhuma identação é adicionada;
"autoindent" para que novas linhas tenham a mesma identação da linha
anterior; "smartindent", que tenta usar o último caractere da linha para
identificar se deve ser adicionada uma nova identação ou não (por exemplo,
parênteses e chaves adicionam identação); e "cindent" que tenta seguir o
padrão para C. Note que essa configuração só vale para arquivos que não
definem uma identação no seu arquivo de sintaxe (que são bem poucos).
* `set number`: Adiciona uma área na esquerda da tela com o número da linha na
própria linha.
* `set wim=longest,list`: Duas coisas aqui: 1) comandos de set tem um nome
longo e um nome curto e "wim" é o nome curto para "wildmode"; 2) "wildmode"
define como serão completados os nomes dos arquivos quando você usar um
comando para abrir arquivos e usar [Tab] para tentar completar o nome do
arquivo automaticamente. "longest,list" emula o padrão de shells como Bash.
* `set background=dark`: Alguns colorschemes (temas de cor) definem dois
padrões de cores, um claro e um escuro. "background=dark" define que, na
existência de dois padrões, o padrão escuro deve ser usado.
* `set vb t_vb=:` Mais uma coisa nova: Duas configurações em uma linha só. Na
verdade, todas as configurações apresentadas aqui poderiam ficar em uma linha
só, mas eu mantive estas duas juntas por um motivo: Como defini
"noerrorbell", o VIM cai para "visualbell" (nome longo de "vb"), que causa um
"flash" no conteúdo (as cores do tema rapidamente se invertem e voltam ao
normal) quando ocorre um erro; no caso, eu defini que sim, eu quero que o
tipo de erro visual ("`t_vb`") seja... nada. Assim, quando ocorre um erro, o VIM
não bipa nem faz flash.
* `set t_Co=256`: Define que o terminal terá, por padrão, 256 cores. Algumas
vezes o VIM não consegue descobrir se o terminal tem suporte a mais de 16
cores ou não e esta configuração reafirma que sim, o terminal é capaz de usar
256 e, portanto, colorschemes podem ter mais cores.
* `let mapleader=","`: Define a variável "mapleader". "mapleader" é o caractere
que o VIM utiliza em alguns plugins[^5], quando estes define comandos em modo
normal. O padrão é "/", eu mudei para vírgula.
```viml
if has("autocmd")
```
Eu falei sobre auto-commands, mas na verdade é uma feature que deve ser
adicionada na hora de compilar o VIM. Entretanto, até agora eu não vi um pacote
disponível que não tenha essa feature. Apenas para garantir, verificamos se a
funcionalidade foi adicionada mesmo ou não.
Boa parte do que tem daqui pra frente ou eu já falei ou veio do arquivo de
configuração global.
```viml
filetype plugin indent on
```
Ativa as configurações vindas do arquivo de sintaxe. Quando eu disse que as
configurações de auto-identação vem do arquivo de sintaxe, é esta linha que
garante que isso vai acontecer.
```viml
autocmd FileType text setlocal textwidth=78
```
Quando o tipo de arquivo for texto ("text") define localmente para aquele
buffer que o tamanho da linha é de 78 colunas. Como "formatoptions" tem um "t",
o VIM irá automaticamente quebrar a linha (adicionando um [Enter] antes da
palavra que passa do limite) na coluna 78.[^7]
```viml
" When editing a file, always jump to the last known cursor position.
" Don’t do it when the position is invalid or when inside an event handler
" (happens when dropping a file on gvim).
autocmd BufReadPost *
\ if line("’\"") > 0 && line("’\"") <= line("$") |
\ exe "normal g`\"" |
\ endif
```
Este comando existe no arquivo de configuração global, mas é bem interessante.
Lendo exatamente o que ele faz: Depois de carregar qualquer arquivo, se a linha
que o marcador de saída do buffer existir e estiver entre o começo do arquivo e
antes do fim da linha, executa, em modo normal, `g\"`, que efetivamente "pula"
para o marcador de saída do buffer. A diferença entre `\`` e `g\``` é que `g`` não mexe
no jumplist quando pular (logo, ```` não vai funcionar). Como não mexer no
jumplist é algo que não se faz normalmente, nem comentei antes.
```viml
autocmd FileType python autocmd BufWritePre <buffer> :%s/\s\+$//e
```
Eu falei deste comando antes, mas vamos de novo: Quando o tipo de arquivo for
"python", adicione um auto-comando que antes de gravar o buffer, execute, no
buffer, a expressão regular `/\s\+$//e`, que basicamente, serve para remover
espaços em branco no final das linhas.
```viml
" omni completion
au FileType python setlocal ofu=pythoncomplete#Complete
au FileType javascript setlocal ofu=javascriptcomplete#CompleteJS
au FileType html setlocal ofu=htmlcomplete#CompleteTags
au FileType css setlocal ofu=csscomplete#CompleteCSS
au FileType xml setlocal ofu=xmlcomplete#CompleteTags
au FileType php setlocal ofu=phpcomplete#CompletePHP
set completeopt-=preview
```
Eu não falei do Omni-complete antes porque até o momento o auto-complete
(`[Ctrl]p` e `[Ctrl]n` em modo de inserção) tem resolvido todos meus problemas.
Mas, em teoria, o omni-complete consegue detectar quais elementos fazem sentido
no contexto atual, "encherga" coisas que estão no arquivo de tags e conhece
toda a sintaxe da linguagem que você está usando. Mas, realmente, o simples
auto-complete já resolve 99% dos problemas que tenho encontrado.
E desliga a apresentação dos resultados do omni-complete na janela de preview,
que é semelhante ao quickfix, mas na minha experiência, ela quebra muito o
fluxo de edição do código.
Se você quiser tentar, para usar o omni complete basta usar `[Ctrl]x` seguido de
`[Ctrl]o`.
```viml
" ------------------------
" Auto-commands
" ------------------------
" default python style
" (use spaces instead of tabs (expandtab), uses 4 spaces for tabs (tabstop),
" when auto-indenting, also use 4 spaces (shiftwidth), when deleting text, 4
" spaces are a tab (softtabstop) and break the line at column 78 (textwidth))
au FileType python setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 textwidth=78
" reStructured files follow python closely, but use 3 tab stops instead of 4
au FileType rst setlocal expandtab tabstop=3 sw=3 sts=3 textwidth=78
" templates (Jinja2 in this case) will use tabs instead (to reduce file size)
au FileType htmldjango setlocal noet tabstop=4 shiftwidth=4 softtabstop=4 textwidth=0
au FileType jinja setlocal noet tabstop=4 shiftwidth=4 softtabstop=4 textwidth=0
" the smarty filetypes doesn’t have any sort of indentation, so we set it to
" auto
au FileType smarty setlocal ai
" PHP break lines at column 79, like Python
au FileType php setlocal textwidth=79
" svn (when editing svn commit messages, break lines at
" column 70)
au FileType svn setlocal tw=70
" email (mostly mutt stuff)
au FileType mail setlocal spell spelllang=en
" JavaScript (who though those were "good" defaults?)
au FileType javascript setlocal expandtab tabstop=2 sw=2 sts=2 textwidth=0
```
Uma série de auto-comandos baseados no tipo de arquivo. Como eu falei antes
neste capítulo, você pode botar vários "set" um atrás do outro separados por
espaço e sets tem versões com nomes longos e nomes curtos ("sts" é um atalho
para "softtabstop", "sw" para "shiftwidth", "noet" para "noexpandtabs", "ai"
para "autoindent" e "tw" para "textwidth"). E sim, eu sei que não manti nenhum
padrão no meio, mas pelo menos agora você alguns nomes curtos para algumas
opções.
```viml
else
set autoindent " always set autoindenting on
endif " has("autocmd")
```
E, se autocmd não estiver disponível, simplesmente seta auto-indent.
```viml
" ------------------------
" mapings
" ------------------------
" Easy switching between tabs (just use Alt+<tab number>)
if has(‘mac’)
map <D-1> :tabn 1<CR>
map <D-2> :tabn 2<CR>
map <D-3> :tabn 3<CR>
map <D-4> :tabn 4<CR>
map <D-5> :tabn 5<CR>
map <D-6> :tabn 6<CR>
map <D-7> :tabn 7<CR>
map <D-8> :tabn 8<CR>
map <D-9> :tabn 9<CR>
map <D-0> :tabn 10<CR>
imap <D-1> <ESC>:tabn 1<CR>a
imap <D-2> <ESC>:tabn 2<CR>a
imap <D-3> <ESC>:tabn 3<CR>a
imap <D-4> <ESC>:tabn 4<CR>a
imap <D-5> <ESC>:tabn 5<CR>a
imap <D-6> <ESC>:tabn 6<CR>a
imap <D-7> <ESC>:tabn 7<CR>a
imap <D-8> <ESC>:tabn 8<CR>a
imap <D-9> <ESC>:tabn 9<CR>a
imap <D-0> <ESC>:tabn 10<CR>a
else
map <M-1> :tabn 1<CR>
map <M-2> :tabn 2<CR>
map <M-3> :tabn 3<CR>
map <M-4> :tabn 4<CR>
map <M-5> :tabn 5<CR>
map <M-6> :tabn 6<CR>
map <M-7> :tabn 7<CR>
map <M-8> :tabn 8<CR>
map <M-9> :tabn 9<CR>
map <M-0> :tabn 10<CR>
imap <M-1> <ESC>:tabn 1<CR>a
imap <M-2> <ESC>:tabn 2<CR>a
imap <M-3> <ESC>:tabn 3<CR>a
imap <M-4> <ESC>:tabn 4<CR>a
imap <M-5> <ESC>:tabn 5<CR>a
imap <M-6> <ESC>:tabn 6<CR>a
imap <M-7> <ESC>:tabn 7<CR>a
imap <M-8> <ESC>:tabn 8<CR>a
imap <M-9> <ESC>:tabn 9<CR>a
imap <M-0> <ESC>:tabn 10<CR>a
endif
```
Ok, este é um mapeamento que eu sempre achei interessante:
1. Existe uma diferença entre OS X e outros sistemas que a tecla "Command" é
usada para praticamente tudo, inclusive trocar as abas nos browsers; já em
outros sistemas, a tecla para isto é "Alt". Um VIM compilado para OS X tem,
estranhamente, uma feature chamada "mac"; checando isso você consegue
descobrir se está rodando num OS X ou não.
2. Mapeamentos diferentes para modo normal e de inserção: Se estiver no modo
normal, basta usar `:tabn {número}` para pular diretamente para uma aba (`:tabn
{número}` é a versão de modo de comando do `{número}gt` do modo normal[^8][^9]);
quando estiver em modo de inserção, saida do modo de inserção (simulando
pressionar [Esc] com <ESC>, execute o mesmo comando usado no modo normal
para pular para uma aba específica e volte para o modo de inserção ("a").
BOOM! Você acabou de adicionar no VIM uma feature que existe nos browsers.
```viml
" custom PHP syntax file configuration
let php_smart_members=1
```
Essa é uma das coisas que eu falei antes: "let" permite definir variáveis,
incluindo algumas dentro do arquivo de sintaxe. No caso "php_smart_members"
altera a forma como funções membro de uma classe em PHP seja coloridas de forma
diferente.
O resto do meu arquivo de configuração é usado para manter plugins, que eu vou
explicar o que cada um faz mais pra frente. Se você quiser ver o arquivo
original, ele pode ser encontrado no meu repositório de configurações (que eu
uso para manter as configurações sincronizadas entre meu computador pessoal e o
computador do trabalho).
[^1] Apenas para fazer um gancho com o que foi falado anteriormente: No
capítulo #2.5, quando estava falando de comandos do modo de comando, eu
comentei sobre `:noh` para desmarcar as ocorrências encontradas no último
comando de pesquisa. Bom, `hlsearch` faz com que estas ocorrências sejam
marcadas e se você colocar set `nohlsearch`, nenhuma ocorrência será marcada
e você nunca irá precisar usar `:noh`.
[^2] ... ou quando você usar `>{movimentação}` ou `<{movimentação}` em modo normal,
que eu não havia mencionado antes porque estávamos falando de edição de
qualquer texto e não de código fonte. `>>` irá adicionar um "shiftwidth"
para a direita e `<<` irá remover um "shiftwidth" na esquerda.
[^3] Aqui acabamos de ver duas configurações de flags: Uma ativando uma
configuração ("showmatch") e outra desligando ("noerrorbells").
[^4] Uma pequena nota sobre as posições apresentadas: algumas vezes, você verá
o VIM apresentar a coluna como "{número}-{número}". Isso acontece
principalmente quando se está usando tabulações ao invés de espaços e o
VIM está indicando a contagem de caracteres na esquerda e a coluna de
exibição na direita (ou seja, o valor da direita é {quantidade de
caracteres menos tabulações} + ({quantidade de tabulações} * {"tabstop"}).
[^5] E quando digo "quebrar" eu quero dizer "quebrar" mesmo: Enquanto que
"wrap" irá cuidar apenas da apresentação do texto, "textwidth" com
"formatoptions=t" irá inserir um caractere de nova linha quando a palavra
digitada ultrapassar o limite indicado.
[^6] Note que o VIM define uma variável para isso, mas nada garante que o autor
do plugin utilizou essa tecla. Existe um padrão em usar "mapleader" como início
de comando normal de um plugin, mas nada obriga o autor do plugin à usar
esta tecla.
[^7] E, recapitulando, para reformatar o parágrafo caso você altere alguma
coisa no texto, use gq sobre a região do mesmo. O VIM irá considerar o
"textwidth" na hora de reformatar.
[^8] E não, não são todos os comandos que tem versões tanto em modo normal
o quanto em modo de comando.
[^9] E porque eu usei `:tabn {número}` ao invés de `{número}gt`? Porque quando eu
pesquisei como pular de abas, este foi o primeiro resultado que eu encontrei.
{{ chapters(prev_chapter_link="./11-config", prev_chapter_title="Arquivos de Configuração", next_chapter_link="./11-02-gvimrc", next_chapter_title="Meu .gvimrc") }}

108
content/books/uma-licao-de-vim/11.02-gvimrc/index.md

@ -0,0 +1,108 @@
+++
title = "Meu .gvimrc"
date = 2015-12-22
+++
Essa é a parte em que veremos mais do mesmo.
<!-- more -->
Na parte de configurações, eu falei de dois arquivos, "vimrc" e "gvimrc". Vocês já
viram o que eu fiz com meu vimrc, então acho justo que vejam também o que eu
fiz com o meu gvimrc.
Para que fique claro, vimrc sempre é lido, não importa qual executável do VIM
você está usando. gvimrc é lido depois do vimrc somente quando você iniciar um
VIM gráfico.
Como o arquivo é bem menor (já que o grosso da configuração fica no vimrc),
este é o arquivo inteiro que eu estou usando:
```viml
set guioptions=aegit " basically, all options, except the scrollbar, menu and toolbar
set columns=116 " number of columns (uses most of my screen, in this case)
set cursorline " highlight the line with the cursor
set colorcolumn=+2 " put a marker at textwidth + 2
set linespace=1 " spread the lines a bit, adding a 1px line above all
if has('mac')
set gfn=monofur:h15 " My screen size sucks, mkay?
set lines=63 " number of lines, based on my screen size and font
else
set gfn=monofur\ for\ Powerline\ 12
set lines=54
endif
```
E explicando:
* `set guioptions=aegit`: Define a aparência do editor em modo gráfico. Eu
prefiro um editor limpo, sem menus, toolbars ou (e isso talvez soe estranho
para alguns), sem barra de rolagem. Em ordem, as opções ativas são:
`a`: Quando estiver fazendo a seleção com o modo visual, já copia o selecionado
para a área de transferência. No caso de sistemas Unix, isso significa que
selecionar algo com o modo visual é o mesmo que selecionar com o botão da
esquerda (e que pode ser colado diretamente usando o botão do meio).
`e`: Mostra abas (se estiver configurado para mostrar abas com “showtabline” --
que eu configurei para mostrar sempre no meu vimrc).
`g`: Mostra opções do menu desabilitadas. O normal é que opções desabilitadas
sequer apareçam. Esta opção só faz sentido se o menu estiver presente (com a
opção m no "guioptions") que, como você pode perceber, eu não estou usando.
Em alguns sistemas (por exemplo, OS X) o controle do menu não faz sentido
porque o sistema operacional sempre tem um menu ativo. Assim, quando não há
necessidade de menu, esta opção é desnecessária; quando não há escapatória do
menu, pelo menos todas as opções serão visíveis.
`i`: VIM tem um ícone (sim você pode configurar para o que o VIM não mostre um
ícone em lugar algum). De novo, dependendo do sistema operacional, esta opção
não tem efeito algum porque o próprio sistema adiciona o ícone do launcher.
`t`: Menus podem ser arrancados (quando possível). Esta é uma funcionalidade
que o GTK+ até a versão 2 tinha, que permitia que os menus fosse
"desconectados" da área de menu, o que facilita bastante na hora de
selecionar colorschemes (e como você pode adicionar um menu a qualquer hora
com `:set guioptions+=m`, o que eu normalmente faço -- ou melhor, fazia -- era
adicionar um grupo de novos colorschemes, ativar o menu, "arrancar" o menu de
colorschemes e sair selecionando opções até achar um colorscheme
interessante).
* `set columns=116`: Número de colunas da janela do editor. Se a sua tela não
tiver como apresentar 116 colunas (pelo tamanho da fonte e da tela, ou por
alguma restrição do gerenciador de janelas), o VIM irá reduzir a quantidade
de colunas até que a janela caiba completamente.
* `set cursorline`: A linha onde o cursor se encontra tem highlight. E, caso
você esteja se perguntando, existe um `set cursorcolumn` que mostra a coluna do
cursor. Tanto "cursorline" quanto "cursorcolumn" funcionam em console, mas a
forma como a linha é apresentada no meu colorscheme é... estranha.[^1]
* `set colorcolumn=+2`: Define uma coluna para ser marcada com uma cor
diferente. Se for usado uma opção relacional (não um valor absoluto, mas algo
começando com "+" ou "-"), então cursorline vai usar o "textwidth" atual.
* `set linespace=1`: Define um espaçamento entre linhas, em pixeis. No caso,
"1" significa que as linhas terão a altura requisitada pela fonte mais um
pixel.
* `set lines=???:` Define a quantidade de linhas do editor. Segue todas as
considerações feitas em “columns”. Ainda, aqui eu estou usando de novo a
checagem de funcionalidade (`has()`) para ter configurações diferenciadas no OS
X e em outros sistemas operacionais.
* `set gfn=???`: Define a fonte a ser usada ("gfn" é a forma curta de "guifont").
Note que fontes que tem espaço no meio tem que ter os espaços "escapados"
(com `\` antes do espaço) ou como strings. Se você quiser selecionar alguma
fonte mas não faz idéia do nome da fonte, use `:set gfn=*` para que o VIM
mostre o seletor de fontes do sistema; depois que escolher uma fonte, se
quiser que o VIM descreva como usar, use `:set gfn` e cole o resultado no seu
arquivo de configuração.
[^1] E, lembrando mais uma vez: Para desligar opções deste tipo, coloque "no" na
frente. Para desligar o highlight da linha atual do cursor, use `:set
nocursorline`; para desligar o highlight da coluna atual do cursor, use
`:set nocursorcolumn`.
{{ chapters(prev_chapter_link="./11-01-vimrc", prev_chapter_title="Meu .vimrc", next_chapter_link="./12-modelines", next_chapter_title="Modelines") }}

70
content/books/uma-licao-de-vim/12-modelines/index.md

@ -0,0 +1,70 @@
+++
title = "Modelines"
date = 2015-12-22
+++
Essa é a parte em que você ignora seus arquivos de configuração.
<!-- more -->
Bom, agora você sabe como configurar seu VIM, mudar configurações baseadas no
tipo de arquivo... Mas o que fazer se um arquivo tem uma configuração
completamente diferente do resto?
A solução são modelines. Modelines são linhas que você pode adicionar no seu
arquivo e o VIM, quando carregar o arquivo, irá mudar suas configurações
baseadas nesta linha.
A sintaxe da linha é, simplesmente: `vim: set {configurações}:`.
"Mas é um código fonte e se eu colocar um 'vim' no meio, o compilador vai
reclamar!", você deve estar pensando agora. Acontece que o VIM procura uma linha
válida em qualquer lugar, desconsiderando a sintaxe atual. Se você colocar o
modeline dentro de um comentário, o VIM ainda vai encontrar e ainda vai
processar o modeline e ainda vai trocar as configurações do editor (apenas para
aquele arquivo).
Por exemplo, para garantir que meus templates Jinja fiquem com a sintaxe
correta (usando a sintaxe de templates do Django), eu tenho colocado, como
última linha do arquivo
```django
{# vim: set ft=htmldjango: #}
```
"ft", no caso, é o nome curto para "filetype", que define o tipo de arquivo que
está sendo usando e qual sintaxe será utilizada. E o par `{#` e `#}` são
comentários do template e completamente ignorados no resultado final.
Assim como vimos antes, várias configurações podem ser usadas no mesmo set.
Usando o exemplo acima, se eu quisesse que meus templates usassem tabulações ao
invés de espaços para identação mas fossem apenas 2 espaços por tabulação, eu
poderia colocar, no final do arquivo:
```django
{# vim: set ft=htmldjango noet ts=2 sts=2 sw=2: #}
```
O VIM ainda aceita que as opções sejam separadas em vários comandos, com a
adição de ":":
```django
{# vim: set ft=htmldjango:set noet:set ts=2:set sts=2:set sw=2: #}
```
Mas realmente não faz sentido, faz?
E apenas um aviso: Algumas distribuções Linux desligam modelines no arquivo
global (adicionando `set nomodeline` no arquivo global) e, assim, modelines são
completamente ignorados, sob a desculpa de "segurança". Tentando descobrir o
porque descobri o seguinte: O único comando que pode ser usado em modelines é
"set", ou seja, não é possível colocar um modeline que abra outro arquivo, ou
mude o diretório atual ou qualquer outra coisa; nem todas as configurações pode
ser alteradas (infelizmente, o help do VIM não lista quais são e quais não são
permitidas); e, aparentemente, a pior forma de "ataque" seria alguém colocar um
"textwidth" e seu código ficar torto na primeira edição. Se você achar que
modelines não estão sendo executados, você pode adicionar no seu vimrc `set
modelines` para que modelines sejam processados (ou troque por uma distribuição
que não tenha configurações que não fazem sentido).
{{ chapters(prev_chapter_link="./11-02-gvimrc", prev_chapter_title="Meu .gvimrc", next_chapter_link="./13-tags", next_chapter_title="Tags") }}

60
content/books/uma-licao-de-vim/13-tags/index.md

@ -0,0 +1,60 @@
+++
title = "Tags"
date = 2015-12-22
+++
Essa é a parte em que você vai entender Unix um pouco.
<!-- more -->
Eu expliquei antes que haviam dois comandos para utilizar tags, `[Ctrl]]` e
`[Ctrl]t`. Existem duas coisas que eu não expliquei: O que são tags e de onde
elas vem.
Primeiro, tags são qualquer palavra que o editor encontre no arquivo de tags. E
o arquivo de tags pode ser definido em `:set tags`. Por padrão, são verificados
os arquivos `./tags` ("tags" no diretório atual do editor), `./TAGS`, `tags`
(arquivo "tags" em algum diretório de pesquisa) e `TAGS`.
Acontece que não é qualquer arquivo com este nome que o torna válido. Existem
um formato específico em que as coisas devem estar declaradas para serem
detectadas como tags. E o formato é
```
{tagname}{tagfile}{tagaddress}
```
(onde "tagname" é a tag em si, "tagfile" é o nome do arquivo onde a tag se
encontra e "tagaddress" é uma expressão Ex para encontrar a tag -- por exemplo,
"89" para ir para linha 89).
Sim, só isso. E eu sei que manter um arquivo assim é chato horrores, e por isto
existem ferramentas que já fazem isso. A mais completa de todas é "Exuberant
CTags"" e pode ser encontrada em praticamente todas as distribuições Linux
atuais, gerenciadores de pacotes do OS X e ainda vem um pacote para Windows.
A grande vantagem do Exuberant é a quantidade de linguagens suportadas. Assim,
se você estiver num projeto em Python e depois passar para um projeto em C,
você ainda pode usar o mesmo aplicativo.
A sintaxe gerado do Exuberant é "ctags {arquivos}", onde "{arquivos}" são os
arquivos a serem processados (expressões como "\*.py" são válidas) ou, da forma
mais simples "ctags -R", para que todos os arquivos do diretório atual e
subdiretórios sejam processados.
Uma vez que este arquivo tenha sido criado, dentro do editor você pode usar
`[Ctrl]]` para tentar achar a definição da tag (que, com o uso do Exuberant
significa definição de funções ou definições de variáveis) e `[Ctrl]t` para
retornar para a localização anterior. Se houver mais de um arquivo com uma
definição válida, o VIM irá mostrar uma lista das localizações e você poderá
selecionar qual deve ser acessada.
A única dica que sobra aqui é cuidar com arquivos minificados. Isso porque o
Exuberant entende arquivos CSS. Não que arquivos CSS sejam um problema, mas o
Exuberant coloca a expressão regular da linha onde a tag se encontra e, num
arquivo minificado, a expressão acaba sendo uma linha gigantesca, que fica se
repetindo em vários lugares do arquivo, deixando-o gigantesco. Se você tiver
algo desse tipo, use a opção "--exclude={expressão}", onde "{expressão}" é a
expressão regular que define o nome dos arquivos que devem ser ignorados.
{{ chapters(prev_chapter_link="./12-modelines", prev_chapter_title="Modelines", next_chapter_link="./14-01-vundle", next_chapter_title="Plugins - Vundle") }}

112
content/books/uma-licao-de-vim/14.01-vundle/index.md

@ -0,0 +1,112 @@
+++
title = "Plugins - Vundle"
date = 2015-12-22
+++
Essa é a parte em que começamos a mexer ao redor do VIM.
<!-- more -->
Vamos começar a ver como adicionar funcionalidades no VIM com plugins. E, para
isso, vamos ver Vundle, que é um gerenciador de plugins.
A pergunta que você deveria estar se fazendo agora é "E por que usar o
Vundle?". Na verdade, esta pergunta tem duas respostas:
A primeira é: Apesar de ser extremamente fácil de adicionar um plugin no VIM --
normalmente é uma questão de descompactar um arquivo dentro do diretório
`$HOME/.vim` -- a parte chata é manter os scripts atualizados (e ficar preso à um
arquivo compactado) e removê-los depois, se você encher o saco de um.
A segunda é: Vundle não é o único gerenciador de plugins para VIM, mas consegue
instalar plugins por conta própria (Pathogen requer que você baixe os plugins
manualmente, assumindo depois o controle para manter atualizado); a desvantagem
é que Vundle requer que os scripts tenham uma determinada estrutura de arquivos
e diretórios, mas praticamente todos os scripts hoje utilizam esta estrutura.
Então vamos lá, instalar o Vundle:
Primeiro, você deve baixar o plugin em si. Para isso, você tem que ter o Git
instalado e executar:
```
git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
```
Simplesmente, você está copiando o repositório do vundle para um diretório do
próprio VIM. Até aqui nenhuma surpresa, exceto que o diretório de plugins é
`$HOME/.vim/plugin` (ou `~/.vim/plugin`) e o clone colocou no diretório
`~/.vim/bundle`. Ou seja, o Vundle não está ativo como um plugin do VIM (ainda).
O Vundle faz isso de propósito, para que os scripts instalados com o Vundle não
se misturem com os plugins instalados manualmente.
A seguir, é preciso ativar o Vundle. Para isso, nós vamos adicionar o diretório
do Vundle no path do VIM e chamar o script de inicialização. Para isto,
adicione as seguintes linhas no seu vimrc:
```vim
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
```
Explicando: "rtp" é a forma curta de "runtimepath", que identifica os
diretórios onde o VIM irá procurar scripts, se preciso. No caso, estamos
adicionando o diretório do Vundle, que clonamos anteriormente. A seguir é
chamado o script de inicialização do Vundle.
Pronto! Agora o Vundle está instalado.
A questão é: E agora que o Vundle está instalado, "faz o que?"
O Vundle tem mais comandos disponíveis, entre eles `:Plugin "{bundle}"`[^1]. Este
comando adiciona um bundle/plugin/script na lista de bundles/plugins/scripts
gerenciados pelo Vundle. A única coisa que esse comando faz é adicionar o
bundle na lista; ele não vai instalar o bundle ainda, ele não vai remover o
bundle, ele não vai atualizar o bundle. Apenas adicionar na lista.
O parâmetro do comando, {bundle} pode ser:
* O nome de um plugin conforme listado no repositórios de scripts do VIM;
apenas uma string (por exemplo, `:Plugin "vundle"` para instalar este script
(que é a descrição do Vundle nos repositórios de script);
* O nome de um plugin no Github, no formato "{usuário}/{repositório}", que você
pode ver na parte superior de qualquer repositório (por exemplo, `:Bundle "
gmarik/vundle"` para instalar o Vundle a partir do repositório -- que tende a
ser atualizado com maior frequência);
* Uma URL, que pode ser clonada com Git (por exemplo, `:Plugin
"https://github.com/gmarik/vundle"` para fazer o mesmo que acima.
Uma vez que você tenha a lista de plugins que você quer no sistema, você pode
instalar todos usando `:PluginInstall`; se quiser remover um plugin, você
simplesmente o deixa fora da lista de plugins desejados e executa `:PluginClean`;
e, para atualizar os plugins que estão instalados, `:PluginUpdate.`
Acho que você já percebeu que o problema de se manter uma lista de plugins
manualmente é meio chato: Toda vez que você quiser verificar se há atualizações
dos plugins, você tem que entrar a lista inteira; se você esquecer de um plugin
e fizer `:PluginClean` irá remover esse plugin. Para evitar essa complicação,
você pode adicionar os comandos Plugin diretamente no seu vimrc[^2]. Assim, cada
vez que você usar qualquer comando do Vundle, você não precisa se preocupar em
lembrar de todos os plugins instalados.
E, como última dica, fica o seguinte: Logo após a linha do "call vundle#rc()",
adicione
```viml
Plugin 'gmarik/vundle'
```
.. que nada mais é que o repositório que fizemos o clone logo no começo; desta
forma, quando você fizer um `:PluginUpdate`, o próprio Vundle poderá ser
atualizado com a última versão disponível.
[^1] Lembram que eu falei que plugins poderiam adicionar novos comandos e que
estes teriam pelo menos a primeira letra em maiúsculas? Pois é...
[^2] Lembre-se também que o vimrc é um arquivo executado em modo Ex e o modo Ex
nada mais é que o modo de comando sem precisar colocar `:` na frente de cada
comando.
{{ chapters(prev_chapter_link="./13-tags", prev_chapter_title="Tags", next_chapter_link="./14-02-airline", next_chapter_title="Plugins - Airline") }}

BIN
content/books/uma-licao-de-vim/14.02-airline/airline-everything.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
content/books/uma-licao-de-vim/14.02-airline/airline-laststatus.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
content/books/uma-licao-de-vim/14.02-airline/airline-nofonts.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

110
content/books/uma-licao-de-vim/14.02-airline/index.md

@ -0,0 +1,110 @@
+++
title = "Plugins - Airline"
date = 2015-12-22
+++
Essa é a parte em que o "laststatus" fica interessante.
<!-- more -->
Quando estávamos falando de configurações, falamos de uma configuração chamada
“laststatus”. Esta configuração tem 3 valores possíveis:
* 0 – não apresenta a barra de status, nunca.
* 1 – apresenta a barra de status se houver pelo menos um split.
* 2 – sempre apresenta a barra de status.
E, conforme eu mostrei no meu arquivo de configuração, eu sempre deixo com 2".
Acontece que a barra de status não é tããão informativa assim.
![](laststatus.png)
Ela tem o básico, mas o básico não é o suficiente, sejamos honestos. É possível
adicionar mais informações setando "statusline" (que eu não vou entrar em
detalhes aqui, mas para configurar, você tem que usar letras únicas indicado
para cada coisa que deseja apresentar tal como se faz com "guioptions") mas,
mesmo assim, certas coisas tem que vir de scripts externos (por exemplo, para
mostrar o branch atual que você está) e, como eu falei, essa parte é meio
chata.
Para aliviar essa confusão, existe um plugin chamado "Vim-Airline", que tem uma
apresentação mais complexa e oferece mais informações, baseados plugins que
você tem instalado.
Ainda, o Airline é uma versão mais leve do Powerline, que na verdade passou de
ser um simples plugin para VIM para ser um plugin para praticamente tudo (hoje
eu uso o Powerline para configurar meu prompt do terminal, por exemplo) e
algumas coisas ainda são usadas do Powerline (por exemplo, as fontes, mas
esperem aí que eu já explico o porque o Airline usa fontes especiais.)
(Conforme formos passando a lista de plugins que eu tenho, vocês vão ver o
Airline mudando de formato com o tempo.)
Como falei do Vundle como gerenciador de plugins, vamos usar o mesmo para
instalar (e manter, no futuro) o Airline.
No seu vimrc, adicione o seguinte:
```viml
Plugin "bling/vim-airline"
```
E, revisando: `:Plugin` adiciona um plugin na lista de plugins gerenciados pelo
Vundle (e apenas isso, nada mais); por ter uma barra no meio, estamos falando
de um repositório do Github; para instalar o plugin, você precisa ou adicionar
o plugin na lista manualmente (com o comando `:Plugin`) ou reiniciar o VIM caso
você queria conferir se a configuração no seu vimrc está certa e fazer
`:PluginInstall.`
Se nada apareceu, é porque o seu "laststatus" não está em "2".
Se tudo deu certo, você verá o seguinte:
![](airline-nofonts.png)
Não que tenha melhorado muito, mas agora você tem informações sobre qual o modo
que você está atualmente (que vai mudar de cor conforme você passa para o modo
de inserção ou visual), o nome do arquivo, o tipo de arquivo (que define qual a
sintaxe está sendo usada), posição do cursor em relação ao todo do arquivo (em
percentual) e a posição absoluta do mesmo (em linhas em colunas).
Ok, duas coisas: Ainda não é muito melhor (embora a parte de mostrar o modo
ajude, acredite), mas temos alguns caracteres estranhos na barra.
É aí que entra a história do Powerline de novo: Os criadores do Powerline
usaram "posições" não usadas nas fontes unicode para adicionar outros
caracteres que são usados para melhorar a apresentação do status. Eles mantém
[um repositório com fontes já com os caracteres especiais](https://github.com/powerline/fonts)
e, caso a fonte que você queria não esteja na lista deles, [eles tem um script
para "patchear" a fonte desejada](https://github.com/powerline/powerline/tree/develop/font).
Uma vez que você tenha a fonte disponível no seu sistema, você deve adicionar no seu vimrc
```viml
let g:airline_powerline_fonts = 1
```
E o seu Airline, na próxima execução, deve ficar
![](airline-laststatus.png)
Que é mais bonito, mas ainda continua mostrando as mesmas informações. Mais pra
frente veremos ã integração com “Fugitive” (um plugin para VIM para Git) e o
Syntastic (para validar o código com ferramentas externas) e como ambos são
suportados pelo Airline, você terá todas as informações ao alcance do rodapé da
janela.
![](airline-everything.png)
Uma última nota: O Airline vem com suporte a temas, que você pode trocar usando
`:AirlineTheme` (e um duplo [Tab] depois disso irá mostrar os temas instalados).
Depois que escolher um, você pode definir
```
let g:airline_theme = '{nome do tema}'
```
no seu vimrc.
{{ chapters(prev_chapter_link="./14-01-vundle", prev_chapter_title="Plugins - Vundle", next_chapter_link="./14-03-fugitive", next_chapter_title="Plugins - Fugitive") }}

BIN
content/books/uma-licao-de-vim/14.02-airline/laststatus.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

66
content/books/uma-licao-de-vim/14.03-fugitive/index.md

@ -0,0 +1,66 @@
+++
title = "Plugins - Fugitive"
date = 2015-12-22
+++
Essa é a parte que só faz sentido se você usa Git.
<!-- more -->
O terceiro plugin que eu vou comentar é
[Fugitive](https://github.com/tpope/vim-fugitive), que adiciona comandos para
gerenciar seu repositório Git dentro do VIM.
Para instalar, ou você baixa a versão do Github (no link acima) ou usa o Vundle:
```viml
Plugin "tpope/vim-fugitive"
```
(E, de novo: depois de adicionar essa linha no seu vimrc, você deve sair do VIM
-- ou, se não quiser fazer tudo isso, basta usar o comando acima em modo de
comando -- e usar `:PluginInstall` para instalar o plugin.)
A princípio, nada de diferente deve aparecer. Mas você agora pode usar qualquer
comando do Git com `:Git {comando}`, como faria no shell.
Mas só adicionar um comando não é o que o Fugitive faz. Ele também adiciona
outros comandos:
* `:Gwrite` (ou `:Gw`): salva o arquivo atual e já adiciona no index para o
próximo commit.
* `:Gblame`: Faz um split da tela, mostrando do lado direito o fonte que já
estava aberto e do lado esquerdo, o último commit (SHA1) e o autor do commit.
* `:Gread`: Descarta as alterações locais e recupera o arquivo atual na sua
última revisão dentro do repositório do Git (ou seja, revert).
* `:Gdiff`: Mostra um diff da versão atual com a versão no repositório, com
splits.
* `:Gcommit`: Faz o commit dos arquivos que estão no index.
* `:Gstatus`: Faz um "git status", mas deixa que você altere os arquivos no
index (usando "-" para adicionar ou remover o arquivo -- leia o texto com
atenção) e faça commit dos selecionados (usando "cc") [Note que ambos os
comandos devem ser usados em modo normal dentro do split aberto por
`:Gstatus`.]
Existem outros, mas você vai usar principalmente estes. E cuide para que você
esteja dentro de um repositório Git antes de tentar usar os comandos; se o VIM
não estiver num diretório com um repositório válido, nenhum dos comandos do
Fugitive ficarão disponíveis[^1].
E, como última dica: Se você estiver usando o Airline (comentado no capítulo
anterior), adicione
```viml
let g:airline_enable_branch = 1
```
... no seu vimrc e o branch atual será apresentando dentro do status do
Airline, logo após o indicador de modo.
[^1] Eu só preciso adimitir que não testei para ver o que acontece se você
abrir o VIM fora de um repositório e depois usar `:cd` para mudar para um
diretório que tem um repositório ou tentar abrir um arquivo que está
dentro de um repositório para verificar se os comandos se tornam
disponíveis.
{{ chapters(prev_chapter_link="./14-02-airline", prev_chapter_title="Plugins - Airline", next_chapter_link="./14-04-commentary", next_chapter_title="Plugins - Commentary") }}

56
content/books/uma-licao-de-vim/14.04-commentary/index.md

@ -0,0 +1,56 @@
+++
title = "Plugins - Commentary"
date = 2015-12-22
+++
Essa é a parte em que automatizamos a técnica de sumir código sem sumir com o
código.
<!-- more -->
O quarto plugin da lista de plugins é
[Commentary](https://github.com/tpope/vim-commentary).
Como de costume, para instalar, você pode baixar o conteúdo do repositório
acima para dentro do seu ~/.vim/ (o diretório, não o arquivo de inicialização)
ou usar o Vundle:
```viml
Plugin "tpope/vim-commentary"
```
Commentary não é um plugin visual, o que significa que, mais uma vez, depois de
instalado você não verá nada de novo.
O que o Commentary faz é adicionar um atalho para comentar linhas de código,
baseado no tipo de arquivo atual. O atalho é \\\\{movimentação} ou \\\\\\ para
comentar a linha atual (ou você pode entrar em modo visual para selecionar as
linhas e fazer \\\\ e a parte selecionada vai ficar comentada); para descomentar,
basta fazer a mesma coisa (ou seja, se o pedaço selecionado não estiver
comentado, ele será comentado; se já estiver comentado, o comentário será
removido.)
E era isso.
A única ressalva aqui fica por conta de um comportamento padrão do VIM: O VIM
tem apenas um tipo de arquivo (definido com `:set filetype={sintaxe}`) que vale
para todo o arquivo. Assim, se você estiver usando a sintaxe de HTML,
Commentary provavelmente não irá comentar seu código JavaScript corretamente. A
coisa fica pior se você estiver editando um arquivo com sintaxe de template, já
que o tipo de arquivo é o template, não HTML ou JavaScript ou CSS.
Ainda, aproveitando o gancho, existem sintaxes e sintaxes. Algumas sintaxes são
antigas e estão definidas de uma forma que o VIM perde o contexto do código
apresentado e apresenta com a coloração errada (andar no texto em direção ao
começo do arquivo, com [PageUp], normalmente resolve esse problema, pois o VIM
encontra um ponto onde a sintaxe volta a fazer sentido). Por exemplo, a sintaxe
"htmldjango", que funciona também para arquivos Jinja2 tem a leve tendência de
se perder em arquivos muito longos; usando uma sintaxe externa para Jinja2
(usando `:Plugin "Glench/Vim-Jinja2-Syntax"`) esse problema não acontece.
Então lembre-se: Se a sintaxe "pirar", voltar um pouco para o começo do arquivo
deve resolver (e, depois disso, o VIM carrega o contexto a medida que você for
voltando para o ponto original) e sempre verifique se não há um arquivo de
sintaxe que corresponda melhor às suas necessidades.
{{ chapters(prev_chapter_link="./14-03-fugitive", prev_chapter_title="Plugins - Fugitive", next_chapter_link="./14-05-tabular", next_chapter_title="Plugins - Tabular") }}

100
content/books/uma-licao-de-vim/14.05-tabular/index.md

@ -0,0 +1,100 @@
+++
title = "Plugins - Tabular"
date = 2015-12-22
+++
Essa é a parte em que deixamos as coisas alinhadas.
<!-- more -->
O quinto plugin da lista de plugins é
[Tabular](https://github.com/godlygeek/tabular), um plugin para alinhar
elementos baseados em expressões regulares (calma, não é tão complicado quando
parece.)
Mais uma vez, para instalar pelo Vundle:
```viml
Plugin "godlygeek/tabular"
```
Assim como Fugitive e Commentary, Tabular não é um plugin visual, mas adiciona
um novo comando `:{range}Tabularize {expressão regular}`.
(Apenas lembrando de {range}: são dois indicadores separados por vírgula,
números são linhas, "$" é a última linha do arquivo, "%" é igual à "1,$" (todo o
arquivo), "'{marcador1},'{marcador2}" vai do marcador1 até o marcador2 e, se você
selecionar uma região no modo visual, ao pressionar `:`, o prompt deve ficar "'<
,'>" que são os marcadores especiais de início e fim, respectivamente, da área
visual. Todos os exemplos que eu vou mostrar daqui pra frente vão usar o
{range} de início e fim do bloco visual, porque faz mais sentido.)
A forma mais simples de usar o Tabular é passar um único caractere, que indica
qual o ponto onde os elementos serão alinhados. Por exemplo, com o seguinte
trecho de código:
```javascript
var pos = 1;
var element = $(this);
var i = 0;
```
Se você selecionar o mesmo visualmente e fizer `:'< ,'>Tabularize /=`, o resultado será:
```javascript
var pos = 1;
var element = $(this);
var i = 0;
```
Ao contrário da pesquisa (e da substituição), Tabularize aceita um segundo
parâmetro que indica como os elementos devem ser alinhados e qual o espaçamento
que deve existir entre os elementos. Este parâmetro pode ser até 3 pares, no
formato {alinhamento}{espaços depois do elemento} que, apesar da minha péssima
descrição, não é tão complicado assim.
Por exemplo, imagine que eu tenho o seguinte pedaço de código em HTML:
```html
<input class='block-size disabled'
id='input-box'
name='login'
value=''
placeholder='Enter your login'>
```
No caso, eu estou quebrando cada um dos elementos para diminuir o tamanho da
linha, já que ainda não coloquei minhas opções de templating e cada uma destas
linhas deve ficar bem maior. Mas, como exemplo, serve.
O que eu quero é que os "=" fiquem alinhados (mais ou menos o que o Xcode faz
com código Objective-C). Assim, eu posso fazer `:'< ,'>Tabularize /=/r0c0l0` para
obter:
```html
<input class='block-size disabled'
id='input-box'
name='login'
value=''
placeholder='Enter your login'>
```
A explicação está no parámetro: o primeiro par, "r0" siginfica que o elemento
antes do alinhamento deve ser alinhado à direita ("r") com 0 espaços depois do
elemento; "c0" significa que o elemento de alinhamento (no nosso caso, "=")
deve ser centralizado ("c") também com 0 espaços depois; e finalmente "l0"
significa que o elemento depois do alinhamento deve ficar à esquerda ("l") e
nenhum espaço deve ser adicionado.
Se eu quisesse que o espaço não ficasse grudado tanto na esquerda quando na
direita, eu teria que fazer `:'< ,'>Tabularize /=/r1c1l0` para obter:
```html
<input class = 'block-size disabled'
id = 'input-box'
name = 'login'
value = ''
placeholder = 'Enter your login'>
```
{{ chapters(prev_chapter_link="./14-04-commentary", prev_chapter_title="Plugins - Commentary", next_chapter_link="./14-06-autopairs", next_chapter_title="Plugins - Auto-pairs") }}

72
content/books/uma-licao-de-vim/14.06-autopairs/index.md

@ -0,0 +1,72 @@
+++
title = "Plugins - Auto-Pairs"
date = 2015-12-22
+++
Essa é a parte em que o VIM fecha as coisas pra você.
<!-- more -->
O sexto plugin da lista de plugins que eu vou falar é
[Auto-Pairs](https://github.com/jiangmiao/auto-pairs). Como de costume, para
instalar o plugin pelo Vundle:
```viml
Plugin "jiangmiao/auto-pairs"
```
Uma vez instalado o plugin, você verá que cada `'`, `"`, `(`, `[` e `{` irá,
automagicamente, gerar o seu respectivo `'`, `"`, `)`, `]` e `}`. Simples assim.
Entretanto, Auto-Pairs não funciona bem com o modo visual (se você já usou
TextMate ou Sublime Text, deve ter percebido que se você usar uma das
combinações acima com uma área selecionada, o editor vai "circular" a área
selecionada com o par indicado). O que existe é `[Alt]e` em modo de inserção que
faz a troca rápida entre o caractere de fechamento de pair com a próxima
palavra.
Por exemplo, se você tiver
```
''auto
```
... com o cursor posicionado entre as duas aspas e usar `[Alt]e`, você irá ficar com
```
'auto'
```
Ainda, o Auto-pairs tem um controle para "pular" sobre os caracteres de
fechamento já existentes. Se ele adicionar um ")" (que deve ficar antes do
cursor), quando você pressionar ")" no seu teclado, ao invés de adicionar mais
um ")", o cursor irá pular o ")" existente.
Embora isso pareça bom, em certos casos pode ser um problema. Por exemplo, caso
você tenha o seguinte trecho de código:
```javascript
$(function () {
$('#button').on('click', function () {
})
```
Se você tentar fechar a função interna, o Auto-Pairs irá, na verdade, saltar
para o fechamento da função externa, efetivamente "proibindo" que você feche as
funções corretamente. Soluções são:
* Fechar a função externa de novo, forçando o que era para encerrar a função
externa em encerramento da função interna (depois você pode alinhar as duas
novamente usando o modo visual e `=` em modo normal);
* Copiar e colar o fechamento da função externa;
* Desligar o "salto" de elementos de fechamento com `:let g:AutoPairsFlyMode = 0`
(e, se você realmente preferir que o salto nunca seja feito, pode adicionar
esta linha no seu vimrc);
* Desligar temporariamente o Auto-Pairs com `[Alt]p` em modo de inserção (usar
`[Alt]p` novamente irá reativar o Auto-Pairs).
{{ chapters(prev_chapter_link="./14-05-tabular", prev_chapter_title="Plugins - Tabular", next_chapter_link="./14-07-syntastic", next_chapter_title="Plugins - Syntastic") }}

60
content/books/uma-licao-de-vim/14.07-syntastic/index.md

@ -0,0 +1,60 @@
+++
title = "Plugins - Syntastic"
date = 2015-12-22
+++
Essa é a parte que o VIM ajuda você a achar o que tem de errado no seu
código.
<!-- more -->
O sétimo plugin discutido é o [Syntastic](https://github.com/scrooloose/syntastic).
Para instalar com Vundle:
```viml
Plugin "scrooloose/syntastic"
```
Inicialmente, Syntastic não faz nada. O que ele faz é, depois de salvar o
arquivo em disco, chama a função de lint para o tipo de arquivo atual e mostra
os problemas encontrados no canto esquerdo do código; ao passar pela linha com
problema, o erro encontrado é reportado na linha de comando.
![](syntastic.png)
Para ver quais são todos os erros encontrados pelo aplicativo de lint, use
`:Errors`, que irá abrir uma janela de quickfix com a lista de erros encontrados.
Ações de janelas e de quickfix, que já vinhamos vendo, continuam valendo. É só
o comando para abrir o quickfix que é diferente neste caso.
Você pode selecionar quais lints serão usados adicionado com `let
g:syntastic_{linguagem}_checkers=['']` (por exemplo, para verificar arquivos Python apenas
com PyLint, você deve usar `let g:syntastic_python_checkers=['pylint']` mas nunca
tive problemas com os lints atuais).
Uma coisa que deve ser cuidada é que o lint deve estar disponível no momento
que o VIM abriu o arquivo, senão ele não será usado. Por exemplo, se você tiver
pylint disponível apenas dentro de um virtualenv, chamar o VIM antes de estar
no virtualenv fará com que Syntastic não encontre o pylint e, com isso, nenhum
erro será reportado.
Ainda, assim como aconteceu com Commentary, Syntastic usa o tipo de arquivo
atual, não o do bloco. Por exemplo, ao editar um arquivo de template de Django,
que tem partes na linguagem de template do Django, HTML, CSS e JavaScript,
mesmo que você tenha os lints para HTML, CSS e JavaScript instalados, estes não
serão executados -- porque o VIM considera o arquivo um tipo inteiro, não um
conjunto de pequenos blocos de tipos diferentes.
E, por último, Airline tem suporte para mostrar os erros encontrados pelo
Syntastic na barra de status. Se você adicionar
```viml
let g:airline_enable_syntastic = 1
```
... no seu vimrc, o canto direito da barra de status irá mostrar a primeira
linha com erro e a quantidade de erros encontrados.
![](syntastic-airline.png)
{{ chapters(prev_chapter_link="./14-06-autopairs", prev_chapter_title="Plugins - Auto-Pairs", next_chapter_link="./14-08-snipmate", next_chapter_title="Plugins - SnipMate") }}

BIN
content/books/uma-licao-de-vim/14.07-syntastic/syntastic-airline.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
content/books/uma-licao-de-vim/14.07-syntastic/syntastic.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

107
content/books/uma-licao-de-vim/14.08-snipmate/index.md

@ -0,0 +1,107 @@
+++
title = "Plugins - Snipmate"
date = 2015-12-22
+++
Essa é a parte que automatizamos a digitação de coisas repetidas.
<!-- more -->
Para o oitavo plugin, iremos falar sobre [SnipMate](https://github.com/msanders/snipmate.vim).
Como de costume, instalando pelo Vundle:
```viml
Plugin "msanders/snipmate.vim"
```
SnipMate adiciona a funcionalidade de snippets dentro do VIM. Para quem não
sabe, snippets são trechos de código que são adicionados automaticamente (ou
com a ação de alguma combinação de teclas) a partir de uma simples palavra.
Por exemplo, um dos snippets que já estão inclusos no pacote do SnipMate, você
pode, num arquivo JavaScript, simplesmente digitar:
```javascript
fun
```
... e, ao pressionar [Tab], o SnipMate irá adicionar, automaticamente
```javascript
function function_name (argument) {
// body...
}
```
... posicionando o cursor diretamente sobre "function_name" para que você coloque
o nome da função; pressionando [Tab] irá posicionar o cursor sobre "argument" e
pressionando [Tab] de novo, o cursor ficará sobre "// body..." (depois disso,
[Tab] irá funcionar como tabulação, como normalmente é).
Para criar seus próprios snippets, você tem duas opções e ambas devem ficar no
diretório $HOME/.vim/snippets:
A primeira forma é através de um único arquivo, com o nome do tipo de arquivo
em que os snippets serão válidos (que você pode ver usando `:set ft`) com a
extensão snippets (por exemplo, para snippets para arquivos Python, você teria
um arquivo "$HOME/.vim/snippets/python.snippets"). Neste arquivo você deve
iniciar os snippets com a palavra snippet, seguida da palavra que será
utilizada para identificar o snippet, seguido pelo snippet em si, com uma
tabulação na frente (quando não houver tabulação, SnipMate considera que o
snippet terminou). Os pontos onde você quer que o cursor pare devem ser
identificados por "$\{\{número}:{texto\}\}" e, se ficou confuso, é porque eu estou
usando "coisas que você substituir" com {} e o próprio SnipMate usa {} para
blocos, mas deve ficar mais claro com este exemplo:
```viml
snippet for
{% for ${1:record} in ${2:list} %}
${3:content}
{% endfor %}
```
Este snippet, para Django e Jinja, faz um loop "for". Ao digitar "for" e
pressionar [Tab], o conteúdo será adicionado, o cursor será posicionando onde
`${1:record}` está permitindo a alteração do mesmo, pressionando [Tab] de novo
irá posicionar em `${2:list}` e assim por diante.
E, caso você esteja se perguntando "E o que acontece se eu colocar o mesmo
número em dois lugares diferentes?", a resposta é: lugares com o mesmo número
são alterados ao mesmo tempo. Por exemplo, o snippet:
```viml
snippet block
{% block ${1:blockname} %}
${2:{% content %}}
{% endblock $1 %}
```
... tem o número "1" duas vezes (uma depois de "block" e outra depois de
"endblock"). Quando você colocar o nome do bloco no primeiro (do lado de
"block"), o outro (depois de "endblock") será preenchido automaticamente.
A segunda forma de adicionar snippets é através de arquivos individuais. Ao
invés de ter um arquivo com o tipo de arquivo com todos os snippets dentro,
você irá criar um diretório com o tipo de arquivo e cada arquivo dentro deste
diretório deve ser "{palavra}.snippet". Assim, como no exemplo anterior tínhamos
um arquivo "$HOME/.vim/snippets/htmldjango.snippets", poderíamos ter, na verdade,
um diretório "$HOME/.vim/snippets/htmldjango/" e, dentro deste diretório, um
arquivo chamando "block.snippet" com o conteúdo do snippet, sem as tabulações (já
que agora o SnipMate sabe exatamente onde termina o snippet: no final do
arquivo).
E quando usar um ou outro? Você deve usar arquivos individuais se o SnipMate já
tiver um arquivo de snippets para o tipo de arquivo especificado. Assim, se
você quiser adicionar novos snippets para Python, que já tem uma série de
snippets prontos incluídos no pacote do próprio SnipMate, você deve usar a
segunda forma. Caso contrário, fica por preferência pessoal.
E, para concluir: Ao escrever este post, descobri que existe um fork da versão
apresentada aqui. A versão do "msanders" não é atualizada a 4 anos -- mas
funciona perfeitamente e tenho usado sem problemas a bastante tempo. Se você
quiser algo mais recente (por algum motivo), o fork está em
github.com/garbas/vim-snipmate (e requer mais dependências que a versão
original).
{{ chapters(prev_chapter_link="./14-07-syntastic", prev_chapter_title="Plugins - Syntastic", next_chapter_link="./14-09-ctrlp", next_chapter_title="Plugins - CtrlP e CtrlPFunky") }}

BIN
content/books/uma-licao-de-vim/14.09-ctrlp/ctrlp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

105
content/books/uma-licao-de-vim/14.09-ctrlp/index.md

@ -0,0 +1,105 @@
+++
title = "Plugins - CtrlP and CtrlPFunky"
date = 2015-12-22
+++
Essa é a parte em que você vai ter a impressão de estar programando em Perl,
porque qualquer caractere é válido.
<!-- more -->
O nono e penúltimo plugin (na verdade os nonos e penúltimos plugins) discutido
é o [CtrlP](https://github.com/kien/ctrlp.vim) e seu plugin (sim, um plugin do
plugin[^1]) [CtrlPFunky](https://github.com/tacahiroy/ctrlp-funky)
Para instalar os dois, com Vundle:
```viml
Plugin "kien/ctrlp.vim"
Plugin "tacahiroy/ctrlp-funky"
```
CtrlP é um plugin que facilita encontrar e abrir arquivos, com procura fuzzy.
E, por procura fuzzy eu quero dizer que ele encontra qualquer arquivo que tenha
as letras digitadas na ordem que você digitou.
![](ctrlp.png)
Para acionar o CtrlP, você deve digitar, logicamente, `[Ctrl]p`. Ao fazer isso,
uma janela parecida com a Quickfix irá aparecer, mostrando alguns arquivos e um
prompt para que você digite o que quer encontrar. No exemplo acima, como que
digitei "vim", ele encontrou todos os arquivos a partir do diretório atual que
começavam com "v", tinham um "i" no meio e terminavam com "m" (seria
basicamente o mesmo que pegar a lista de arquivos a partir do diretório atual e
seus sub-diretórios e procurar pela regex "v.\*i.\*m".)
Uma vez que você encontre o arquivo desejado na lista (ela não tem rolagem,
então se você ainda não estiver vendo o arquivo, continue adicionando
caracteres para que o arquivo desejado apareça na lista -- uma vez lá, você pode
selecioná-lo com as setas), você pode:
* Pressionar `[Enter]` para abrir o arquivo na janela atual.
* Pressionar `[Ctrl]t` para abrir o arquivo em outra aba.
* Pressionar `[Ctrl]s` para fazer um split horizontal e abrir o arquivo no novo
split.
* Pressionar `[Ctrl]v` para fazer um split vertical e abrir o arquivo no novo
split.
Um problema que você talvez encontre é que o CtrlP costuma listar tudo que se
encaixar na expressão utilizada, inclusive arquivos binário, objetos
intermediários, etc. Para remover estes arquivos da listagem, você pode usar
`:set wildignore`, que também afeta a lista de arquivos que o VIM mostra quando
você estiver usando os comandos normais de abertura de arquivo (`:e`, `:tabe`,
etc).
Como a configuração do wildignore é uma lista, você pode adicionar ou remover
usando += e -=. Por exemplo, para ignorar os arquivos de objetos compilados do
Python e o diretório que o setup.py constuma usar para construir o pacote de
distribuição do módulo, você teria:
```viml
set wildignore+=*.pyc
set wildignore+=*/build/*
```
ou ainda, para economizar uma linha:
```viml
set wildignore+=*.pyc,*/build/*
```
CtrlP tem um plugin, chamado CtrlPFunky. O que ele faz é basicamente o mesmo
que o CtrlP, mas procurando funções, não arquivos.
Para ativar o CtrlPFunky, você precisa primeiro adicionar o mesmo como uma
extensão do CtrlP (e, só pra avisar, isso é específico do CtrlP, não algo que
funciona com todo e qualquer plugin):
```viml
let g:ctrlp_extensions = ['funky']
```
Uma vez instalado, você pode usar `:CtrlPFunky` para mostrar a lista de funções
no fonte (e a procura continua igual). O problema com CtrlPFunky é que, assim
como todas as demais coisas que vínhamos vendo, ele se basea no tipo de arquivo
atual (`:set ft`) e para arquivos em que o conteúdo e uma mistura de várias
linguagens (p.ex., arquivo template com a linguagem de template, HTML, CSS e
JavaScript), a listagem de funções pode não ser o que você está esperando (ou
sequer vai funcionar).
Para facilitar a sua vida, você pode fazer um mapeamento do comando para um
atalho de teclado. Por exemplo, eu coloquei `[Ctrl]o` para chamar o CtrlPFunky
com
```viml
nnoremap <C-O> :CtrlPFunky<CR>
```
[^1] "Plugin-ception" har har har[^2].
[^2] Eu não consigo entender porque as pessoas utilizando tanto o "ception"
quando encontram um meta desta jeito. Um "inception" é a inserção de uma
idéia de forma que a pessoa pense que a idéia é dela, não uma
"[Matrioska](http://pt.wikipedia.org/wiki/Matrioska)".
{{ chapters(prev_chapter_link="./14-08-snipmate", prev_chapter_title="Plugins - SnipMate", next_chapter_link="./14-10-multiple-cursors", next_chapter_title="Plugins - Vim-Multiple-Cursors") }}

52
content/books/uma-licao-de-vim/14.10-multiple-cursors/index.md

@ -0,0 +1,52 @@
+++
title = "Plugins - Vim-Multiple-Cursors"
date = 2015-12-22
+++
Essa é a parte em que você pode repetir várias coisas, visualmente.
<!-- more -->
O último plugin da lista de plugins é o [Vim-Multiple-Cursors](https://github.com/terryma/vim-multiple-cursors).
Já que sempre falamos em usar Vundle...
```viml
Plugin "terryma/vim-multiple-cursors"
```
Assim como outros plugins já comentados, Vim-Multiple-Cursors não tem nenhuma
apresentação inicial. O que este plugin faz é permitir que você tenha várias
cursores no texto ao mesmo tempo, aplicando a mesma transformação em todos os
lugares.
A forma mais simples de usar Vim-Multiple-Cursors é ir até a palavra que você
quer alterar e pressionar `[Ctrl]n`. Você vai notar que o VIM irá mostrar como se
você tivesse entrado em modo visual e selecionado apenas aquela palavra, o que
não é nada impressionante. No entanto, se você pressionar `[Ctrl]n` de novo, você
verá que o cursor irá para a próxima ocorrência da palavra. Na verdade, o que
você tem agora são dois cursores e tudo que você fizer em um será repetido no
outro. Por exemplo, se você fizer ce sobre a palavra, você verá as duas
palavras mudando ao mesmo tempo.
De certa forma, o que você está fazendo é um "search and replace" só que está
vendo exatamente o que vai ser alterado.
Teoricamente, você poderia fazer `I"[Esc]ea"` para adicionar aspas ao redor da
palavra, mas há um pequeno inconveniente: `[Esc]`, que você precisa usar para
retornar para o modo normal depois de entrar em modo de inserção com `I` irá
também terminar o modo de múltiplos cursores.
A segunda forma de usar Vim-Multiple-Cursors é fazer uma seleção visual e usar
`[Ctrl]n`. Para cada linha da seleção, será adicionado um novo cursor. E,
novamente, o que você fizer em um deles será repetido em todos.
Simples assim.
A única coisa que eu posso deixar de aviso é que, por algum motivo, utilizando
uma seleção visual de várias linhas (`[Shift]v`), entrando em modo de múltiplos
cursores (`[Ctrl]n`) e usando aspas (com o Auto-Pairs), meu undo acabou sendo
perdido (`u` removia o texto inteiro, não a alteração feita com
Vim-Multiple-Cursors).
{{ chapters(prev_chapter_link="./14-09-ctrlp", prev_chapter_title="Plugins - CtrlP e CtrlPFunky", next_chapter_link="./15-conclusao", next_chapter_title="Conclusão") }}

53
content/books/uma-licao-de-vim/15-conclusao/index.md

@ -0,0 +1,53 @@
+++
title = "Plugins - Vim-Multiple-Cursors"
date = 2015-12-22
+++
Essa é a parte em que nos despedimos.
<!-- more -->
Pessoalmente, a palavra que eu usaria para descrever o VIM é extensível. Não
apenas pela quantidade de plugins criados e aperfeiçoados nestes 20 anos de
editor (na verdade, 22 se você considerar a [primeira versão
disponibilizada](http://en.wikipedia.org/wiki/Vim_%28text_editor%29) em 1991 ou
25 se você considerar quando Bram Moolenaar fez a versão 1.0 para o Amiga), mas
pela forma como os comandos foram projetados: Você sabe que uma movimentação do
cursor com um número da frente “pula” outras ocorrências, então qualquer
comando que você descobre como movimentação repete esse comportamento; Você
sabe que comandos que requerem movimentação aceitam qualquer comando de
movimentação (incluindo a quantidade, discutido antes); e assim por diante.
Claro que isto permite várias formas diferentes de fazer a mesma coisa, mas
isto também garante que você vai achar uma forma que se encaixe com o seu
workflow de desenvolvimento.
E não que, como eu falei lá no começo, VIM seja o editor perfeito para todas as
condições: Existem coisas novas surgindo a todo momento (por exemplo, a idéia
de múltiplos cursores só foi popularizado quando o TextMate foi lançado no OS
X) e que o editor base não consegue fazer -- mas como o editor é extensível em
várias formas, alguém já fez um plugin para repetir o comportamento no editor.
Existem arquivos de sintaxe que são terríveis, e mesmo assim fazem parte do
pacote original -- e existem formas de atualizar por versões melhores. Existem
plugins que baseiam-se unicamente no tipo de arquivo inteiro e não no bloco --
mas não há nada que não garanta que, no futuro, alguém consiga fazer um plugin
que troque automaticamente de modo baseado no contexto atual.
Na contrapartida, existem certas coisas que o VIM consegue fazer que outros
editores não fazem: Pular para o ponto onde o texto foi inserido da última vez
é o que sempre me faz voltar a usar o VIM e que eu sinto uma tremenda falta nos
outros editores -- que, diga-se de passagem, é fácil do editor controlar pela
existência dos modos.
E, como dicas de despedida: Quando alguém comentar sobre uma feature em outro
editor, lembre-se de procurar por "vim {feature}" na internet; muito
provavelmente a feature já existe em alguma forma para o VIM ou já tem alguém
tentando escrever um plugin para fazer a mesma coisa. E lembre-se sempre que
`:wq` só funciona no VIM, não nos demais editores ou no seu emulador de
terminal[^1].
[^1] Você pode perguntar para qualquer usuário de longa data quantas vezes eles
tentaram fechar o terminal ou mesmo um editor de textos como Word ou
LibreOffice com `:wq` e a resposta provavelmente vai ser "mais vezes que eu
posso lembrar".
{{ chapters(prev_chapter_link="./14-10-multiple-cursors", prev_chapter_title="Plugins - Vim-Multiple-Cursors") }}

38
content/books/uma-licao-de-vim/_index.md

@ -0,0 +1,38 @@
+++
transparent = false
title = "Uma Lição de VIM"
template = "section-contentless.html"
+++
* [Introdução](00-intro)
* [Modos](01-modos)
* [Modo normal](01-01-modo-normal)
* [Entendendo o Cursor](01-02-entendendo-o-cursor)
* [Mudando de Modos - Modo de Inserção](01-03-modo-de-insercao)
* [Mudando de Modos - Modo Visual](01-04-modo-visual)
* [Mudando de Modos - Modo de Comando](01-05-modo-de-comando)
* [Outros Comandos](02-outros-comandos)
* [Recortar, Copiar e Colar](03-recortar-copiar-colar)
* [Registradores](04-registradores)
* [Marcadores](05-marcadores)
* [Macros de Teclado](06-macros-de-teclado)
* [Procurar em Vários Arquivos](07-procurar-varios-arquivos)
* [Localizar e Substituir](08-localizar-substituir)
* [Splits](09-splits)
* [Abas](10-abas)
* [Arquivos de Configuração](11-config)
* [Meu .vimrc](11-01-vimrc)
* [Meu .gvimrc](11-02-gvimrc)
* [Modelines](12-modelines)
* [Tags](13-tags)
* [Plugins - Vundle](14-01-vundle)
* [Plugins - Airline](14-02-airline)
* [Plugins - Fugitive](14-03-fugitive)
* [Plugins - Commentary](14-04-commentary)
* [Plugins - Tabular](14-05-tabular)
* [Plugins - Auto-pairs](14-06-autopairs)
* [Plugins - Syntastic](14-07-syntastic)
* [Plugins - Snipmate](14-08-snipmate)
* [Plugins - CtrlP e CtrlPFunky](14-09-ctrlp)
* [Plugins - Vim-Multiple-Cursors](14-10-multiple-cursors)
* [Conclusão](15-conclusao)

2
themes/nighttime

@ -1 +1 @@
Subproject commit 85d3db539b3e72076e4a9352ca890920996dc44e
Subproject commit c9a6aff5b4b60f19a2b784a830d5c2eba81a20fb
Loading…
Cancel
Save