Next: , Previous: , Up: 大きなプログラムの保守   [Contents][Index]


29.4 識別子のリファレンスを探す

識別子(identifier)とは、プログラムの構文的なサブユニットの名前であり、関数(function)、サブルーチン(subroutine)、メソッド(method)、クラス(class)、データ型(data type)、マクロ(macro)などが該当します。プログラミング言語では、識別子はその言語の構文をもつシンボルです。識別子はタグ(tags)という名前でも知られています。

プログラムの開発と保守では、プロジェクト全体を横断して識別子をリネームする等から、識別子がどこで定義されているか(defined)、どこから参照されているか(referenced)を素早く見つける能力が求められます。これらの能力は、プログラミング言語をサポートするよう定義されたモード以外のメジャーモードでも、リファレンスを見つけるために有用です。たとえばテキストやTeXドキュメントのチャプター(chapters)、セクション(sections)、アペンディクス(appendices)も同様にサブユニットとなり得るし、それらの名前も識別子として使用できます。このチャプターでは、プログラムのソース、同様に他の種類のテキストの中の、任意の種類のサブユニットの名前を正確に参照するために、“識別子(identifiers)”という用語を使用します。

これらの能力のために、Emacsは‘xref’と呼ばれる統一されたインターフェースを提供します。

xrefが処理を行なうには、そのメジャーモード特有の情報とメソッドを使用する必要があります。どのファイルから識別子を検索するか、識別子にたいするリファレンス(references: 参照)を探す方法、識別子を補完する方法、これら(およびそれ以上のこと)は、モード固有の知識です。xrefは処理のモード固有な部分を、そのモードにより提供されるバックエンド(backend)に委託します。これには、いくつかのコマンドにたいするデフォルトや、そのモード自体が提供しないモードにたいするデフォルトも含まれます。

バックエンドはこれらの能力をさまざまな方法で実装できます。いくつかの例を示します:

  1. その言語のシンボルを探すために、ビルトインの方法を提供するモードがいくつかあります。たとえばEmacs Lispのシンボルは、パッケージのロード履歴からの検索から識別され、Emacs Lispインタープリターにより保守され、ビルトインのドキュメント文字列(built-in documentation strings)で調べます。シンボル定義を探すために、Emacs Lispモードは、モードのバックエンドの中の、これらの機能を使用します(この種のバックエンドの不利な点の1つは、インタープリターにロードされたサブユニットしか認識しないことです)。
  2. カレントバッファーのプロジェクト(プロジェクトで作業するを参照)とメジャーモードにたいしてEglotが有効なら、Eglotはプロジェクト内の識別子の定義について外部の言語サーバープログラムに照会を行い、そのサーバーから得たデータを提供します。Eglot Features in Eglot: The Emacs LSP Clientを参照してください。
  3. 外部プログラムは関連するファイルをスキャンしてリファレンスを抽出して、これらにたいするデータベースをビルドすることができます。リファレンスをリストしたり調べるために、バックエンドは必要なときにこのデータベースにアクセスできます。Emacsのディストリビューションにはetagsが含まれています。これはプログラム中の識別子の定義にタグ付けするコマンドで、リファレンスをタグテーブル(tags tables)に抽出することにより、多くのプログラミング言語、およびHTMLのようなその他のモードをサポートします。タグテーブルの作成を参照してください。etagsによりサポートされた言語にたいするメジャーモードは、そのバックエンドの基準でタグテーブルを使用できます(この種のバックエンドの不利な点の1つは、タグテーブルは有効性を維持するために最新である必要があり、度々リビルドしなければならないことです)。