Adriano Lisboa Blog
Pensamentos, histórias e ideias.

Quebrando maus hábitos no Vim

Se você está apenas começando com Vim recomendo fortemente o meu artigo sobre como começar. Pois agora nos vamos falar um pouco sobre maus hábitos que acabamos adquirindo ao começar com o Vim, e para isso vamos precisar que você tenha um pouco de familiaridade editando configurações e instalando plugins.

Para entender esse maus hábitos, precisamos entender primeiro oque são as motions do Vim.

O que são as motions ?

A maioria do tempo que estamos realizando alguma tarefa ligada a programação não estamos realmente escrevendo código e sim pensando oque e onde vamos escrever. Pare e pense na quantidade de tempo que você gasta navegando por arquivos e posicionando o cursor onde é necessário.

Como qualquer ferramenta moderna, o vim permite que o usuário utilize métodos tradicionais de movimentação, tais como, teclas direcionais e o cursor do mouse. A utilização desse tipo de movimento pode te deixar extremamente lento se comparado com as motions que ele oferece.

As motions são nada mais do que comandos que você pode usar para se mover dentro do Vim.

Alguns exemplos:

h move um carácter para esquerda
j move uma coluna a baixo
k move uma coluna a cima
l move um carácter para a direita

Para uma lista de motions, veja todos os movimentos corretos.

Não use as teclas direcionais

Como dito anteriormente, o Vim possui várias motions que podem ser utilizadas para se locomover dentro de um buffer aberto, e a utilização das teclas direcionais não só é considerada como um mau hábito, mas também pode te deixar extremamente lento quando comparamos com a utilização das as motions.

Para quebrar esse primeiro mau hábito sugiro que você desabilite as teclas direcionais e passe a utilizar motions como: h, j, k, l.

Para fazer isso, adicione as seguintes linhas em seu .vimrc:

nnoremap <up> <nop>
nnoremap <down> <nop>
nnoremap <left> <nop>
nnoremap <right> <nop>
inoremap <up> <nop>
inoremap <down> <nop>
inoremap <left> <nop>
inoremap <right> <nop>
vnoremap <up> <nop>
vnoremap <down> <nop>
vnoremap <left> <nop>
vnoremap <right> <nop>

Com elas as teclas direcionais vão estar desabilitadas no modo normal, de inserção e visual.

Caso você já não utilize as direcionais, siga com o artigo. Caso ainda utilize, desabilite e tente trabalhar um pouco da maneira recomendada, no começo você vai se sentir lento e errar as teclas por várias vezes, mas ao adquirir memória muscular elas vão se tornar naturais e fáceis de usar.

Repense a repetição de teclas múltiplas vezes seguidas

Qualquer repetição exagerada de uma motion do Vim também pode ser considerada um mau hábito, e com certeza existe uma motion que possa ser utilizada para ganhar maior agilidade na edição.

Imagine a seguinte frase:

Mussum Ipsum, cacilds vidis litro abertis.

Agora imagine que queremos editar a palavra Ipsum removendo a letra u (ficando Ipsm), utilizando a motion l até chegar a letra u poderíamos utilizar as seguintes motions

wlllx -> move para o começo da próxima palavra e depois move 3 colunas a direita e apaga a coluna atual.

Agora imagine a repetição dessa motion várias vezes ao dia para mover entre palavras e linhas, algo que costumamos fazer sem perceber (ex: hhhhh, jjjjj, kkkkk, lllll).

Para isso poderíamos utilizar simples motions de palavras como f{caracter} ficando wfux. Ou até mesmo mover entre linhas (exemplo: 50G, movendo para linha 50 sem ter que apertar a motion j por 50 vezes).

Recomendo que você passe um tempo estudando a imagem abaixo para entender motions, comandos e operadores do Vim.

Vim Cheat Sheet
Figura 1: Vim Cheat Sheet: Cortesia: http://www.viemu.com

Plugin Hardtime

Pensando nessas repetições e maus hábitos o desenvolvedor Tom Cammann criou o plugin vim-hardtime, a maneira como ele funciona é simplesmente adicionando um timeout para repetição de teclas definidas.

Por exemplo, queremos que após a utilização da motion h por duas vezes, ao tentar utilizar pela terceira vez o plugin me impeça de usar até que o tempo de 1000 milissegundos tenha passado.

No começo vai se tornar frustrante e você vai sentir a sua produtividade abaixando, mas com o tempo e a utilização de outras motions você perceberá um aumento de produtividade.

Instale o plugin e experimente um pouco.

Algumas customizações de configurações também podem ser feitas:

Adicionando configurações ao plugin

Habilita-o por padrão ao abrir um arquivo:

let g:hardtime_default_on = 1

Mostra mensagens na barra de status (exemplo: quando uma motion foi bloqueada):

let g:hardtime_showmsg = 1

Limita uma motion pela quantidade de vezes definida:

let g:hardtime_maxcount = 2

Desabilita o plugin para certos padrões de buffer (no caso abaixo, desabilita para os plugins Nerdtree e Buffergator):

let g:hardtime_ignore_buffer_patterns = [ "CustomPatt[ae]rn", "NERD.*", "Buffergator*" ]

Com ele também existe a possibilidade de desabilitar algumas teclas (como fizemos no começo do artigo, você pode utilizar a configuração abaixo sem ter que utilizar nnoremap, inoremap, vnoremap):

let g:list_of_disabled_keys = ["<UP>", "<DOWN>", "<LEFT>", "<RIGHT>"]

Você também pode atribuir uma tecla para habilitar/desabilitar o plugin (super útil quando se está começando com o plugin a fim de evitar grande frustrações), no meu caso ao apertar minha tecla líder seguida de ht o plugin vai ser habilitado ou desabilitado:

nnoremap <leader>ht <Esc>:call HardTimeToggle()<CR>

Conclusão

No artigo anterior citei que a curva de aprendizado de Vim é grande, mas que com o tempo o editor se torna prazeroso de se utilizar. As motions estão aí para ajudar em nossa produtividade, no Vim existem diversas motions e várias maneiras de se fazer a mesma coisa, pense em como você está utilizando essas motions e se há outra forma melhor de se fazer a mesma coisa.

Referências

https://www.vim.org/

https://vimeo.com/53144573

https://github.com/takac/vim-hardtime

http://vim.wikia.com/wiki/All_the_right_moves*

Author image
Brasil
I'm a Developer with good experience on design and architecture of software projects, agile methodologies, continuous integration, continuous deployment and continuous delivery.