diff --git a/content/books/uma-licao-de-vim/01-modos/index.md b/content/books/uma-licao-de-vim/01-modos/index.md index 91ff255..b8a701b 100644 --- a/content/books/uma-licao-de-vim/01-modos/index.md +++ b/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 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") }} diff --git a/content/books/uma-licao-de-vim/01.01-modo-normal/Mind-Blown.jpg b/content/books/uma-licao-de-vim/01.01-modo-normal/Mind-Blown.jpg new file mode 100644 index 0000000..b50eb16 Binary files /dev/null and b/content/books/uma-licao-de-vim/01.01-modo-normal/Mind-Blown.jpg differ diff --git a/content/books/uma-licao-de-vim/01.01-modo-normal/index.md b/content/books/uma-licao-de-vim/01.01-modo-normal/index.md new file mode 100644 index 0000000..7e450bc --- /dev/null +++ b/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. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/areyoufuckingkiddingme.jpg b/content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/areyoufuckingkiddingme.jpg new file mode 100644 index 0000000..23d7ebd Binary files /dev/null and b/content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/areyoufuckingkiddingme.jpg differ diff --git a/content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/index.md b/content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/index.md new file mode 100644 index 0000000..f8b9f52 --- /dev/null +++ b/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. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/vim-cursor.png b/content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/vim-cursor.png new file mode 100644 index 0000000..f34e21b Binary files /dev/null and b/content/books/uma-licao-de-vim/01.02-entendendo-o-cursor/vim-cursor.png differ diff --git a/content/books/uma-licao-de-vim/01.03-modo-de-insercao/enhanced-buzz-5697-1327086181-19.jpg b/content/books/uma-licao-de-vim/01.03-modo-de-insercao/enhanced-buzz-5697-1327086181-19.jpg new file mode 100644 index 0000000..bb0bd04 Binary files /dev/null and b/content/books/uma-licao-de-vim/01.03-modo-de-insercao/enhanced-buzz-5697-1327086181-19.jpg differ diff --git a/content/books/uma-licao-de-vim/01.03-modo-de-insercao/iStock_000014784346Small.jpg b/content/books/uma-licao-de-vim/01.03-modo-de-insercao/iStock_000014784346Small.jpg new file mode 100644 index 0000000..8f0b7c9 Binary files /dev/null and b/content/books/uma-licao-de-vim/01.03-modo-de-insercao/iStock_000014784346Small.jpg differ diff --git a/content/books/uma-licao-de-vim/01.03-modo-de-insercao/index.md b/content/books/uma-licao-de-vim/01.03-modo-de-insercao/index.md new file mode 100644 index 0000000..bdcd333 --- /dev/null +++ b/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. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/01.03-modo-de-insercao/jaw-drop.jpg b/content/books/uma-licao-de-vim/01.03-modo-de-insercao/jaw-drop.jpg new file mode 100644 index 0000000..c139613 Binary files /dev/null and b/content/books/uma-licao-de-vim/01.03-modo-de-insercao/jaw-drop.jpg differ diff --git a/content/books/uma-licao-de-vim/01.04-modo-visual/index.md b/content/books/uma-licao-de-vim/01.04-modo-visual/index.md new file mode 100644 index 0000000..5fc73da --- /dev/null +++ b/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. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/01.05-modo-de-comando/index.md b/content/books/uma-licao-de-vim/01.05-modo-de-comando/index.md new file mode 100644 index 0000000..41e143a --- /dev/null +++ b/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. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/02-outros-comandos/index.md b/content/books/uma-licao-de-vim/02-outros-comandos/index.md new file mode 100644 index 0000000..b68ee77 --- /dev/null +++ b/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. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/03-recortar-copiar-colar/index.md b/content/books/uma-licao-de-vim/03-recortar-copiar-colar/index.md new file mode 100644 index 0000000..1bbb08d --- /dev/null +++ b/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. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/04-registradores/index.md b/content/books/uma-licao-de-vim/04-registradores/index.md new file mode 100644 index 0000000..236d522 --- /dev/null +++ b/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. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/05-marcadores/index.md b/content/books/uma-licao-de-vim/05-marcadores/index.md new file mode 100644 index 0000000..104ece4 --- /dev/null +++ b/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. + + + +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") }}