Programação

Como definir o filetype de um arquivo no vim

Trabalhando recentemente com o Redmine, me trouxe uma situação meio incomum: precisar definir o filetype de um arquivo que não utilize a extensão .rb padrão de arquivos ruby.

Uma das muitas engenhosidades (gambiarras) que podem ser feitas quando você quer permitir que o usuário atualize o Gemfile sem necessariamente editar o Gemfile, é forçar que o mesmo inclua o conteúdo de um segundo. Como o Gemfile nada mais é do que um arquivo ruby, qualquer código ruby dentro dele é executado como tal:

local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
if File.exists?(local_gemfile)
  puts "Loading Gemfile.local ..." if $DEBUG # `ruby -d` or `bundle -v`
  instance_eval File.read(local_gemfile)
end

Este código acima é o trecho encontrado no Gemfile do Redmine, o que ele faz é carregar o conteúdo do Gemfile.local como se fosse uma continuação do mesmo Gemfile. Com isso o usuário pode incluir todas as customizações que quiser sem se preocupar em ter que fazer merge do Gemfile a cada atualização.

Isso funciona muito bem, exceto quando você abre o arquivo em um editor ou IDE. Como a extensão “.local” não é uma extensão associada ao Ruby (e nem deveria, pois pode ser usada em outros contextos), o mais correto seria definir para apenas aquele arquivo utilizar a mesma.

Alguns editores permitem que você selecione a extensão que vai usar ao abrir o arquivo, algumas IDEs permitem definir a extensão somente para aquele arquivo e não para todos que usem a extensão, porém todas essas preferências são salvas em algum registro da própria máquina, que ao ser aberto em outra, é necessário fazer todo o procedimento novamente.

No caso do vim, existe uma alternativa muito boa pra resolver esse problema (que pode ser usado para muitos outros casos, não somente pra esse), que é criar instruções de configuração em um bloco de comentário, no início do arquivo:

# vim: filetype=ruby
gem ...

O comentário acima é equivalente a digitar :set filetype=ruby ao abrir o arquivo. A mesma técnica pode ser usada para definir outras variáveis de ambiente que você achar que faz sentido (basta separar as definições por espaço), por exemplo:

# vim: filetype=ruby sts=2 tabstop=2
gem ...

Atualização: Em uma versão anterior do post eu sugeria definir a sintaxe para ruby: syntax=ruby no entanto, apesar dessa alteração colorir corretamente o arquivo, outros comportamentos que podem ser definidos via plugins ou configurações específicas para FileTypes não iriam funcionar. Dessa forma, ao definir o FileType, a sintaxe correta também é carregada, e o comportamento esperado é obtido.

Para saber mais, leia a documentação completa com exemplos.

Padrão