3

Ctrl-Pをそのまま実行すると、希望どおりに100%動作します。ただし、使用するコードベースのサイズによっては、ディレクトリのインデックス作成に非常に長い時間がかかります。

Ctrl-Pで処理しているプロジェクトのサイズに対応するために、.vimrcファイルで次の(かなり人気のある)user_command設定を使用して、ネイティブのヘルパーユーティリティを提供し、Ctrl-Pに次のリストをより迅速に提供します。利用可能なファイル:

if has("unix")
    let g:ctrlp_user_command = {
    \ 'types': {
        \ 1: ['.git/', 'cd %s && git ls-files']
    \ },
    \ 'fallback': 'find %s -type f | head -' . g:ctrlp_max_files
    \ }
endif

このアプローチにより、インデックス作成が非常に高速になりますが、このように構成すると、Ctrl-Pはヘルパープログラムなしで実行した場合のようにgitサブモジュールの内容を学習しません(「gitls-files」はサブモジュールに再帰しないため、 Ctrl-Pの素朴なディレクトリトラバーサルはそうです)。

'find'を使用してgitリポジトリのインデックスを作成しようとしましたが、そうすると、.gitディレクトリ、オブジェクトファイル、およびCtrl-Pが通常自動的に無視することがわかっているその他のあらゆる種類のインデックスを作成することになります。user_commandを提供することは、無視するファイルに関する組み込みロジックに完全に取って代わるようです。おそらく、逆grepを一緒にハックして特定の要素を削除することもできますが、誰かがこれに対するより洗練された解決策を見つけたに違いないようです。

遅い組み込み検索に頼る以外に、Ctrl-Pでgitリポジトリ内のすべてのファイル(すべてのサブモジュール内のファイルを含む)にインデックスを付けるための別の、おそらく賢い方法はありますか?

4

3 に答える 3

2

次のように、find withオプションを使用して、不要なファイルを除外できます。

find . -type f \( -name "*.cpp" -or -name "*.h" \)

または.gitディレクトリを削除します:

find . -path '.git' -prune -o -print

しかし、これは賢明な解決策ではありません。

于 2013-02-06T13:23:16.900 に答える
1

.git、.svn、.hgなどのVCSディレクトリをスキップするackを使用できます。

私は仕事でackをよく使用します。これは、グローバルな検索と置換に最適です。私はかつてfindを使用し、perlワンライナー正規表現を使用してそれをxargsにパイプしました。残念ながら、これは私の.gitディレクトリのコードを完全に破壊しました。その時点で変更をコミットできず、チェックアウト、リセット、または元に戻すことができませんでした。その後、コードベースを新たにチェックアウトする必要がありました。Ackは、ディレクトリを除外しようとするときに見つけるよりもはるかに使いやすく、-ignore-dirフラグ(またはデフォルト以外のディレクトリを検索する場合は--noignore-dir)を使用するだけです。

于 2013-02-23T08:34:40.390 に答える
0

git-submodule-foreachを使用してサブモジュールを下降し、ls-filesそこで実行します(これらのファイル名にサブモジュールパスを追加します)。

let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files -co --exclude-standard && git submodule foreach "git ls-files -co --exclude-standard | while read i; do echo \"\$path/\$i\"; done"']
于 2017-09-08T18:47:05.053 に答える