Configurando minimamente o vim

Tenho usado muito o editor de textos do terminal Vim esses últimos dias. Uso tanto em casa, como no trabalho, seja no desenvolvimento das minhas aplicações, quanto para escrever esse post. Chegou a um ponto que senti a necessidade criar uma configuração para me deixar mais à vontade, pois me vi replicando as mesmas configurações uma a uma, entre os computadores. Então, partiu dar uma estudada em como realizar essa tarefa e criar um arquivo de configuração do Vim, o vimrc.

placeholder

O arquivo

Todas as configurações do vim ficam em um arquivo de nome .vimrc localizado na $HOME. Assim, o vim já carrega automaticamente as configurações ao abrir.

Onipresença

O primeiro passo foi pensar em uma maneira de deixar ele disponível tanto em casa, quanto no trabalho. A melhor forma, pensando nas ferramentas que conheço, foi usar nosso bom amigo, o git, através do github. Então, criei um repositório e joguei o arquivo lá =).

Tendo o arquivo em mãos, para não ficar copiando manualmente, criei um script que faz isso para mim. Então, independentemente de onde eu clonar o repositório, o script é responsável por pegar o arquivo e colocar no local correto (no diretório $HOME). O script também ficou com a responsabilidade de instalar as dependências para funcionamento correto. Que no caso, até agora é o gerenciador de plugins do vim.

Então, da forma como está implementado hoje (o futuro a Deus pertence), para usar basta rodar o script:

bash install.sh

Este comando copiará o arquivo, e instalará as dependências, se necessário. Caso deseje apenas copiar você pode rodar:

cp .vimrc $HOME

Ou ainda:

bash install.sh --vimrc

O que tem até agora no vimrc

NERDTree

A primeira coisa que me faz mais falta quando abro o Vim, é a falta de uma barra vertical lateral com a árvore de arquivos. E o plugin mais famoso para isso é o NERDTree. Ele tem uma documentação bem boa, vale a pena a leitura. A configuração garante ele instalando via Vundle, um gerenciador de plugins do Vim.

No arquivo, configuro 3 coisas:

  1. Abrir o NERDTree sempre que o Vim for aberto;

  2. Quando abrir o Vim, mudar o foco para o arquivo aberto;

  3. Quando fechar o arquivo, caso só tenha sobrado o NERDTree aberto, fecha o Vim;

  4. Configuro o atalho para abrir e fechar o NERDTree como Ctrl + o.

" Open a NERDTree automatically when vim starts up
autocmd vimenter * NERDTree
" When open change the focus to the file (and not the NERDTree)
autocmd! VimEnter * NERDTree | wincmd w
" close vim if the only window left open is a NERDTree
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
" (CTRL-O) open nerd tree
nnoremap <C-o> <ESC>:NERDTreeToggle<CR>

Tema de cores

O tema de cores é um assunto bem delicado, afinal cada pessoa tem um gosto. E eu particularmente sou daqueles que costuma ficar mudando de tempos em tempos para não enjoar. No momento estou usando o horizon, baseado no Visual Studio Code. Ele é instalado usando o Vundle.

colorscheme horizon

Codar

Nesse caso é sempre uma guerra. Afinal, tab ou espaço? 2, 4 ou 8 espaços? Nesse, configurei da forma que gosto.

Resumindo: Espaços no lugar do tab, tab com 4 espaços, indentação automática, destacar abre e fecha (){}””. Por último, gosto de ver o número das linhas, no caso do vim, gosto de ver de maneira relativa para não ter que ficar contando as linhas para os comandos.

set number relativenumber
set nu rnu

" set UTF-8 encoding
set enc=utf-8
set fenc=utf-8
set termencoding=utf-8
" disable vi compatibility (emulation of old bugs)
set nocompatible
" use indentation of previous line
set autoindent
" use intelligent indentation for C
set smartindent
" configure tabwidth and insert spaces instead of tabs
set tabstop=4        " tab width is 4 spaces
set shiftwidth=4     " indent also with 4 spaces
set expandtab        " expand tabs to spaces
" turn syntax highlighting on
set t_Co=256
syntax on
" highlight matching braces
set showmatch
" intelligent comments
set comments=sl:/*,mb:\ *,elx:\ */

Outros configurações

Algumas outras configurações para auxiliar e destacar o que acho importante.

" Search
set hlsearch     " highlight matches
set incsearch    " incremental searching
set ignorecase   " searches are case insensitive...
set smartcase    " ... unless they contain at least one capital letter  

Dicas

O NERDTree pode abrir os arquivos em abas e ainda dividir a tela.

Mudar o foco: Para mudar o foco, pressione CTRL w + direção. A direção pode ser com as teclas hjkl ou as teclas direcionais. CTRL w + CTRL w (isso mesmo, 2 vezes) chaveia entre as janelas.

Abrir o arquivo na mesma tela, dividindo na horizontal: Selecione o arquivo no NERDTree e pressione “i”

Abrir o arquivo na mesma tela, dividindo na vertical: Selecione o arquivo no NERDTree e pressione “s”

Abrir o arquivo em outra aba: Selecione o arquivo no NERDTree e pressione “t”

Para chavear entre as abas: Pressione “g” e depois “t”, para próxima, ou “T” para a anterior, ou “#gt” para mudar para aba número #. Para facilitar, nas configurações têm uma função e um atalho para mudar de aba. H, move para aba anterior, e L, para a próxima.

" MyNext() and MyPrev(): Movement between tabs OR buffers
function! MyNext()
    if exists( '*tabpagenr' ) && tabpagenr('$') != 1
        " Tab support && tabs open
        normal gt
    else
        " No tab support, or no tabs open
        execute ":bnext"
    endif
endfunction
function! MyPrev()
    if exists( '*tabpagenr' ) && tabpagenr('$') != '1'
        " Tab support && tabs open
        normal gT
    else
        " No tab support, or no tabs open
        execute ":bprev"
    endif
endfunction

nnoremap L <ESC>:call MyNext()<CR>
nnoremap H <ESC>:call MyPrev()<CR>

Outras dicas: Você pode acessar um Vim Cheat Sheet e ver as várias possibilidades e comandos para o Vim.

Conclusão

A configuração é bem simples, mas tem vários detalhes que podem otimizar o dia a dia. Além do mais, este trabalho já resolve o problema de manter todos meus ambientes “sincronizados”.

Ainda há outras coisas a se melhorar, mas é um começo e já resolve bem as questões mais simples de configurações.

Comments