• システム開発での作業効率化に必要不可欠な定義ジャンプ(tags、language-server)
  • 2018/05/11
  • Category:
  • 大規模なシステム開発をしていると、そこそこの頻度で使用するコマンドがあるかと思います。
    そのなかでも今回は、定義ジャンプを紹介します。

    定義ジャンプとは


    コーディングをしていると、メソッドの内容や使用時に必要な引数がどのようになっているか思い出せないことが発生します。
    そのとき、都度メソッドがどのファイルのどこに記述されているかを探すのは手間となってしまうでしょう。
    そんなとき、定義ジャンプ機能があれば簡単にメソッドなどの定義先に移動して、内容を確認することができます。

    EclipseやといったIDEや、Atomなどのモダンエディタであれば大半の言語で実行可能な標準機能となりますが、歴史的なおさらいも兼ねて今までのやりかたも紹介してみたいと思います。

    検索を容易とするインデックスを作成するtags


    tagsとはメソッドや変数などの定義箇所のインデックスを作成するためのプログラムです。
    そのなかでも複数の言語に対応したctagsが有名(Google検索でたくさんヒットする)なので紹介します。
    以下のようなコマンドを実行すると、tagsというインデックスファイルが生成されます。

    ctags -R –languages=PHP –langmap=PHP:.php.inc –php-types=c+f+d -f ~/tags

    生成したファイルを読み取り、定義ジャンプを実現します。
    元々がUnixプログラムである関係上、vimやemacsなどのCUIエディタで実行可能でしたが、近年はwindowsでも秀丸エディタなどで対応しています。

    プログラムを解析して情報を提供するlanguage-server


    tagsを使ってインデックスを作成する方式は、安定しているとはいえ古いやりかたなのは否めません。
    そこで、MicrosoftがVisual studioとは対照的に、軽量なモダンエディタとして発表したVisual Studio Code(以下VSCode)ではどのように実現しているのかを紹介します。

    2016年にMicrosoftはlanguage server protocolという仕様を公開しました。
    これはプログラムを解析してコード補完、変数やメソッドの定義参照、コードのエラーチェックなどの機能を統一的に提供するプロトコルになります。

    機能ではなくプロトコル(規約)であるところがポイントで、プロトコルの形式を守ればどのようなエディタであっても同じ定義ジャンプ機能を実装可能となります。
    実際にはVSCodeで使われていますが、vimやEmacsでもlanguage-serverを使用した言語ごとのプラグインが各種公開されており、ctagsなしでの定義ジャンプが可能となuものがあります。

    まとめ

    昔ながらのctagsを使用する例は減りましたが、VSCodeなどモダンエディタが使えない環境においてはまだまだ現役です。
    既存のコードを検索する時間をtagsやlanguage-serverでなくして、新しいコードを書くことに集中できるようにしましょう!

Pocket