Browse Source

A bunch of chapters

master
Julio Biason 6 years ago
parent
commit
10d686a686
  1. 2
      content/books/uma-licao-de-vim/01-modos/index.md
  2. BIN
      content/books/uma-licao-de-vim/01.01-modo-normal/Mind-Blown.jpg
  3. 85
      content/books/uma-licao-de-vim/01.01-modo-normal/index.md
  4. BIN
      content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/areyoufuckingkiddingme.jpg
  5. 39
      content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/index.md
  6. BIN
      content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/vim-cursor.png
  7. BIN
      content/books/uma-licao-de-vim/01.03-modo-de-insercao/enhanced-buzz-5697-1327086181-19.jpg
  8. BIN
      content/books/uma-licao-de-vim/01.03-modo-de-insercao/iStock_000014784346Small.jpg
  9. 123
      content/books/uma-licao-de-vim/01.03-modo-de-insercao/index.md
  10. BIN
      content/books/uma-licao-de-vim/01.03-modo-de-insercao/jaw-drop.jpg
  11. 57
      content/books/uma-licao-de-vim/01.04-modo-visual/index.md
  12. 146
      content/books/uma-licao-de-vim/01.05-modo-de-comando/index.md
  13. 152
      content/books/uma-licao-de-vim/02-outros-comandos/index.md
  14. 71
      content/books/uma-licao-de-vim/03-recortar-copiar-colar/index.md
  15. 76
      content/books/uma-licao-de-vim/04-registradores/index.md
  16. 72
      content/books/uma-licao-de-vim/05-marcadores/index.md

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

@ -66,4 +66,4 @@ Todas as imagens são copyright (C) seus respectivos donos.
[^1] Apenas a título de informação, praticamente tudo que pode ser feito em [^1] Apenas a título de informação, praticamente tudo que pode ser feito em
modo visual pode ser feito em modo normal. modo visual pode ser feito em modo normal.
{{ chapters(prev_chapter_link="../00-intro", prev_chapter_title="Introdução") }} {{ 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.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 = "Recortar, Copiar e Colar"
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="./04-registradores", next_chapter_title="Registradores") }}

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="./04-registradores", next_chapter_title="Registradores") }}
Loading…
Cancel
Save