VIMで大規模なプロジェクトをナビゲートする方法


86

VIMのみを使用して大きなプロジェクト(数百のファイル)をどのように管理しますか?

私は個人的に、小さなプロジェクトよりも大きなプロジェクトで問題を抱え始めます。

  • できれば名前を入力して、すばやく「ファイルに移動」する方法はありますか?
  • 別のファイルにある場合は、「クラス定義に移動」についても同じです。

私はVIMの基本をすべて知っているので、スクリプトの作成やソースコードのクイック編集に問題なく使用できます。しかし、ファイル間を移動しなければならないとき、それは私にとって本当に厄介になります。


どの言語を使用していますか?
LB40 2009

言語にとらわれないソリューションが欲しいのですが、C ++、PHP、Railsのサポートが必要です。
Jakub Arnold

どの答えを受け入れましたか?@JakubArnold

@xetrasu私が使用することになったNERDTree
Jakub Arnold

回答:


33

VIMはタグを優れた方法でサポートしています。プロジェクトのタグファイルを作成したら、同じ編集セッション内で、ファイル間のジャンプを含め、メソッド、クラスなどの定義または宣言にジャンプできます。

試してみてください

:help tags

C / C ++のタグファイルを生成するには、シェルプロンプトに移動し(システムが* nix / Cygwinであると想定しています)、次のように入力します。

info ctags

または

ctags --help

2
Vimはcscopeもサポートしています。これにより、特定の関数を呼び出す関数を見つけるなどのことができます:help cscope。詳細については、を参照してください。イントロダクションには素晴らしい機能リストがあります(「のような質問に答えるように設計されています」の下)。
Cascabel

1
残念ながら、cscopeはC ++についての理解が非常に限られています。
Luc Hermitte

28

私は簡単な解決策が好きです。現時点で私のお気に入りのナビゲート方法は次のとおりです。

追加 ~/.vimrc.local

set path=$PWD/**

次に、これをエディターに入力して、現在の作業ディレクトリ(pwd)の任意の場所にあるファイルを検索します。

:find user_spec.rb

ファイル名にタブ補完を使用して複数の選択肢を見つけることもできるため、このTextMateの変換は非常に便利です。


1
このソリューションは、:FCおよびプラグインよりもはるかに単純です。キャッシュは必要ありません...あなたは私の一日を主張しました!ありがとう!
Srikumar 2013年

1
Vimはwdをデフォルトのディレクトリとして読み取っていません。シェルを再起動しましたが、まだ機能しません。vim .コマンドを実行する前にも試してみました:/
Adam Grant

13

NERDTree(ディレクトリサイドバー)、FuzzyFinder Textmate(TextMateのCMD + Tのようなファイルへの移動)、およびSessions(:hセッション)の組み合わせを使用して、大規模なプロジェクトを処理します。

いくつかのセッションヘルパープラグインを使用することをお勧めします。私が何を使っているかについて言及しますが、まだ満足していません。Googleの「vimセッション」だけです。

FuzzyFinder Textmateを機能させる際の注意点の1つは、古いバージョンのFuzzyFinderプラグイン、特にv2.16に依存していることです。それより高いとエラーが発生します。しかし、それは間違いなくトラブルの価値があります。名前の補完はありませんが、検索は賢いので、検索するfro/time/actionsphpとファイルが表示されますapps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(括弧は一致するものを示します)。フォルダ名だけで一意のファイルを簡単に選択できます。


2
私が気に入ってセットアップが簡単な新しいプラグインを見つけました(少なくとも私の場合は):CommandT。はるかに高速。
ドーナツ2010

6
より新しく、より強力なツールであり、vimスクリプトで記述されているため、外部依存関係はjanusプロジェクトで
alexandru.topliceanu

7

貴重なctagsとさまざまな関連コマンドも同様です。また、プロジェクトプラグインなしでは生きていけません。これにより、関心のあるファイルを別のペインでプロジェクトに関連付けることができます。セットアップのどれだけがカスタマイズされているか思い出せませんが、Debug.cというソースファイルを開きたい場合は、次のようにします。

<F12>     " Opens the project pane
/De       " Searches for "De", which is likely to be enough to find Debug.c or possibly Debug.h
<ENTER>   " Opens the selected file and closes the project pane

私はよくそうします:

:vsp      " Vertically split the window
<F12>     " Reopen project pane
#         " Search back to find previous entry with the same name (to find
            Debug.h if I was on Debug.c: my headers are in Headers/ and
            my source is in Source/, so the headers come earlier in the list
            than the source).  I use * to go the other way, obviously.
<ENTER>   " Open the header file in the other window and close the project window.

この比較的短いシーケンスで、任意のファイルとそのヘッダーを垂直分割で開くことができます。プロジェクトプラグインウィンドウは単なるテキストファイルであるため、Vimの検索機能を使用して完了します。


4

Vim 7.3以降、:findコマンドにはファイル名のタブ補完があります。

あなたが設定している場合ので'path'(おそらく使用してプロジェクト全体含めるためのオプション**を再帰的にサブディレクトリを検索できるように、ワイルドカード)を、あなたは使用することができ:find:sfind:tabfindプロジェクト内の任意のファイルを取得するために完了すると、コマンドなどを。これによりgf、ファイル名がテキスト内にある場合、たとえばincludeディレクティブ内にある場合、友人と直接ファイルにジャンプすることもできます。

この方法では、特定のファイルに移動するために外部ツールやプラグインは必要ありません。ただし、確かにそれほど高速でも使いやすいものでもない可能性があり、定義にジャンプする必要性に対応していません。定義については、他の回答が示唆するようにctagsを使用します。


3

他の投稿者が推奨しているようにctagsを使用している場合は、taglistプラグインを確認してください。

時間をかけてドキュメントを読み、キーバインディングを学習してください。(TListウィンドウから)開始するためのいくつかを次に示します。

  • o-新しいウィンドウでファイルを開く
  • t-新しいタブでファイルを開く
  • [[またはバックスペース-リスト内の前のファイル
  • ]]またはタブ-リスト内の次のファイル

3

あふれんばかりのctags。

Ctrl-]を使用して、カーソルの下のタグにジャンプします。


2

FindFileを使用しています。プロジェクトのルートでvimを開いて実行すると:FC .、プラグインはcwdの下にあるすべてのファイル名をキャッシュします。次に:FF、完了メニューを開いて、必要なファイルの名前(つまり、最初の数文字)を入力します。


うわー、これは最も使いやすいプラグインのようなものです。ゼロセットアップが含まれます..FC .ルートディレクトリに:FF入力し、必要なファイル名の入力を開始すれば完了です。私は...まだかかわらず、新しいタブで起動する方法を把握しようとしています
テスター

また、これを使用する場合は、vimを起動するたびに:FC .、そのディレクトリにファイルをキャッシュするためにやり直す必要があることにも注意してください。
テスター

これは、FindFile.vimの更新バージョン:FTまたは:FindTabNew gist.github.com/1104884
テスター

2

vimソースファイルのルートから開きpath、すべてのサブディレクトリを含めるようにオプションを拡張します。
たとえばset path+=/usr/include/c++/**、C ++ヘッダーやset path+=**ソースディレクトリの場合です。

これにより、次のような可能性が広がります。

1)名前またはその一部でファイルを開く

:find file_name

オートコンプリートとワイルドカード拡張を:find確実に使用できます。名前を入力すると、名前が検索されます。これは言語に関係なく機能します。きっと気に入るはずです。

2)cusrorの下のファイルへのナビゲート:の
ようなファイルパスに移動したい場合#include "project/path/classA.h

gf or gF  - go to file under cursor.   

Ctrl- 6-後、最後のカーソル位置に戻ってきますgfgF

3)APIルックアップとAPIロケーションへのナビゲート

[iまたは[I、ワークスペースを離れることなく、カーソル下の単語の関数シグネチャを検索するために使用できます。[<Tab>実際に宣言に行きます。Ctrl-6を使用して、最後の場所に戻ります。


拡張せずにpath:Exコマンドでファイルのナビゲートを開始し、ファイルをナビゲートして開くことができます。私NerdTreeはこれよりも好きです。


1

誰かがより良い解決策を指摘して何かを学ぶことができるようになることを願っていますが、ツリーを展開している限り、NERDTreeは名前を補完して特定のファイルにアクセスするのに役立ちました。ファイルにアクセスする必要があるときのコマンドは次のようなものです。

、d / foo.pyo(foo.pyはファイル名)

、dでツリーを開き、/で検索モードに入り、ファイルの名前(または部分的な名前、正規表現など)を開き、oで開きます。

もちろん、ファイル名を十分に入力しなかった場合や重複がある場合は、「n」を数回押す必要があります。

このようにNERDTreeを使用すると、ちょっとしたハックのように感じることは認めますが、今では筋肉の記憶に深く入り込んでいるので、考えもしていません。

もちろん私もctagsを使用していますが、これらはカーソルの近くに関数があり、別のファイルなどでその定義に到達する必要がある場合にのみ役立ちます。多くの場合、「OK、今すぐ機能xで作業する必要があります」と言い、ctagsが本当に役立つ参照が近くにない別のファイルに移動する必要があります。


3
もう少し調べてみると、fuzzyfinderはプロジェクト検索の素晴らしいアイデアのように見えます。
重力

1

私は私の2つのプラグインを使用しています:

  • コマンドラインでファイル名を完成させるsearchInRuntime。それはどういうわけかfuzzyfinderとlookupfileに似ています、
  • 完全に実験的で文書化されていないlhタグ。これは、ファイルの保存<c-w><m-down>時にタグファイルを自動的かつ迅速に更新する機能と、デフォルトでプラグインされているタグセレクターの2つの機能を提供します。代わりに、有名なタグリストプラグインを確認することをお勧めします。

どちらも私のvimlライブラリlh-vim-libが必要です。


0

SourceCodeObedineceを試してください。これは、C ++ 1Gbソースファイルプロジェクトを処理するために開発したものです。0scan
と組み合わせて使用​​しています。

これらの2つのプラグインは、最も人気のあるVimブラウジングツールであるctagscscopeのラッパーです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.