quarta-feira, 10 de abril de 2013

Transformando o VIM em uma IDE completa.



O VIM (Vi IMproved) é o meu editor favorito para inúmeras tarefas. Ele é a combinação perfeita entre robustez e eficiência. Em outras palavras, ele é simplesmente meu canivete suiço.

Muito provavelmente, o seu primeiro contato com o Vim será aterrorizante. Felizmente, depois de entender alguns dos conceitos básicos, você perceberá com detalhes que ele é, como diria minha mãe: pau pra toda obra.

Se você já estudou em algum curso superior em informática, provavelmente já passou por alguma disciplina em que teve de implementar um editor de texto. Foi implementando o meu próprio editor de texto na faculdade que percebi o quão poderoso o Vim pode ser.

Se o Vim é algo muito novo para você, eu recomendo executar o tutorial que já vem nos pacotes das distribuições mais novas. É um excelente tutorial interativo, utilizando a própria ajuda do vim.

Instalação

Se você usa alguma distribuição baseada em Debian, como o Ubuntu, basta instalar o vim com o apt-get:

$ apt-get install vim vim-gnome

Se você for apenas utilizar o Vim pelo terminal, não precisa do vim-gnome. Eu recomendo o Vim-gnome porque ele lhe permite utilizar algumas integrações com o ambiente gráfico, além de ter uma barra de ferramentas e uma boa integração com o mouse, ideal para principiantes. Se você ainda não encontrou a luz, e ainda está usando Windows, pode instalar o Vim no seu computador, baixando diretamente do site do projeto [0].

Um pouco do básico

O ideal para você iniciar é seguir o passo a passo do vimtutor. Depios de instalar o Vim, você poderá iiciar o vimtutor do terminal por meio do comando:

$ vimtutor

De qualquer forma, seguem algumas dicas importantes para começar:

  1. O vim possui uma "barra de status", no rodapé da janela. Ela também é a barra na qual você digita os "comandos" do editor. Pense nestes comandos como o equivalente a uma dezena de botões e menus que normalmente você encontra nos programas: eles lhe dão acesso aos recursos do software, a única diferença é que você vai digitá-los ao invés de clicar neles.
  2. O vim possui modos, e isso é, muitas vezes o primeiro obstáculo. O modo normal pode ser entendido como um modo de somente leitura, no qual você digita instruções na barra de comandos. O modo de inserção é o modo que você usa para editar o conteúdo do arquivo e o modo visual é o modo que você poderá fazer seleções no texto para copiar ou recortar partes do mesmo.
  3. Ao entrar no vim, você terá acesso ao modo normal, e se começar a digitar pode acionar acidentalmente comandos indesejados. Pressionando a letra i ou o botão INSERT, você entra no modo de inserção, e pressionando v no modo visual. Estando nos modos de inserção ou visual, pressionando ESC você retorna para o modo normal.
  4. Os comandos do vim são, normalmente, digitados no modo normal, prefixados pelo caractere dois pontos: :. Por exemplo, para encerrar o vim utilize o comando :q. Para salvar o texto atual (muitas vezes chamado de buffer na documentação do Vim) utilize o comando :w. Um atalho para sair do vim, já salvando, é o comando :x. Lembre-se que, normalmente, você vai apertar um ESC antes de digitar os comandos, já que assim garante que está no modo normal.
  5. O vim possui um manual de ajuda embutido, que dá detalhes completos sobre o programa. Para abrir o manual, utilize o comando :help. Também é possível ler um tópico específico do manual utilizando o comando help seguido do tópico, comando ou função desejado. Experimente ler os tópicos :help q, :help w e :help x
Essas dicas simples servem para ajudara a entender o funcionamento básico, apenas para que você fique mais familiarizado com o Vim. Utilize o vimtutor para aprender mais sobre a ferramenta se você está apenas iniciando.

Mais do que um editor de textos

O vim não é apenas um simples editor de buffers de texto. Por exemplo, você pode fazer coisas como:

  • Executar comandos no prompt.
  • Abrir abas, dividir a tela em janelas horizontal e verticalmente, e tudo isso combinado diversas vezes.
  • Compilar o código fonte.
  • Criar scripts e funções.
  • Mapear atalhos do teclado para comandos do editor.
  • Visualizar diretórios, arquivos .zip, .tar.gz, e arquivos binários (se você souber o que está fazendo, é muito útil).
  • Pesquisar / substituir utilizando expressões regulares.
  • Auto-completar código (assim como nas IDEs mais famosas).
  • Utilizar (e customizar!) o syntax highlight de todo e qualquer tipo de arquivo.
  • Navegar pelo código fonte (com o auxílio de um arquivo de tags).
  • ... e muito, muito mais!
Combinando uma boa seleção de plugins, mapeamentos confortáveis no teclado, e entendendo a dinâmicda do Vim, você poderá utilizá-lo como um substituto excelente para programar em diversas linguagens.


Personalizando

Você pode customizar o Vim por meio do arquivo .vimrc, salvo em seu diretório pessoal (~/.vimrc no *nix). Este arquivo consiste, basicamente, em comandos que você poderia digitar diretamente na barra de status do Vim, combinados na forma de um pequeno vimscript. Neste arquivo, assim como em qualquer outro script do Vim, uma linha iniciada por aspas é um comentário.

Neste post, vou lhes mostar algumas configurações que eu geralmente uso para tornar o Vim mais agradável.

syntax on
Ativa a sintaxe por padrão, ao carregar o vim. O recurso vem desabilitado porque pode demorar para carregar arquivos grandes. É útil ele estar ativo já que nos arquivos muito grandes, você pode pressionar CTRL+C para interromper o parser do hilight, e depois desabilitar com syntax off.

set number
Ativa a numeração das linhas. Muito interessante especialmente para edição de código-fonte. Por padrão desabilitado, e você também pode desligar com o comando :set nonumber

set mouse=a
Ativa (mesmo em conexões por SSH!) as funcionalidades do mouse para a sua sessão do Vim.

set hlsearch
Ativa o hilight das pesquisas. Basicamente, quando você efetua uma busca, busca e substituição, o vim irá deixar as ocorrências em destaque, parecido ao amarelão do Gedit/Kwrite quando você pesquisa por algo.

set nomousehide
Não sei porque, mas tem horas que o mouse no Gvim dá uma sumida, e parece que você está ficando doido. Não tem efeito se você abrir o vim no terminal.

set sw=8 ts=8 st=8 noet si ai
Esta sequência "mágica", configura a tabulação para o equivalente a 8 espaços, sem expandir o tab, ou seja, sem substituir tudo por espaços. Na prática, cada comando separado por um espaço faz uma coisa. Fica como uma tarefa para o leitor consultar o manual de cada um. Todos juntos são úteis para que as quebras de linha no código já identem corretamente. Troque o 8 por 4 ou 2 se você preferir visualizar as tabulações com menos espaços, e troque noet por et para inserir espaços quando você pressionar a tecla tab (não faça isso em Makefiles!).

au
Aqui começa um pouco de "mágica" na sua configuração. O au ou autocommand permite que eventos sejam mapeados para comandos do editor que permite que a customização seja dinâmica, conforme o tipo de arquivo que você está editando, por exemplo. Vamos supor que você queira utilizar espaços no lugar de tabulações, e que sejam 4 espaços ao invés de 8 para a maior parte dos arquivos, mas quando você estiver editando um Makefile, você quer que a configuração seja para usar as tabulações mesmo, e queira visualizar com 8 espaços. Para atingir este objetivo, basta usar as linhas abaixo em seu vimrc:

set sw=4 ts=4 st=4 et si ai
au BufRead,BufNewFile Makefile set sw=8 ts=8 st=8 noet si ai

A primeira linha configura como padrão a tabulação de 4 espaços, e a segunda, configura um autocommand, para toda vez que um arquivo for lido ou aberto, com o nome Makefile, configurar a tabulação normal. Veja mais detalhes em :help au.

Em seu vimrc, além de comandos como os acima, você também poderá criar funções (que são executadas com o comando :call) e criar comandos personalizados, que basicamente agrupam outros comandos ou chamam outras funções. Comandos definidos pelo usuário devem ser iniciados por uma letra maiúscula.

Criando funções

Vamos supor que você queira criar uma função para fazer o pull de seu repositório mercurial, sem deixar o editor. Para isso, você pode incluir o seguinte em seu vimrc:

function HgPull()
  echo "Trazendo revisões do servidor remoto ..."
  !hg pull
endfunction

Para executar esta função, basta digitar o comando :call HgPull()A primeira linha inicia uma função, a segunda e terciera contêm o corpo da função e a quarta, encerra a função. Um atalho para as palavras chaves function e endfunction são, respectivamente fu e endfu. O comando ! é um comando do vim que executa uma função no shell (ou prompt), e por padrão exibe a saída do comando que o segue.

Plugins

Os plugins são instalados em seu diretório ~/.vim/plugins. Para plugins que nem sempre são utilizados, você poderá instalá-los no ~/.vim/autoload, desde que o script do plugin tenha suporte para isso. Uma lista interessante de plugins para você ir brincando pode ser encontrada em [3].

Um vimrc que já está quase virando plugin

Eu e outros amigos usuários do Vim estamos montando um vimrc que compartilhamos no Bitbucket. Tive esta iniciativa para uniformizar o meu vimrc de casa, do notebook e do trabalho, e também para tornar o trabalho de programar em Java com o Vim um pouco menos laborioso. Como efeito colateral, à medida em que fui utilizando o vim para programar e fui incrementando o vimrc com vários recursos, fui aprendendo cada vez mais sobre vimscript.

Nom momento em que escrevo, o vimrc está hospedado junto com outros scripts bem interessantes que eu estou publicando no projeto https://bitbucket.org/ronoaldo/ronoaldo-utils. Atualmente, ele traz as configurações acima, uma coletânea com pequenas funções que eu uso diariamente, e alguns mapeamentos de teclado interessantes, como o CTRL+S para salvar o arquivo. Também inclui ma seleção de plugins instaláveis facilmente por funções definidas no próprio vimrc por meio do script pathogen.vim, e uma configuração especial para projetos Java/Maven em ~/workspace/projeto.

Com esta configuração, você pode:

  • Instalar a coletânea de plugins com o comando :call InstallAllPlugins.
  • Utilizar o CTRL+F12 para abrir um navegador de arquivos (plugin NERDTree).
  • Salvar pressionando CTRL+S.
  • Utilizar o comando :IndexWorkspace para indexar todos os arquivos .java de sua workspace (requer exuberant-ctags).
  • Utilizar CTRL+P para fazer pull e CTRL+U para fazer push no Mercurial.
  • Executar testes de projetos Maven em sua workspace com o comando :Junit
  • Compilar um projeto Maven utilizando CTRL+F8, ou arquivos Java standalone utilizando o mesmo atalho.
  • Utilizar templates de código estilo os do Textmate (plugin snipmate).
  • Criar atalhos de forma bem simples, com o comando :call KeyMap("atalho", "ação")
  • E mais está por vir ...

O script está crescendo em funcionalidades e eu estou considerando a possibilidade de que ele seja, por si só, um plugin. Estou recebendo patches ;)

Conclusão

Se você está procurando por uma alternative eficiente e leve, mas sem perder a robustez, o Vim pode ser uma excelente escolha, depois que você quebrar a barreira do como eu começo a digitar nesta coisa?.

:echo "Happy hacking!"

Referencias


[0] Site oficial: http://www.vim.org/
[1] Vim Tips Wiki: http://vim.wikia.com/wiki/Vim_Tips_Wiki
[2] Ótimo tutorial sobre Vimscript: http://learnvimscriptthehardway.stevelosh.com/
[3] Lista com plugins úteis: http://www.catonmat.net/series/vim-plugins-you-should-know-about