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.