From 300ffada6e7aa791ea730b01d73bb7f5e118ef62 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Fri, 18 Jan 2019 21:13:38 -0200 Subject: [PATCH] And that is it --- .../uma-licao-de-vim/14.03-fugitive/index.md | 2 +- .../14.04-commentary/index.md | 56 +++++++++ .../uma-licao-de-vim/14.05-tabular/index.md | 100 ++++++++++++++++ .../uma-licao-de-vim/14.06-autopairs/index.md | 72 ++++++++++++ .../uma-licao-de-vim/14.07-syntastic/index.md | 60 ++++++++++ .../14.07-syntastic/syntastic-airline.png | Bin 0 -> 13546 bytes .../14.07-syntastic/syntastic.png | Bin 0 -> 5575 bytes .../uma-licao-de-vim/14.08-snipmate/index.md | 107 ++++++++++++++++++ .../uma-licao-de-vim/14.09-ctrlp/ctrlp.png | Bin 0 -> 40602 bytes .../uma-licao-de-vim/14.09-ctrlp/index.md | 105 +++++++++++++++++ .../14.10-multiple-cursors/index.md | 52 +++++++++ .../uma-licao-de-vim/15-conclusao/index.md | 53 +++++++++ content/books/uma-licao-de-vim/_index.md | 16 +-- 13 files changed, 614 insertions(+), 9 deletions(-) create mode 100644 content/books/uma-licao-de-vim/14.04-commentary/index.md create mode 100644 content/books/uma-licao-de-vim/14.05-tabular/index.md create mode 100644 content/books/uma-licao-de-vim/14.06-autopairs/index.md create mode 100644 content/books/uma-licao-de-vim/14.07-syntastic/index.md create mode 100644 content/books/uma-licao-de-vim/14.07-syntastic/syntastic-airline.png create mode 100644 content/books/uma-licao-de-vim/14.07-syntastic/syntastic.png create mode 100644 content/books/uma-licao-de-vim/14.08-snipmate/index.md create mode 100644 content/books/uma-licao-de-vim/14.09-ctrlp/ctrlp.png create mode 100644 content/books/uma-licao-de-vim/14.09-ctrlp/index.md create mode 100644 content/books/uma-licao-de-vim/14.10-multiple-cursors/index.md create mode 100644 content/books/uma-licao-de-vim/15-conclusao/index.md diff --git a/content/books/uma-licao-de-vim/14.03-fugitive/index.md b/content/books/uma-licao-de-vim/14.03-fugitive/index.md index 8be586c..bf9cc2c 100644 --- a/content/books/uma-licao-de-vim/14.03-fugitive/index.md +++ b/content/books/uma-licao-de-vim/14.03-fugitive/index.md @@ -63,4 +63,4 @@ Airline, logo após o indicador de modo. 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="./11-config", next_chapter_title="Arquivos de Configuração") }} +{{ chapters(prev_chapter_link="./14-02-airline", prev_chapter_title="Plugins - Airline", next_chapter_link="./14-04-commentary", next_chapter_title="Plugins - Commentary") }} diff --git a/content/books/uma-licao-de-vim/14.04-commentary/index.md b/content/books/uma-licao-de-vim/14.04-commentary/index.md new file mode 100644 index 0000000..7aa8687 --- /dev/null +++ b/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. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/14.05-tabular/index.md b/content/books/uma-licao-de-vim/14.05-tabular/index.md new file mode 100644 index 0000000..4339718 --- /dev/null +++ b/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. + + + +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 + +``` + +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 + +``` + +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 + +``` + +{{ chapters(prev_chapter_link="./14-04-commentary", prev_chapter_title="Plugins - Commentary", next_chapter_link="./14-06-autopairs", next_chapter_title="Plugins - Auto-pairs") }} diff --git a/content/books/uma-licao-de-vim/14.06-autopairs/index.md b/content/books/uma-licao-de-vim/14.06-autopairs/index.md new file mode 100644 index 0000000..0a0a903 --- /dev/null +++ b/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ê. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/14.07-syntastic/index.md b/content/books/uma-licao-de-vim/14.07-syntastic/index.md new file mode 100644 index 0000000..a10fe5e --- /dev/null +++ b/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. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/14.07-syntastic/syntastic-airline.png b/content/books/uma-licao-de-vim/14.07-syntastic/syntastic-airline.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0a280f3f7ed321e78be294b03e2aa76f0116e9 GIT binary patch literal 13546 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 D4cF7B literal 0 HcmV?d00001 diff --git a/content/books/uma-licao-de-vim/14.07-syntastic/syntastic.png b/content/books/uma-licao-de-vim/14.07-syntastic/syntastic.png new file mode 100644 index 0000000000000000000000000000000000000000..d985ae095694c3fbf225c904bd3abf535d6327cd GIT binary patch literal 5575 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 literal 0 HcmV?d00001 diff --git a/content/books/uma-licao-de-vim/14.08-snipmate/index.md b/content/books/uma-licao-de-vim/14.08-snipmate/index.md new file mode 100644 index 0000000..64c15fa --- /dev/null +++ b/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. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/14.09-ctrlp/ctrlp.png b/content/books/uma-licao-de-vim/14.09-ctrlp/ctrlp.png new file mode 100644 index 0000000000000000000000000000000000000000..ac3c4c7d9d0e2ff9551e6ccb6f480dfaa256d2ba GIT binary patch literal 40602 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 literal 0 HcmV?d00001 diff --git a/content/books/uma-licao-de-vim/14.09-ctrlp/index.md b/content/books/uma-licao-de-vim/14.09-ctrlp/index.md new file mode 100644 index 0000000..36bb049 --- /dev/null +++ b/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. + + + +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 :CtrlPFunky +``` + +[^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") }} diff --git a/content/books/uma-licao-de-vim/14.10-multiple-cursors/index.md b/content/books/uma-licao-de-vim/14.10-multiple-cursors/index.md new file mode 100644 index 0000000..5aa7f98 --- /dev/null +++ b/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. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/15-conclusao/index.md b/content/books/uma-licao-de-vim/15-conclusao/index.md new file mode 100644 index 0000000..bce12b1 --- /dev/null +++ b/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. + + + +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") }} diff --git a/content/books/uma-licao-de-vim/_index.md b/content/books/uma-licao-de-vim/_index.md index 877d7e7..087e5dd 100644 --- a/content/books/uma-licao-de-vim/_index.md +++ b/content/books/uma-licao-de-vim/_index.md @@ -28,11 +28,11 @@ template = "section-contentless.html" * [Plugins - Vundle](14-01-vundle) * [Plugins - Airline](14-02-airline) * [Plugins - Fugitive](14-03-fugitive) -* [Plugins - Commentary](1504.md) -* [Plugins - Tabular](1505.md) -* [Plugins - Auto-pairs](1506.md) -* [Plugins - Syntastic](1507.md) -* [Plugins - Snipmate](1508.md) -* [Plugins - CtrlP e CtrlPFunky](1509.md) -* [Plugins - Vim-Multiple-Cursors](1510.md) -* [Conclusão](16.md) +* [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)