Vim で tags を使って ruby と gem のソースコードをブラウジングする（翻訳）

Vim で gem のコードを読むにはどうすればいいかを調べていたところ、参考になる記事があったので翻訳してみました。

原著者の許諾を得て翻訳・公開します。

* 英語記事: [Using tags to browse ruby and gem source with Vim :: Jakub Chodounský :: The diary of a software developer](https://chodounsky.net/2016/12/09/using-tags-to-browse-ruby-and-gem-source-with-vim/)
* 原文公開日: 2016/12/09
* 著者: Jakub Chodounsky

---

数ヶ月前、私はシドニーに行きました。そこで私のチームメイトの Andrew が [RubyMine](https://www.jetbrains.com/help/ruby/2016.2/browsing-through-the-gems-repositories.html) のかなり気の利いた機能を見せてくれました。彼はその機能を使い、Ruby のメソッド定義元にジャンプすることができました。それ自体はそこまで特別ではありませんでした、彼がある gem のソースコードにシームレスに移動するまでは ― 私は感動しました。

この記事では、Vim で同様のワークフローを作成し、Vim を強力な IDE に変換する方法について説明します。それではまず、プロジェクト内のメソッド宣言元にジャンプしてみましょう。

Vim でメソッド定義やシンボル間をジャンプ移動するためには、移動することができるように、ある種のマップが必要となります。これらのマップは tags と呼ばれ、今回利用するのは[Exuberant Ctags](http://ctags.sourceforge.net/)です。

最も簡単な tags の生成方法は、プロジェクトのルートディレクトリで `ctags -R` コマンドを実行することです。[vim-rails](https://github.com/tpope/vim-rails) プラグインを使っている場合は、`:Ctags` [^1] コマンドで tags を再生成することができます。[guard](https://github.com/ivalkeen/guard-ctags-bundler) を用いてファイルに変更があった時や、[git hook](https://tbaggery.com/2011/08/08/effortless-ctags-with-git.html)で新しいコードをチェックアウトした時に自動で tags を生成するよう環境設定することもできます。私の場合は、手動での生成で十分でした。

## tags 間を移動する

Vim は tags 間の移動機能が組み込まれているため、そのために新たに Vim プラグインを導入する必要はありません。私が最もよく使う2つのコマンドは、定義元に移動する `ctrl + ]` と、ジャンプ元の場所に戻る `ctrl + o` です。選択したシンボルに複数の tags がある場合は、ビジュアルモードでの `:tselect` コマンドや、`g]` コマンドを利用できます。それ以外に、`:tnext` と `:tprevious` を使うことができます。

もう一つの選択肢としては [CtrlP](https://github.com/kien/ctrlp.vim) を使うことです。 CtrlP はファイル名や tags を参照できるあいまい検索プラグインです。tags の移動を利用するためのコマンドは `:CtrlPTag` です。

Vim はマウスモードもサポートしています。`ctrl + click` で定義元に移動し、`ctrl + right click` で元に戻るという、モダンな IDE に似た移動をサポートしています。

## gem のソースコードにジャンプする

ここまで、プロジェクト内で tags 生成・移動についてまとめてきましたが、私にとってはここ数年間これで十分でした。しかし利用している gem 内のメソッド定義にジャンプすることはできるのでしょうか？

Vim プラグインのインストールをしない場合、`bundle open` を使うと、エディタ上で gem のソースコードを参照することができます。幸運にも、我々はもっと良い方法で、利用している gem の tags を生成することができます。

そのためには、いくつかのプラグインを Vim にインストールする必要がありますー [vim-rbenv](https://github.com/tpope/vim-rbenv) と [vim-bundler](https://github.com/tpope/vim-bundler) です。そしてパズルの最後のピースは、 `gem-ctags` と呼ばれる gem です。

以上は Vim に現在のプロジェクトで使っている gem のソースコードに移動する方法を教えるのに十分なはずです。また、 bundler をフックし、gem の更新やインストールがあった場合にはいつでも tags を再生成してくれますーしっかりしていますね。

## 結論

完全に機能するセットアップをするには、まず brew で [Exuberant Ctags](http://ctags.sourceforge.net/) をインストールします。

```
brew install ctags
```

[Pathogen](https://github.com/tpope/vim-pathogen) を使っている場合、`.vimrc` に以下のプラグインの記載が必要です。

```
Plugin 'vim-ruby/vim-ruby'
Plugin 'tpope/vim-rails'
Plugin 'tpope/vim-rbenv'
Plugin 'tpope/vim-bundler'
```

その後、[gem-ctags](https://github.com/tpope/gem-ctags) と [rbenv-ctags](https://github.com/tpope/rbenv-ctags) をインストールします。

```
gem install gem-ctags
gem ctags

mkdir -p ~/.rbenv/plugins
git clone git://github.com/tpope/rbenv-ctags.git \
  ~/.rbenv/plugins/rbenv-ctags
rbenv ctags
```

すると Vim が強力な Ruby の IDE に変わります。これで `:Ctags` [^1] を実行することでプロジェクトの tags を生成・更新でき、`ctrl + ]` を押すことでソースコードの定義にジャンプすることができます。

[^1]: 元記事では`:Rtags` と記載されていましたが、現在は`:Ctags` というコマンドに変わっているようです。(参考：https://github.com/tpope/vim-rails/commit/b636decf2d7017aef42c18453a0ae2758ee9c2fc)

## 参考情報

Vim のセットアップに必要な重要なプロジェクト：

* [gem-ctags](https://github.com/tpope/gem-ctags): gem インストール時に tags を生成する
* [rbenv-ctags](https://github.com/tpope/rbenv-ctags): rbenv で Ruby をインストールする際、ruby の tags を生成する
* [vim-ruby](https://github.com/vim-ruby/vim-ruby): Vim における Ruby ファイルのパスサポートを提供する
* [vim-rails](https://github.com/tpope/vim-rails): tags 再生成の簡単な方法を追加する
* [vim-rbenv](https://github.com/tpope/vim-rbenv): Vim における rbenv でインストールした Ruby ファイルのパスサポートを提供する
* [vim-bundler](https://github.com/tpope/vim-bundler): Vim で tags の場所を設定する

Ctags を最新の状態に保つためには？

* [Git hook approach to tag generation](https://tbaggery.com/2011/08/08/effortless-ctags-with-git.html)
* [guard-ctags-bundler](https://github.com/ivalkeen/guard-ctags-bundler) はファイル変更時に自動で tags 生成してくれます

Vim のセットアップや tags についての記事やガイド:

* [Browsing programs with tags](http://vim.wikia.com/wiki/Browsing_programs_with_tags)
* [Supercharge your VIM into IDE with CTags](https://blog.sensible.io/2014/05/09/supercharge-your-vim-into-ide-with-ctags.html)
* [Combining Vim and Ctags](http://arjanvandergaag.nl/blog/combining-vim-and-ctags.html)
* [Exuberant Ctags](http://ctags.sourceforge.net/)