Uma Lição de VIM #15.9: Plugins – CtrlP e CtrlPFunky

(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 e seu plugin (sim, um plugin do plugin[1]) CtrlPFunky.

Para instalar os dois, com Vundle:

Bundle ‘kien/ctrlp.vim’
Bundle ‘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

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:

set wildignore+=*.pyc
set wildignore+=*/build/*

ou ainda, para economizar uma linha:

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):

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

nnoremap <C-O> :CtrlPFunky<CR>

[1] “Plugin-ception” har har har[2].

[2] Eu não consigo entender porque as pessoas utilizando tanto o “ception” quando encontram um meta desta jeito. Um “inception” é a inserção de uma idéia de forma que a pessoa pense que a idéia é dela, não uma “Matrioska“.

Uma Lição de VIM #8: Procurar em Vários Arquivos

(Essa é a parte em que mais uma vez você vai ter que pesquisar sobre expressões regulares.)

Já vimos o comando de pesquisa, que tem um modo inteiro só pra si[1].

Mas como fazer para encontrar ocorrências de uma palavra em mais de um arquivo? Para isto, existe o comando :grep.

O grep é uma ferramente comum em Unixes (e Linux) em geral, mas o VIM tem scripts que fazem a mesma coisa em outros sistemas operacionais (por exemplo, Windows). Assim, o mesmo comando vai funcionar da mesma forma não importando qual sistema você esteja utilizando.

Como o :grep usa outras funcionalidades existentes no VIM, iremos ver um pouco mais do que simplesmente “Procurar”, mas isso é necessário.

Como o modo de pesquisa, :grep precisa de uma expressão regular. Ao contrário do modo de pesquisa, o :grep também precisa de uma lista de arquivos a serem pesquisados. Por baixo dos panos, o que o VIM faz é chamar o comando “grep” (do Unix), verifica o resultado e permite pular facilmente entre os elementos encontrados (então todas as opções disponíveis para o grep podem ser passadas diretamente de dentro do VIM).

Por exemplo, para pesquisar por arquivos que contém a palavra “void”, você só precisa executar o comando :grep void * (onde :grep é o comando, void é a expressão a ser pesquisada e * é a lista de arquivos a serem pesquisados). Como o grep (o aplicativo do Unix) somente pesquisa arquivos no diretório especificado (no nosso caso anterior, como não foi passado diretório algum, será considerado o diretório atual), o :grep (o comando do VIM) também não vai entrar em nenhum subdiretório (de novo, porque o VIM simplesmente chama o grep [aplicativo do Unix] e facilita pular entre os elementos encontrados). Para fazer uma procura que encontre a expressão além do diretório atual, basta adicionar a opção -r para o grep (grep void -r *).

Ok, agora que você sabe usar o :grep… Como é que você vê os resultados?

Primeira informação periférica: O VIM tem um tipo de “janela” especial, chamada “Quickfix”. Essa “janela” é, na verdade, um “split” da tela (e mais a frente veremos como trabalhar com “splits” e abas). Para exibir o Quickfix, é usado o comando :copen; para fechar o Quickfix, basta usar :copen de novo. Para passar para o próximo elemento existente no Quickfix, use :cnext (ou simplesmente :cn); para passar para o elemento anterior, use :cprevious (ou simplesmente :cp); para mover o cursor para a posição do elemento atual do Quickfix, use :cc (que é simplesmente :cc mesmo).

A segunda informação periférica: Como eu falei, usar :grep {expressão} * irá procurar {expressão} a partir do diretório atual. Para descobrir qual é o “diretório atual” para o VIM, use :pwd (de “print working directory”, que também é um comando Unix); para mudar para outro diretório, utilize o comando :cd {diretório}, como você faria num shell normal.

(E antes que alguém pergunte: Sim, você pode fazer um grep fora do diretório atual passando o diretório em questão no próprio comando do grep: :grep void /tmp -r irá procurar por “void” em todos os arquivos existentes no diretório /tmp.)

[1] Apenas para lembrar, / entra no modo de pesquisa, onde só é preciso entrar a expressão regular a ser encontrada; para passar para a próxima ocorrência, use n em modo normal; para passar para a ocorrência anterior, use N também em modo normal; para remover o realce das palavras encontradas, use :noh em modo de comando.