reona.dev

定義元ジャンプを filetype で使い分ける


はじめに

.vimrc たまにいじりだすと止まらなくなりますよね。テスト勉強中に掃除しだしたら止まらない感覚と似てます 🤔

最近だと、coc.nvimに非常にお世話になっています。 VSCode のような LSP(Language Server Protocol)のサポートで、ほとんどの言語で強力な補完を実現してくれます。 この補完は本当に感動モノなんですが、定義元ジャンプや参照元ジャンプ、簡易リファレンスも参照できて、超すごいです。 以前は Ctags でタグを生成しジャンプするスタンダードな方法で開発していましたが、coc.nvim だとより高速です。

最近は Swift での開発で XCode と XVim2 を使っていますが、標準のジャンプ機能がかなり優秀ですね。 coc.nvim は Ruby ファイルの場合だとジャンプが機能してくれず、それはなかなかに困っていました。

Ruby の場合、以前 Ctags で上手く動作することは確認済みなので、 今回はファイルタイプに応じてジャンプのコマンドを使い分ける設定をしました。

Ctags のインストール

Ctags は 2 種類あります。

アクセスしていただくとサイトデザインからも一目瞭然なんですが、前者はもう 10 年以上メンテナンスされていません。 逆に後者は本記事執筆時点で最終更新から 3 日なので、よっぽどの理由がない限り後者の universal-ctags を選択するとよいでしょう。

$ brew install --HEAD universal-ctags/universal-ctags/universal-ctags

タグの生成

$ ctags -R .

# Rubyファイルに限定する場合
$ ctags -R . --languages=Ruby

調査中にこちらの記事でたまたま見つけたのですが、次のコマンド実行後にタグ生成すれば gem の内部コードへのパスを設定し、ジャンプできるようになります。いちいちブラウザで調べる必要がなくなったので嬉しい、、

$ bundle install --path=vendor/bundle

設定

coc.nvimに関しては、ドキュメントに具体的な設定が載っているので参考にするとよさそうです。ジャンプのコマンドは ctags のもので慣れてしまっているので、合わせる形で変更しました

# dein.toml
 
[[plugins]]
repo = 'neoclide/coc.nvim'
rev = 'release'
hook_add = '''
  let g:coc_global_extensions = [好みの拡張]
  nmap <silent> <C-]> <Plug>(coc-definition)
  nmap <silent> <C-t> <Plug>(coc-references)
'''
 
# .vimrc
 
set tags=./tags;
autocmd filetype ruby nnoremap <C-]> g<C-]>
 

定義元ジャンプは Ctrl-] 、ジャンプ元へ戻る場合は Ctrl-o 、参照元ジャンプは Ctrl-t です。

これで Ruby ファイルの場合は ctags、その他のファイルだと coc.nvim のジャンプが実行されるようになりました 🎉