Rakeでvim用のタグファイルを生成

世間じゃいろんなIDEでのRails開発環境が整ってきたようですが、vimも負けてはいないよ、ということでtagsファイルを生成するRakeタスクを作ってみました。

生成されたtagsファイルをカレントディレクトリにおいておくと、vim上で^[でクラスやメソッドを定義しているソースに飛べます。戻るのは^tで。

以下スクリプト全文です。lib/tasks以下にtags.rakeなんていう名前で置いてください。
また、実行にはexuberant-ctagsが必要です。

あとは

 $ rake utils:tags

で実行できます。

もう少しきれいにすべきところで思い付くのは

  • gemのインストール場所をハードコードしているのをなんとかする。
  • 同様にバージョンももっときれいに。自動的に検出できるとよいのに。
# vim:set ft=ruby:

GEM_ROOT = "/usr/lib/ruby/gems/1.8/gems"
desc "Generate `tags' file using exuberant-ctags."
namespace :utils do
  task(:tags) do
    command     = "exuberant-ctags --append --recurse ".freeze
    File.exist?("#{RAILS_ROOT}/tags") && File.delete("#{RAILS_ROOT}/tags")

    unless File.directory? "#{RAILS_ROOT}/vendor/rails"
      rails_dir = current_gems.map{|path| "#{GEM_ROOT}/#{path}" }
    else
      rails_dir = ["#{RAILS_ROOT}/vendor/rails"]
    end

    (app_dirs + rails_dir).each do |path|
      $stderr.puts "Generating tags for #{path}."
      system "#{command} #{path}" || raise("Failed to generate tags.")
    end
  end
end

def app_dirs
  %w[ app
      lib
      components
      test].freeze
end

def current_gems
  %w[ actionmailer-1.2.1
      actionpack-1.12.1
      actionwebservice-1.1.2
      activerecord-1.14.2
      activesupport-1.3.1
      rails-1.1.2 ].freeze
end
private :app_dirs, :current_gems