Melhore sua produtividade com dicas avançadas do editor VIM
Intro
Continuando a série de posts sobre o VIM, irei tratar aqui sobre o uso do vim no dia a dia, em especial para desenvolvedores.
Os principais editores de texto trazem algumas comodidades, tais como: syntax highlight, edição multi-linha, mover linhas no arquivo, desfazer/refazer, visualização da árvore de diretórios, navegação por abas, pesquisa por arquivos…
E se eu disser que o VIM tem tudo isso nativamente, e com uma performance que deixa o VS Code, Atom, Sublime com inveja?
Neste post veremos cada uma dessas funcionalidades e como configurá-las no seu vim.
Syntax Hightlight
O vim, por padrão, possui uma opção chamada syntax
. Você consegue ativar de forma interativa qualquer opção no vim acessando o modo de linha de comando através da tecla ESC
. Para ativar o syntax highlight, basta digitar :syntax
e, em seguida, apertar enter.
on
O conjunto de cores também pode ser customizado e a opção destinada a esse tipo de configuração é a colorscheme
. O vim possui alguns já pré-definidos, como o evening
– basta entrar novamente no modo de linha de comando, digitar colorscheme
e apertar enter.
evening
Caso você não goste muito dos colorschemes nativos, a boa notícia é que existem muitos disponíveis na internet – basta realizar o download do colorscheme e colocar no diretório ~.vim/colors/
Numeração
O vim possui, de forma nativa, a opção de numeração de linha: no modo de comando digite set
:
number
Edição Multi-linha
Uma das funcionalidades mais comuns dos editores modernos é poder editar mais de uma linha ao mesmo tempo. Um exemplo recorrente é o ato de comentar/descomentar trechos de código.
No normal mode, aperte Ctrl
e selecione o trecho o qual você deseja comentar:
+ V
Após selecionar o texto, aperte a sequência Shift + i, em seguida digite //
e aperte ESC:
Para descomentar repita o processo de seleção multilinha por bloco com a sequência Ctrl
, selecione os caracteres de comentário e aperte a tecla
+ VS:
Movendo linhas no arquivo
Para mover um trecho de código para 3 linhas abaixo, por exemplo (scroll down), selecione as linhas no modo VISUAL/LINHA com a sequência ‘Shift + V’. Feita a seleção, basta apertar ESC
e inserir o comando :move +3
:
Para retroceder as linhas (scroll up), devemos inverter o sinal do comando move – :move
:
-3
OK. Digitar :move
e número de linhas toda vez que você precisar arrastar o seu trecho para baixo ou para cima parece pouco produtivo. Apesar de gostar de escrever os comandos, por reforçá-los na memória e não precisar customizar as configurações do VIM, esse tipo de feature pede por uma tecla de atalho.
Felizmente, o VIM é customizável. Para criar um atalho no vim, edite o arquivo ~/.vimrc
e adicione ao final a seguinte configuração:
vnoremap <S-Down> :m '>+1<CR>gv=gv
vnoremap <S-Up> :m '<-2<CR>gv=gv
A instrução vnoremap
indica para o vim que, no modo VISUAL, a sequência Shift + seta para baixo e Shift + seta para cima serão remapeadas para as instruções move + 1
e move
respectivamente, de forma não recursiva (ou seja, conseguimos mover de unidade em unidade). Dessa forma, temos mais fluidez ao movimentar nossas linhas. Para verificar esse atalho em ação, selecione o modo VISUAL do vim apertando a tecla V, selecione as linhas que gostaria de movimentar, em seguida aperte Shift + seta para baixo algumas vezes e depois Shift + seta para cima para voltar algumas linhas:
- 2,
O arquivo ~/.vimrc
é como o nosso ~/.bashrc,
mas para as configurações do vim: a cada vez que o vim inicializar, ele vai carregar essas configurações no editor. Nesse sentido, podemos adicionar as configurações de syntax on
, set numbers
. Ao final teremos:
Árvore de diretórios
O vim possui o comando Vexplore
, que abre uma janela interna de navegação, apresentando o conteúdo do diretório vigente:
A questão é que, por padrão, o comando acaba separando a janela em duas metades iguais, além de que ao abrir um arquivo, a navegação no diretório é substituída pelo próprio conteúdo do arquivo.
Nada que uma boa configuração não resolva. Adicione o trecho a seguir no seu arquivo ~/.vimrc
:
let g:netrw_banner = 0
let g:netrw_liststyle = 3
let g:netrw_browse_split = 4
let g:netrw_altv = 1
let g:netrw_winsize = 25
augroup file_drawer
autocmd!
autocmd VimEnter * :Vexplore
augroup END
Vamos entender o que esses parâmetros querem nos dizer:
- let g:netrw_banner =0 : aplica globalmente que o banner do navegador de diretório será escondida
- let g:netrw_liststyle: o netrw possui 4 formas de visualização da lista de arquivos, a de número 3 é a referente à visualização em árvore
- let g:netrw_browse_split: define o comportamento de abertura dos arquivos nas janelas. A opção 4 define que será aberto a janela anterior (de origem)
- let g:netrw_altv: define o tipo de separação da janela para vertical
- let g:netrw_winsize: define o tamanho em percentagem da janela de arquivos – no caso definimos para 25%
- bloco augroup: define que ao inicializar o vim, será executado o comando
:Vexplore
Com isso temos nosso vim com árvore de diretórios preparada:
Para abrir um arquivo, basta posicionar o cursor e apertar Enter. Para navegar entre janelas, utilize o comando CRTL + W seta para direita/esquerda.
Navegação por abas
O vim possui nativamente navegação por abas através do comando :tabnew
. Quando executado sem nenhum parâmetro, ele abre uma nova aba com um novo arquivo. É possível abrir arquivos já existentes com o comando :tabnew <nome_do_arquivo>
. Para navegar entre abas, o vim possui dois comandos, o :tabnext
e o :tabprevious
, que navegam para a próxima aba, ou voltam para a aba anterior – caso chegue à última aba, ele retorna para a primeira, e o seu inverso também é verdadeiro.
Assim como o line scrolling, a navegação entre abas pede por teclas de atalho:
nnoremap <S-Right> :tabnext<CR>
nnoremap <S-Left> :tabprevious<CR>
Ao apertar, no modo NORMAL do vim, a sequência Shift + seta para direita navegará para a próxima aba, e Shift + seta para esquerda retornará à primeira aba:
Pesquisando arquivos por palavra-chave
Para finalizar esse post, uma funcionalidade importante é procurar por palavras chaves na raiz de um diretório. O vim possui o comando :vimgrep,
que funciona de forma similar ao utilitário do Linux, grep.
Para realizar um teste, abra o vim sem nenhum argumento. Em seguida, troque da janela de árvore de diretórios para a janela do arquivo em branco (dica: essa operação poderia ter um atalho também, não acha?) através do comando Ctrl + W + seta para direita.
Após isso, vamos procurar no diretório vigente algum arquivo que contenha a expressão printf
. Para tal, utilizaremos o seguinte comando: :vimgrep
printf *.c | copen 5
Vamos entender o que aconteceu com a execução deste comando:
- aprimeira parte do comando é similar a um grep do Linux, ele vai buscar as ocorrências do padrão printf nos arquivos do diretório cuja extensão seja de código da linguagem C.
- o trecho
(...) |
é uma diretiva para mostrar os resultados (buffer) em uma nova janela, para que você possa visualizar todas as ocorrências. Essa janela é feita a partir de um horizontal split, mas isso pode variar de acordo com o tamanho da janela.
copen 5
O comportamento do vimgrep é abrir a primeira ocorrência na janela vigente. É possível configurar para que essa abertura seja em uma nova aba com a direta:set
(isso também pode ir para o seu
switchbuf+=newtab ~/.vimrc
)
Referências
Muitas dessas dicas foram fruto de pesquisa, experiência própria e, claro, do conhecimento coletivo. Abaixo seguem boas referências sobre o vim:
- Árvore de diretórios sem plugins : https://shapeshed.com/vim-netrw/
- Entendendo as opções do netrw: https://medium.com/usevim/the-netrw-style-options-3ebe91d42456
- Learn Vim Script the Hard Way: https://learnvimscriptthehardway.stevelosh.com/