Help us understand the problem. What is going on with this article?

Neovim で関数ジャンプする

ある 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 しなくて済む!

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした