「VimをIDEとして使用する」というトピックに関する記事がたくさんあるという事実にもかかわらず、結果は私を満足させませんでした。 プロジェクト内のすべてのファイルに対するユーザー(つまり、私)の自動タグ生成が本当に不足しており、プロジェクトファイルは同じディレクトリとそのサブディレクトリにある必要はなく、ファイルのリストを作成するのは簡単で楽しいはずです。
さらに、プロジェクトを1台のコンピューターから別のコンピューターに簡単に転送できる必要があり、特定のプロジェクトディレクトリに関連付けられるべきではありません。
必要な機能を備えたプラグインの長時間の検索は失敗したため、そのようなプラグインを作成することにしました。 私はそれを
インデクサーと呼びました。
UPD:現在、記事は少し時代遅れです。 時間があるときに更新します。 ただし、主なものは機能し、下位互換性が提供されますが、機能をより完全に使用するには、
help indexer-syn-change-4.10を読むことをお勧めします。
プラグインアーカイブには、次のファイルとフォルダーが含まれています。
plugin/indexer.vim
doc/indexer.txt
動作するには、
ctagsが必要ですが、パッチを適用した方が良いです。 最新バージョン5.8(これらの行の執筆時点)では、非常に不快なバグがあります。 バグの詳細を読んで、
ここからパッチをダウンロードして
ください 。
まず第一に、プラグインを使用するための2つのオプションがあります:素晴らしい
プロジェクトプラグインへの追加として、またはそれとは別に。
プロジェクトプラグインに関するいくつかの言葉:このプラグインを使用すると、プロジェクトとプロジェクト内のファイルのリストを簡単に管理できます。 視覚的には、これはプロジェクト、サブプロジェクト、およびファイルのツリー構造を持つウィンドウです。 プロジェクトを最小化できます。 すべてのプロジェクトファイルに対してgrepまたはvimgrepを実行し、結果をクイックフィックスで表示できます。 プロジェクトでウィンドウを表示/非表示にするには、いくつかのキー(たとえば、F9)をマップすると便利です。
このプラグインの詳細な説明はこの記事の範囲を超えています。さらに、Googleのクエリ「vim project」はすぐに多くのリンクを提供します。
ここでオフハンド。 そしてもちろん、プラグインをインストールした後のプロジェクトを支援します。
オプション1.プロジェクトプラグインへの追加として使用
そのため、最も単純なオプションを検討してください。すでにプロジェクトプラグインを使用しており、デフォルトのプロジェクトファイル〜/ .vimprojectsを使用しています。 その場合、インデクサープラグインのセットアップは非常に簡単です。アーカイブの内容を$ HOME / .vim(または同様のディレクトリ)に解凍し、Vimを閉じ(開いている場合)、〜/ .vimprojectsの任意のプロジェクトのディレクトリから起動します。 。 プロジェクトの一部であるファイルを簡単に開くことができます。
インデクサーは、そのようなプロジェクトの一部であるファイルが開かれたことを判断し、このプロジェクトの一部であるすべてのファイルのインデックスを作成し、対応する値をVim&タグおよび&パス変数に設定します。
プロジェクトの一部であるファイルを保存すると、タグは自動的に更新されます。
これで、カーソルを関数、変数などの名前に移動し、
g]または
Ctrl-]を押すと(わずかな違いがあります)、この関数の宣言に移動できます。
Ctrl-tで元に戻ります。 C / C ++で開発している場合は、omnicppcompleteおよびcode_completeプラグインを接続し、「structure_name」または「structure_name->」と入力すると、この構造の要素を選択するポップアップメニューが表示され、「function_name(」 Tabキーを押すと、この関数が受け入れるすべてのパラメーターが自動置換されますが、少し気が散りました。
すべて次のようになります。

プロジェクトプラグインを使用しているが、別のプロジェクトファイルがある場合は、_vimrcで指定できます。
let g:indexer_projectsSettingsFilename = /path/to/my/.vimprojects
少し後でオプションの完全なリストを提供します。
ご覧のとおり、これらのプラグインの束を操作すると非常に便利です。プロジェクトではプロジェクトを管理でき、インデクサーがタグの更新を処理します。
何らかの理由でプロジェクトを使用したくない場合は、
オプション2.プロジェクトプラグインなしで使用
どのファイルがどのプロジェクトの一部であるかを単一のファイルで記述する必要があります。 デフォルトは〜/ .indexer_filesです。 このファイルの構文は非常に単純です。 おそらく、説明する最良の方法は例を示すことです:
[CoolProject]
/home/user/myproject/src/*.c
/home/user/myproject/src/*.h
/home/user/myproject/inc/*.h
[AnotherProject]
$HOME/myproject2**/*.c
$HOME/myproject2**/*.h
ご想像のとおり、ここにCoolProjectとAnotherProjectの2つのプロジェクトがあります。
CoolProjectプロジェクトには、/ home / user / myproject / srcディレクトリのすべての* .cファイルと、/ home / user / myproject / incおよび/ home / user / myproject / srcのすべてのヘッダーファイルが含まれます。
AnotherProjectには、〜/ myproject2ディレクトリおよびすべてのサブディレクトリからの* .cおよび* .hファイルが再帰的に含まれます(「**」は再帰を示します)。
ご覧のとおり、ファイルパスでは、$ HOME、$ VIMなど、ユーザーが宣言したものを含むVim変数を使用できます。
UPD :バージョン1.5では、
torkveユーザーのリクエストにより、このファイルに多くのプロジェクトを含むディレクトリを設定する機能が追加されました。 多数のプロジェクトを含む〜/ワークスペースディレクトリがあり、プロジェクトのリストが頻繁に変更されるとします。 毎回、.indexer_filesファイルの編集は遅延します。 次に、次のようなものを指定できます。
[PROJECTS_PARENT filter="*.c *.h *.cpp"]
~/workspace
キーワードはPROJECTS_PARENTです。 インデクサーは〜/ワークスペース内の各フォルダーを、リストされたタイプのファイルを含む個別のプロジェクトと見なします。
他のすべての点で、インデクサーはプロジェクトとまったく同じように機能します:Vimをプロジェクトディレクトリから実行すると、このプロジェクトのすべてのファイルのタグが生成され、このプロジェクトのファイルが保存されると、タグが更新されます。
これで、プロジェクトを作成し、そこにファイルを追加して、それらのインデックスの作成方法を忘れることができるようになりました。 やった!
しかし、これは私にとって十分ではありませんでした。
実際のところ、プロジェクトファイルが異なる場所にある場合は気に入らないということです(複数のプロジェクトで共有されるライブラリを除きます。実際、ライブラリは別々のプロジェクトです)。 私たちが検討したケースでは、プロジェクトは1つのフォルダーにあり、プロジェクトの説明を含むファイル(.vimprojectsまたは.indexer_files)は別のフォルダー(ホーム)にあります。
つまり、プロジェクトごとに独自の.vimprojectsファイルが必要です。このファイルは、プロジェクト自体のフォルダーにあり、実際には、このプロジェクトのみの説明があります。 プロジェクトによっては、このプロジェクトに固有の設定をロードする必要があります。
この問題を次のように解決しました。プロジェクトのルートフォルダーに、フォルダー ".vimprj"(名前は変更可能)を作成し、プロジェクト固有の設定でファイルを配置します。 その中に.vimprojectsがあります。 Vimが起動すると、インデクサーはまず現在のディレクトリでこの「.vimprj」フォルダーを探し、ない場合は次のレベルに進みます。 再帰の深さは変更できます。デフォルトでは10です。
「.vimprj」フォルダーが見つかった場合、インデクサーはグローバル変数$ INDEXER_PROJECT_ROOTを宣言します。これは、ご想像のとおり、プロジェクトのルートフォルダーへのパスを示します。 「.vimprj」フォルダではなく、「。vimprj」が存在するフォルダ。 このディレクトリのすべての* .vimファイルも起動され、特定の設定を設定できます。 そのようなsett.vimファイルの例を次に示します。
" .vimprj
let s:sPath = expand('<sfile>:p:h')
" indexer , .vimprj
let g:indexer_projectsSettingsFilename = s:sPath.'/.vimprojects'
" project , .vimprj
" : project.
" project.vim,
"
let g:proj_project_filename=s:sPath.'/.vimprojects'
" , ,
let &makeprg = 'pic30-gcc -mcpu=24HJ128GP504 -xc -c "%:p" -o"%:t:ro" -I"'.$INDEXER_PROJECT_ROOT.'\src\utils" -I"'.$INDEXER_PROJECT_ROOT.'\src\app" -g -Wall -mlarge-code -mlarge-data -O1'
また、プロジェクトファイル.vimprojectsでは、プロジェクトへの絶対パスを使用しませんが、変数$ INDEXER_PROJECT_ROOTを置き換えます。 これで、プロジェクトフォルダーを任意の場所に移動できます。いずれにしても、すべてのパスが正しくなり、タグが生成されます。 これは私が達成したかったものです。
いくつかの詳細。
プロジェクトプラグインが〜/ .vimprojects以外のプロジェクトファイルを指定する方法について。
プラグインの作成者であるAric Blumerが提供する唯一の可能性は、Vimが起動するたびにコマンド ":Project /path/to/my/.vimprojects"を与えることです。 もちろん、キーにマッピングすることもできますが、それでも「松葉杖」であり、不便です。このキーを押すのを忘れてしまう可能性があります。 オプションのキー+ "Project /path/to/my/.vimprojects"を使用してvimを実行できますが、私もそれが好きではありません。 私はプラグインの作成者と連絡を取りましたが、彼は私がそれを必要とする唯一の人であり、彼は何も変えないと言った。 したがって、プロジェクトファイルで変数を指定できるように、project.vimを変更する方法のみを説明します。 1行ではなく、5行を挿入する必要があります。
上記はプロジェクト1.4.1(この記事を書いている時点での最新バージョン)に当てはまります。
行1272に移動します。コマンドは1つだけにする必要があります。
Project
この行を次のコードブロックに置き換える必要があります。
if !exists("g:proj_running") && exists('g:proj_project_filename')
exec('Project '.g:proj_project_filename)
else
Project
endif
これで、変数g:proj_project_filenameを指定すると、〜/ .vimprojectsの代わりにその値が使用されます
UPD :Indexerバージョン3.0では、2つの「機能」が非常に重要に見えました。
1.タグはバックグラウンドで生成されます。 つまり、プロジェクトのサイズに関係なく、プロジェクト全体のインデックスが作成されるまで待つ必要はありません。 ただし、サーバー名が空でない場合にのみ機能します(:help servername)。 (vimではなく)gvimを実行すると、それ自体がデフォルトのサーバー名「GVIM」を設定します。つまり、gvimでは、バックグラウンドタグの生成はそのまま使用できます。 コンソールvimを使用して、タグをバックグラウンドで生成する場合は、次のようなもので実行する必要があります。
$ vim --servername MY_SERVER
2. 1つのvimセッションで異なるプロジェクトのファイルを開くことができ、必要なすべてのプロジェクトに対してタグが正しく生成されます。 異なるプロジェクトのタグは混在しません。 これは、複数のプロジェクトを同時に処理する必要がある場合に非常に便利です。 (たとえば、相互作用する複数のエンティティのプロジェクト)
インデクサープラグインオプション
g:indexer_lookForProjectDir (デフォルト:1)
1の場合、プラグインは「.vimprj」フォルダーを検索します。
g:indexer_dirNameForSearch (デフォルト: ".vimprj")
プロジェクト設定ディレクトリの名前
g:indexer_recurseUpCount (デフォルト:10)
このフォルダーを見つけるための再帰の深さ
g:indexer_projectsSettingsFilename (デフォルト: "〜/ .vimprojects")
プロジェクトのパスとファイル名(プロジェクトプラグインファイル)
g:indexer_indexerListFilename (デフォルト: "〜/ .indexer_files")
プロジェクトのパスとファイル名(ネイティブインデクサープラグイン形式)。
両方のファイルが存在する場合(「.indexer_files」と「.vimprojects」の両方)、. indexer_filesのみが使用されます。 別のファイルは無視されます。 現在使用されているファイルを確認するには、IndexerInfoコマンドを使用できます。 インデクサープラグインのコマンドについては、以下で詳しく説明します。
g:indexer_projectName (デフォルト: "")
プロジェクトファイルから読み取るプロジェクトの名前。 プロジェクトの名前が示されていない場合、任意のプロジェクトが使用されます。
g:indexer_enableWhenProjectDirFound (デフォルト:1)
1の場合、プロジェクトファイルがあるディレクトリからVimを起動した場合、インデクサーはプロジェクトファイルにインデックスを付けます。
0の場合、プロジェクトに含まれるファイルが開かれた場合にのみ、ファイルのインデックスが作成されます。
g:indexer_tagsDirname (デフォルト: "")
タグを保存するためのディレクトリ。
このオプションが空の場合(デフォルト)、タグのあるフォルダーの名前は次のように選択されます。
ファイル〜/ .indexer_filesを使用するとします。 次に、タグは〜/ .indexer_files_tags / project_nameフォルダーに保存されます。ここで、project_nameはプロジェクトの名前です。
〜/ .vimprojectsファイルを使用している場合。 次に、タグは〜/ .vimprojects_tags / project_nameフォルダーに保存されます。ここで、project_nameはプロジェクトの名前です。
このオプションが空でない場合、すべてのタグファイルは指定されたフォルダーに保存されます。
このオプションは空白のままにすることをお勧めします。
g:indexer_ctagsCommandLineOptions (デフォルト: "--c ++-kind = + p + l --fields = + iaS --extra = + q")
ctagsを起動するオプション。
g:indexer_ctagsJustAppendTagsAtFileSave (デフォルト:Linuxの場合:1、Windowsの場合:0)
1の場合、プロジェクトからファイルを保存すると、このファイルに対してのみ「-a」キー(追加)を使用してctagsが起動されます。
(ここで、
g:indexer_useSedWhenAppendオプションにも注意を払う必要があり
ます :インストールされると、タグを更新する前に、Sedユーティリティを使用してこのファイルから古いタグが削除されます)
0の場合、プロジェクトからファイルを保存すると、タグは完全に更新されます。
いくつかの困難があります。 曲がって仕事を見つけることができたSed for Windowsのすべてのバージョン。 ここではそれらのグリッチについては説明しませんが、それらを正しく動作させることができなかったと言うだけです。 また、Linuxではうまく機能します。 したがって、妥協する必要がありました。Linuxでは、デフォルトでは、保存されたファイルに対してのみタグが更新され、Sedはタグファイルから「ガベージ」を削除するために使用されます。 Windowsでは、保存するたびにすべてのタグが更新されます。 実際、インデクサー3.0でのバックグラウンドタグ生成の出現により、これは問題ではなくなりました。
インデクサープラグインコマンド
:IndexerInfoプラグインの現在の状態に関する情報を表示します。どのプロジェクトファイルが使用されているか、インデックスが作成されているファイルの数、見つからなかったファイルの数など。
何らかの理由でプラグインが期待どおりに機能しない場合、最初に行うことはこのコマンドを与えることです。
:IndexerRebuildプロジェクトに含まれるすべてのファイルのタグを更新します。
そして最後に、リンク
インデクサープラグインページ:
http ://www.vim.org/scripts/script.php?script_id=3221
プロジェクトプラグインページ:
http :
//www.vim.org/scripts/script.php?script_id=69パッチが適用されたctags:
http :
//dfrank.ru/ctags581ご清聴ありがとうございました。