VimおよびEmacsの大規模プロジェクトでのナビゲーション

VimとEmacsに関する出版物から、人間のコードナビゲーションを使用している人はほとんどいないという印象を受けます。 または、代わりにackやagなどのツールを使用します。 一方、これらのエディターには、数十年前から存在するナビゲーション用の効果的なツールがあります。 これらのツールはCtagsとGnuグローバルです。これらはすべての主要なLinuxサーバーディストリビューションに搭載されているため、リモートサーバーで開発を行ってもナビゲーションは機能します。



私は主にEmacsを使用しているため、Emacsについて書いていますが、Vimの適切なプラグインへのリンクを提供します。 主なものは、作業の原則とツールの主な機能を伝え、ack、ag、grepの過剰な使用を思いとどまらせることです。





CtagsとGnuグローバルはほぼ同じように機能します-プロジェクトソースフォルダーにフィードし、そこにタグ、タグ、GTAGSと呼ばれるインデックスファイルが表示されます。 プロジェクトで見つかったすべてのファイルは、クラス、メソッド、関数、変数などのファイルに保存されます。 ソースコードファイル内の位置。 つまり エディターにクラス名を入力し、その宣言の場所にジャンプするには、コンパクトな情報で十分です。 または、同じ名前のクラスが宣言されているファイルのリストを取得します。



Ctags



Ctagsは、すべてのプロジェクトファイルを変更するかどうかを分解することなく、毎回スキャンするユーティリティです。 数千ファイルのプロジェクトの場合、非常に高速に動作します(最大10秒)。 ライブラリ用とプロジェクト用、またはライブラリ、バックエンド、フロントエンド用に個別のインデックスファイルを作成し、必要なインデックスのみを更新できます。



EmacsはCtagsインデックスファイルを1つの形式で使用しますが、VimとSublime Text Editorは別の形式を使用します。 したがって、後でEmacsで使用するためにインデックスを生成する場合は、必ず-e



オプションを追加してください。



このユーティリティは非常に古く、2種類あります... 3種類ではありません。 本質的にはほとんど違いはありませんが、キャラクターの分離の質は大きく異なります。 それらの中で最も原始的なものは、Emacsにバンドルされているctag、いわゆるetagです。 他に何もない場合に使用する必要があります-多くの言語をサポートしていますが、perl、C、Javaのサポートのみが好きでした。 このコマンドはetags



またはctags



と呼ばれます。



2番目のオプションは、過剰なctagです。 ディストリビューションでサポートされており、数年間サポートされるバージョンは非推奨です。 ただし、PHPとJSの解析ははるかに優れています。 コマンドはctags-exuberant



と呼ばれます。



最も完璧なオプションは、ユニバーサルctagです。 このバージョンは、コーヒータグなどの外部パーサーをサポートし、通常、他の言語に最適なパーサーを備えています。 手動で組み立てる必要がある場合でも、この特定のユーティリティを使用することをお勧めします。



したがって、使用するバージョンを決定しました。つまり、プロジェクトフォルダーに移動してターミナルで実行できますctags -e



を使用する場合はctags -e



、別のエディターについて話している場合はctags



だけです。



Emacsでの使用



Mx



visit-tags-tableおよびTAGSファイルを選択します。 次に、メソッドの名前にカーソルを合わせてM-.



を押しM-.



、Enter。 間違った文字にジャンプしたことを理解したら、 Cu M-.



押しCu M-.



-この方法では、このシンボルの次の定義に移動しますが、別のファイルにあります。 タグのリストから便利に選択できるようにhelm



をインストールすることをお勧めしますが、他のすべてのEmacsの場所でhelm



に慣れて初めて便利になります。



Emacsを使用してPHPで作成する場合は、 こちらをご覧ください



Vimでの使用







Gnu Global



Gnu Globalは、作業に数ギガバイトを必要とするIDEがまだ発明されていなかったときに、数ギガバイトのプロジェクトのコードベースで動作するように作成されました。 それはctagsのように機能し、さらに、解析のバックエンドとしてctagsを使用することもできます-ネイティブのGnu Globalは多くの言語をサポートしていないため、非常に便利です。 ただし、重要な違いが1つあります。GnuGlobalは、エディターがインデックスファイルをロードすることを想定していませんが、特殊global



ユーティリティを使用して文字を検索します。



また、インデックスファイルは最適化されているため、最初から書き直すことなく補完できます。 このため、プロジェクトで1つのファイルが変更された場合、プロジェクト全体ではなく、そのファイルのみが解析され、更新速度に劇的に影響します。 これは、数百メガバイトのコードがあり、常にブランチを切り替えたり、最新の変更をプルしたりする場合に便利です。



インデックスファイルを作成するには、プロジェクトフォルダーに移動してgtags



を呼び出しgtags



。 待ってください...しかし、一般に、速度は良好です-JIdea Community Editionのソース、およびこれは約150 MBの純粋なJavaコードであり、1分以内にインデックスが作成されます。 後続のインデックスは、 gtags -i



で開始する必要があります。これにより、変更されたファイルのみがインデックス付けされます。



Emacsでの使用



ggtags



プラグインをインストールすることをおggtags



ます。 ここまたはelpa、melpa、またはmarmaladeで入手できます。 次に、プロジェクトファイルの1つを開き、 Mx ggtags-mode



を押し、次にMx ggtags-visit-project-root



を押して、タグがあるフォルダーを選択します。 M-.



を押した場合、プロジェクトファイル内のすべてM-.



、その後、現在カーソルの下にある文字を決定する遷移が機能します。 シンボル名を手動で入力しますかCu M-.



。 キャラクターに複数の定義がある場合は、 Mn



Mp



を押して定義を切り替えます。 タグファイルを更新するには、プロジェクトファイルの1つからMx ggtags-update-tags



クリックします。



ggtagsとprogectileの両方がプロジェクトでの作業とそのインデックス作成を試みているという事実にもかかわらず、それらは衝突しません。



Vimでの使用







ファイルをジャンプして楽しんでください。



All Articles