11
9

More than 3 years have passed since last update.

Neovim で関数ジャンプする

Last updated at Posted at 2019-12-20

ある vimmer が IDE を眺めていて思ったこと。


関数の定義元にジャンプするやつずるい!!!!!!!


Vim でもぴょんぴょんしたい...

※ 以下は Neovim での手順ですが、Vim でも Neovim でもだいたい同じ手順のはず

ctags のインストール

Ctags(英: Ctags)はソース及びヘッダ内にある名前のインデックス(又はタグ)ファイルを生成するプログラム。
- Ctags - Wikipedia

関数ジャンプを実現するにはこいつと vim のタグジャンプを組み合わせればいい。

ctags といっても exuberant-ctags と universal-ctags というのがあり、前者はメンテされてないっぽい。
なので universal-ctags をインストールしてみる。

Mac を使ってるので Homebrew を使う。

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

実行が終わったらインストールされたか確認。

$ brew tap
homebrew/cask
homebrew/core
universal-ctags/universal-ctags

追加されてるね。
ついでに ctags コマンド打ってみる。

$ ctags --version
Universal Ctags 0.0.0(ff18000), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Jul 17 2019, 22:33:32
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath, +case-insensitive-filenames, +packcc

たぶんOK。

設定ファイルの作成

universal-ctags の設定ファイルは ~/.ctags.d/ 配下に拡張子が .ctags のファイルを置く。

$ mkdir ~/.ctags.d
$ touch ~/.ctags.d/config.ctags

config.ctags はとりあえず以下のようにしておく。

config.ctags
# 除外するファイル or ディレクトリ
--exclude=*.min.js
--exclude=.git
--exclude=node_modules

# タグを作成する言語
--languages=javascript,php,python,typescript

# 言語ごとの作成するタグの種類
--kinds-javascript=*
--kinds-php=-{namespace}{local}{alias}
--kinds-python=*
--kinds-typescript=*

# 再帰的にディレクトリを探索してタグを作成
--recurse=yes

# タグを case-sensitive にソート
--sort=yes

# タグに相対パスを使う
--tag-relative=yes

# 参照する側のタグも作成
--extras=+{reference}

正規表現を使う

関数名が動的に定義されたりする場合でも、 ---regex-<LANG>= オプションでタグを作ることができる。
以下は Laravel のスコープとアクセサに対応させた例。

config.ctags
--regex-php=/get([a-z|A-Z|0-9]+)Attribute/\1/
--regex-php=/scope([a-z|A-Z|0-9]+)/\1/

タグの生成

試しにタグを作ってみる。
-R--recurse と同じ。

$ ctags -R

デフォルトではカレントディレクトリに tags というファイルができる。

Neovim 経由で作るので一旦削除。

$ rm ./tags

Neovim の設定

init.vim に追記する。
以下のように書いておくと開いているファイルから親を遡って tags を探してくれるらしい。

set tags=./tags;

他にも色々設定できる。

set tags=./tags " 開いているファイルのディレクトリから tags を探す
set tags=tags   " カレントディレクトリから tags を探す
set tags=./tags,tags " どちらも探す (優先度高い順)

これで、手動で ctags -R すれば一応は使えるようになった。

プラグイン

ファイル更新時に生成したりするのは面倒なのでプラグイン入れる。
auto-ctags.vim が良さそう。

dein などでインストールして、設定を init.vim に追記。

" ファイルに書き込む際にタグ生成
let g:auto_ctags = 1

Neovim で以下を実行すればカレントディレクトリに tags を生成してくれる。

:Ctags

使い方

コマンド 動作
Ctrl - ] 定義元にジャンプ
Ctrl - t ジャンプ元に戻る
g] 定義元の候補を列挙する

まとめ

結構手間がかかったけど無事に使えるようになった。
関数探すのにいちいち grep しなくて済む!

参考

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9