Pages

Thursday, May 28, 2009

Configurando o vim

Recentemente eu resolvi configurar definitivamente o meu .vimrc.

Isso é mais trabalhoso do que parece.

Antes de mais nada, qual é o meu perfil ou o que eu preciso do vim (ou de um editor)?
  • Eu escrevo, e muito, em LaTeX, quase tudo que escrevo é em LaTeX ou texto puro.
  • Eu programo em FORTRAN. E nem me diga que isso é coisa do passado (ainda que de fato seja).
  • Pretendo programar em C/C++. Ainda em que processo (lento) de estudo, um dia eu chego lá.
  • Eu uso muito shellscript (quase sempre em uma função muito pessoal para ser publicada).
  • Irei programar em Python (pena que não estou com tempo para estudá-lo).
  • Quero um corretor ortográfico (português e inglês).
  • Necessário um recurso de auto-completar códigos (especialmente para o LaTeX).
  • Gerenciamento de projetos, o que significa gerenciar tags e arquivos.
  • Programação para web básica, voltado ao mínimo necessário para escrever no blogger (as vezes eu escrevo antes no meu computador)
Definidos os meus objetivos, o como resolver isso é que era o problema. Contar a história na ordem cronológica dos eventos seria muito complicado. Então, vamos aos resultados.

Status atual do meu vim em relação aos meus objetivos :

Para LaTeX está quase completamente pronto (aprende-se coisas novas todos os dias, o que ontem era pronto, hoje ainda tem coisas para fazer). O FORTRAN está em versão minimalista. Para C/C++ eu ainda não fiz muito (algumas medidas para o LaTeX aplicam-se aqui diretamente). Quanto ao shellscript, não pesquisei nada além do mínimo.
Para o Python existem muitas dicas, ainda não tive tempo e/ou paciência para ler tudo, mas é impossível deixar de ler tópicos sobre o assunto.
O corretor ortográfico básico está implementado, mas ainda não é a melhor solução. O recurso de autocompletar foi aplicado para o LaTeX, é uma mistura de dicionário com o snipMate e de dicionário propriamente dito. O gerenciamento de projetos foi estabelecido com uma unificação da taglist (plugin que integra o ctags ao vim) e NERDTree (plugin que gerencia arquivos em disco). A programação para web eu já fiz alguma coisa, mas, no momento, não é nada que valha apena divulgar (além do meu .vimrc).

Em uma versão mais completa, segue minha lista de plugins atual.
  1. txt.vim - Estilo para escrever arquivos de texto
  2. fortran.vim - Melhorias para a sintaxe em FORTRAN
  3. taglist - Integra o ctags ao vim
  4. NERDTree - Gerenciador de arquivos via vim
  5. snipMate - Completa trechos pré-configurados (não sei como consegui sobreviver até hoje sem usar um plugin do tipo, e olha que eu conhecia o similar dele para o gedit)
  6. PotWiki - Wiki para gerenciar tarefas e pequenos textos
  7. Calendar - Calendário integrado ao vim.
Como eu mostrei acima, meus objetivos ainda não foram completamente alcançados. O motivo pelo qual eu estou escrevendo agora, é para não deixar o tópico seguinte ser muito longo.

Mas a configuração do LaTeX está bem desenvolvida. Então, vamos lá.

Primeiro instale os plugins, especialmente o taglist, o NERDTree e o snipMate.

Agora pegue meu arquivo "tex.snippets" e substitua o original (cuidado com os tabs, você não pode perder as tabulações no processo de cópia), ainda que você não tenha o meu estilo de escrever em LaTeX, certamente você não escreve como o snipMate acha que você escreve. Aliás, os snippets existentes valem mais como exemplos do que como função prática, parece até que é intencional.

Leia esse texto sobre como integrar o LaTeX com o taglist.
Basicamente consiste em criar (ou editar) um arquivo ~/.ctags e adicionar o conteúdo:
  --langdef=tex
--langmap=tex:.tex
--regex-tex=/\\subsubsection[ \t]*\*?\{[ \t]*([^}]*)\}/- \1/s,subsubsection/
--regex-tex=/\\subsection[ \t]*\*?\{[ \t]*([^}]*)\}/+\1/s,subsection/
--regex-tex=/\\section[ \t]*\*?\{[ \t]*([^}]*)\}/\1/s,section/
--regex-tex=/\\chapter[ \t]*\*?\{[ \t]*([^}]*)\}/\1/c,chapter/
--regex-tex=/\\label[ \t]*\*?\{[ \t]*([^}]*)\}/\1/l,label/
--regex-tex=/\\ref[ \t]*\*?\{[ \t]*([^}]*)\}/\1/r,ref/
Essas linhas são as definições de tags. As quatro primeiras são a estrutura de capítulos a "subsubseções". as duas últimas referem-se sobre labels e referências.

Agora instale meu .vimrc, ou melhor, instale o que te interessa, porque o meu vimrc não vai funcionar assim, a frio, na sua máquina. Quando a configuração estiver completa eu disponibilizarei o diretório .vim também (com todos os scripts adicionais).

Ele está muito bem dividido e comentado, quem quiser apenas a parte LaTeX não terá qualquer dificuldade em fazê-lo, mas observe que o meu resultado está vinculado a configuração do taglist e do NERDTree, assim como configurações escolhidas para mapeamentos e abreviações. Portanto, ler a coisa de uma forma geral pode ser muito interessante.

Aqui eu quero destacar uma certa solução. A de complementação de palavras.
Será visto no .vimrc:
  au BufNewFile,BufRead *.tex set dictionary=~/.vim/dict/latex.dic
O dicionário não está acumulativo, ou seja, que abre o arquivo tex não terá acesso a dicionários gerais, assim foi feito intencionalmente para
evitar sobreposição desenecessária de dicionários. Caso também queira outro dicionário (de palavras, por exemplo) adicione
  au BufNewFile,BufRead *.tex set dictionary+=/CAMINHO/SEU/DICIONARIO.dic
após a linha mostrada anteriormente, isso fará com que o dicionário latex.dic seja o primeiro listado e em seguida o seu dicionário.

Nesse dicionário latex.dic está o pulo do gato. Ali eu escrevi as palavras chaves do snippets (portanto, eu não preciso publicar isso). Porque eu tenho muitos snippets e no futuro terei ainda mais (com pedaços de esquações, por exemplo) e eu não memorizarei tudo assim, como se eu fosse um HD.

A configuração do dicionário está relacionada as teclas <F7>, <F8> e <C-D>

A outra linha de configuração eu devo agradecer ao Kile. Eu peguei os dicionários do Kile e coloquei usei...

Como havia alguns probleminhas, eu editei o conteúdo dos dicionários para que eles apareçam corretamente com as teclas de mapeamento.

Assim, todo espaço foi eliminado, o traço e a vírgula, viraram ponto. No primeiro momento parece que é um erro grave, mas o espaço e o traço não são comandos/opções LaTeX. A vírgula, por outro lado, é um opção LaTeX. Mas fica muito fácil saber onde tem vírgula e onde não tem, porque, vírgula surge apenas em dois lugares, nas opções e em coordenadas. As coordenadas são fáceis de identificar, porque estão entre (X,Y), por exemplo. As opções não. Porém, a questão é que não há a menor chance de uma pessoa se confundir aqui porque ou isso aparece em opções que você sabe usar (logo não há problemas) ou aparece em opções que você não sabe usar, logo, terá de consultar o manual e não terá qualquer problemas então. O objetivo é oferecer dicas, não ensinar LaTeX.
  au BufNewFile,BufRead *.tex set dictionary+=~/.vim/dict/tex/*.cwl
\ iskeyword+=\\,.,{,},[,],*,=,/,(,),>,<
O diretório "tex" do caminho acima, você pode pegar aqui. Dentro dele verá um diretório chamado "notinuse", são onde estão os comandos de pacotes que eu não uso (ou não estou interessado em ajuda). Para se ter uma idéia, no Kile padrão, apenas o latex-document.cwl e o tex.cwl são usados (e eu estou usando muito mais que isso). Os demais são desabilitados (recomendaria habilitar, no mínimo, o latex-mathsymbols.cwl, mas esse é um pensamento matemático). Dá para notar que quanto mais verbetes no dicionário, mais lento fica. Então, o ideal é criar o templates para o snipMate assim que perceber que algum comando está sendo mais usado do que imaginado inicialmente e com o tempo descobrir quais os pacotes você não quer habilitado nesse recurso.

Ainda não é a perfeição, mas agora o que o LaTeX está funcionando a pleno vapor, eu preciso trabalhar... então, eu devo ser mais lento nas implementações das minhas configurações para o vim.

Referências:
  • vimbook - tirei muitas dicas dali, mais do que isso, aprendi coisas para adaptar e escrever outras. Aliás, essa foi a força motriz para a iniciativa dessa configuração.
  • aurelio.net - referência clássica, mesmo que eu não tivesse visitado a página do camarada (e eu visitei), eu teria absorvido através de terceiros.
  • vivaotux - muitas dicas sobre vim (plugins e outras coisas).
  • Vim (Página oficial) - a documentação existente nesse site é fantástica.
Alguns arquivos vimrc:
A base inicial do meu trabalho foi o vimrc-ivan.txt completado pelos do voyeg3r (tanto o antigo quanto o novo), ou seja, eu juntei os três, tirei tudo que era duplicado ou que eu não queria e fiquei com o meu básico. Dos demais eu usei uma ou outra coisa apenas (o do aurélio é, como eu disse, pego pela onda das referências).

Por falar nisso, alguém conhece os scripts .vim que estão referênciados no arquivo vimrc do Ivan ? Porque parecem ser scripts fantásticos, mas não achei nenhum deles na net. Eu não sei se nunca foi publicado, por serem pessoais demais, ou se saiu do ar depois que a url que referência a página do Ivan deixou de ser correta... Se alguém tiver essa dica, comente, por favor...

9 comments:

  1. Mitre, tá ficando muito legal. Uma dica apenas:

    control-d no modo insert serve pra diminuir o nível de indentação e serve para aumentar. Certamente o meu vimrc deve ter mapeamentos meus que sobrepoem funções já existentes do vim, mas isto agente vaia aprendendo com dicas de amigos e com o tempo.

    Tá ficando massa!

    ReplyDelete
  2. Anonymous28/5/09 09:50

    Muito interessante esse post. Para o latex, contudo, eu uso o latex-suite. Você conhece?
    Alexandre

    ReplyDelete
  3. Meu vimrc mais atual (muito louco e não muito organizado) mas com muitas ideias:
    http://snipt.net/voyeg3r/my-vimrc

    ReplyDelete
  4. Sérgio,
    a questão da tecla de mapeamento é algo interessante.
    o que eu sei, eu sei, o que eu não sei, não faço idéia de onde descobrir... quero dizer, existe algum lugar que concatene todas as teclas de mapeamento em um único lugar?

    Por exemplo, eu posso usar CTRL-F no modo de inserção ?
    No primeiro momento eu não sei... essa escolhas são muito confusas, se pelo menos eu tivesse conseguido fazer o ALT funcionar, eu usaria mais o CTRL+ALT e o ALT sozinho.

    Quanto a nova versão do .vimrc, já pensou em colocar um link na barra lateral do seu blog para a versão mais atual do seu vimrc ?

    Porque eu procurei isso (no snipt, certamente não direito, mas procurei) e não encontrei...

    Um abraço...

    ReplyDelete
  5. Alexandre,
    Eu conheço o latex-suite.
    E francamente achei confuso, complexo e pouco claro.

    Não entendi direito como personalizar alguns pontos, teve mais sobreposição de funções do que eu gostaria, e tive problemas com a escrita acentuada.

    Ele fez parte do processo de escolha (foi o primeiro a ser testado), mas não deu certo. Depois de algumas horas tentando entender ele, eu chutei o balde e passei ao plano B, que diga-se de passagem, me agrada muito, muito mesmo.

    O que mais me agradou foi a integração que eu fiz com o dicionário e o snipMate, o taglist saiu muito melhor que a encomenda e o NERDTree não ficou atrás.

    Só resta fazer um pequeno ajuste para integrar os labels encontrados pelo ctags, a uma lista de autocompletar... mas eu até posso viver sem isso...

    Um abraço.

    ReplyDelete
  6. Oi Mitre

    usei o seu vimrc e fui copiar o snippet diretamente do site. Ele automaticamente colocou umas tabulações a mais (ficou ininteligível). Tem solução ?

    ReplyDelete
  7. Sim, você pode baixar o .vimrc da barra lateral do blog.
    Que é a versão mais nova, posterior que está nesse blog, e que está hospedado no google sites.

    No final da página, você verá o link para download.

    Para facilitar sua vida, aqui está o endereço do site
    http://sites.google.com/site/bemylifeeasy/Home/vimrc

    Eu deixei de usar o snipt.net devido a esse problemas...

    ReplyDelete
  8. Mitre, como vai? estou agora me metendo a manter o diretório do vim sobre controle de versões "usando o mercurial", estou achando muito bom a ideia veio daqui [1] - meu repositório fica aqui [2]
    outro achado incrível neste link do vimeo [3]

    1 - http://vimcasts.org/episodes/synchronizing-plugins-with-git-submodules-and-pathogen/
    2 - http://bitbucket.org/sergio/vimfiles
    3 - http://vimeo.com/user1690209

    ReplyDelete
  9. Fale rapaz,
    recentemente estou meio lotado de coisas para fazer, então desde que deixei o meu diretório de configuração satisfatoriamente útil E estável, não mais fiz modificações.
    No início do ano que vêm eu devo terminar aquilo que comecei e essa sua dica estará no topo da lista, pode apostar...
    Até mais e obrigado.

    ReplyDelete