Vimでのオートコンプリート


257

一言で言えば、私が探してる作業のVimエディタの自動補完機能。VimはLinuxでIDEを完全に置き換えると以前に主張しましたが、確かにそうですが、オートコンプリートという重要な機能が1つ欠けています。

私が知っているCtrl+ Nあふれんばかりのctagsの統合タグリストcppcompleteOmniCppComplete。悲しいかな、これらはどれも「動作するオートコンプリート」の私の説明に適合しません。

  • Ctrl+はN、スペルの方法を忘れた場合にのみ(classまたは)うまく機能しますwhile。しかたがない。
  • Ctagsは基本的な機能を提供しますが、多くの欠点があります。
  • Taglistは単なるCtagsラッパーであり、そのため、その欠点のほとんどを継承しています(ただし、宣言をリストする場合はうまく機能します)。
  • cppcompleteが約束どおりに機能しないだけでなく、私が何を間違えたか、またはそれが正しく「機能」していて、制限が仕様によるものであるかどうかがわかりません。
  • OmniCppCompleteにcppcompleteと同じ問題があるようです。つまり、オートコンプリートが適切に機能しません。さらに、tagsファイルをもう一度手動で更新する必要があります。

私は、現代の本格的なIDEでさえ、優れたC ++コード補完を提供していないという事実を知っています。だからこそ、今までこの分野でのVimの欠如を受け入れてきました。しかし、コード補完の基本的なレベルは要求するほど多くはなく、実際に生産的な使用に必要とされると思います。だから、少なくとも次のことを達成できる何かを探しています。

  • 構文認識。cppcompleteの約束(ただし、私には提供されません)、次の正しいスコープを認識した自動補完:

    variableName.abc
    variableName->abc
    typeName::abc

    そして、実際には、それ以外のものはまったく役に立ちません。

  • 構成可能性。(簡単に)ソースファイルの場所を指定する必要があるため、スクリプトがオートコンプリート情報を取得する場所を指定します。実際、必要なインクルードパスを指定するMakefileがディレクトリにあります。Eclipseはそこにある情報を解釈できます。なぜVimスクリプトも解釈しないのですか?

  • 最新性。ファイル内の何かを変更したらすぐに、オートコンプリートにこれを反映させたいと思います。手動でトリガーしたくありませctags(または同等のもの)。また、変更があるべきインクリメンタル私は1つのファイルだけを変更したとき、すなわち、それは完全だが、受け入れられないためにctags(巨大な可能性がある)の再解析ディレクトリツリー全体へ。

何か忘れましたか?自由に更新してください。

たくさんの設定やいじりに慣れていますが、ソリューションを最初からプログラミングしたくありません。Vimスクリプトのデバッグは得意ではありません。

最後に、JavaとC#についても同様のものが欲しいのですが、期待するのは多すぎると思いctagsます。コードファイルを解析するだけで、JavaとC#の両方に、インデックスを付ける必要のある巨大なプリコンパイル済みフレームワークがあります。残念ながら、IDEなしで.NETを開発することは、C ++よりもPITAのほうがはるかに優れています。


4
この質問をしてから久しぶりですが、ようやく良い質問を見つけましたか?受け入れられた答えが見当たらないので、私は尋ねています。個人的には私が変数/関数のプレフィックスを付けることに頼ったことを認めなければなりませんが。たとえば、それらはすべてsh(私のライブラリにあることを意味します)で始まり、その後に私のクラスの省略形が続きます。たとえばshPためのParserクラス。次に、書き込みshPとCTRL + p(または必要に応じてCTRL + n)を押してクラスメンバーを最後の使用から最初(またはCTRL + nの場合は最初から最後)に取得します
Shahbaz

4
@Shahbaz実際、現時点では十分な解決策はないと確信しています。clang_complete技術的には最も健全ですが、結果のキャッシュと部分的なコンパイルの欠如のために法外に遅いです。複雑で時間のかかるセットアップが必要なものもあるので、すべての回答を試したわけではないことを認めざるを得ません。clangによって開発者がC ++ソースからASTをビルドできるようになったので、使用可能なプラグインを探し続けます(これまでは、C ++用の優れた無料のパーサーはありませんでした)。
Konrad Rudolph

2
clang_complete最近試しましたか?libclangキャッシュで使用できるようになり、より高速になるはずです。
Jan Larres、2011年

@Jan情報をありがとう。最後に試したとき、libclangのサポートはまだ大雑把でした。時間になったら、もう一度やり直したほうがいいでしょう。
Konrad Rudolph

(編集ロールバックの理由:製品名はコードではなく、属していませんformatted like this。)
Konrad Rudolph

回答:


171

YouCompleteMeをお試しください。libclangインターフェースを通じてClangを使用し、セマンティックC / C ++ / Objective-C補完を提供します。これはclang_completeによく似ていますが、かなり高速で、ファジーマッチングを備えています。

上記に加えて、YCMはC#、Python、Go、TypeScriptなどのセマンティックコンプリーションも提供します。セマンティックサポートがない言語に対して、非セマンティックの識別子ベースのコンプリーションを提供します。


69
実際、私はこの解決策を受け入れます。最後に配信するプラグイン。もう数日使っています。この質問に答えるのにたった4年しかかかりませんでした。;-)
Konrad Rudolph

5
YouCompletMe valloricで素晴らしい仕事を!おめでとうございます
statquant 2013

5
YouCompleteMeはWindowsにインストールするための完全なPITAです:(
xx

2
@DrTwox readmeから:「YCMはWindowsの公式サポートを提供していませんが、そこで動作するわけではありません。WindowsインストールガイドのWikiページを参照してください。自由に追加してください。」
user456584 2014

7
これは境界を越えた自己宣伝であるため、この投稿ではあなたが作者であることを言及する必要があります(質問に回答することは主張しませんが、免責事項を含める必要があります)。
EntangledLoops 2016

36

コンパイラーを使用してC ++プロジェクトにコード補完を提供するclang_completeもあります。このプラグインのトラブルシューティングのヒントに関する別の質問があります。clang

プラグインは、プロジェクトがコンパイルされる限りかなりうまく機能するように見えますが、大規模なプロジェクトでは非常に遅くなります(完全なコンパイルを試みてタグリストを生成しようとするため)。


clang_completeプラグインは、CygwinとWindows上でうまく動作します。大規模なプロジェクトがないので、何も言えません。:)
ルミ

libclangを使用したclang_completeにキャッシュ機能があるようです。これは受け入れられた答えになるはずです。Linuxカーネルでclang_completeを試しましたか?カーネルについて私が見た最良の索引付けはEclipse CDTを使用することです。clang_completeがカーネルを処理できる場合、何でも完了することができるはずです。
ダッシュ08

clang_completeは、私が使用する最高のVimプラグインです。
Cromulent 2013年

1
@Cromulentああ、YouCompleteMeをチェックしてください。
Konrad Rudolph

@KonradRudolphありがとう。確かめます。
Cromulent 2013年

7

リクエストに応じて、これは私が以前に与えたコメントです:

これを見てください:

このリンクは、MacOSXでmonodevelopを使用する場合に役立ちます。

幸運と幸せなコーディング。


OmniCompletionリンクが壊れている
dotoree

1
上記のように、github.com / nosami / OmniSharpServerとC#のYouCompleteMeを併用することを勧めします
rafee

6

Eclimプロジェクトが別の質問でリンクされているのを見つけました。これは、少なくともJavaの統合にとっては非常に有望です。


あなたはそれをテストしましたか?興味深いようです。
Pacane、2010年

@Pacane:いいえ。私は何ヶ月もJavaを使う必要がなく、実験する暇もありませんでした。
Konrad Rudolph

1
Eclimは、Eclipseはまださえヘッドレスの設定で負荷への獣ままであるが、Javaのための優れたソリューションであると思われる
Drupad Panchal

2
Javaの場合は、Vrapperを使用できます。私はそれが素晴らしいオートコンプリートで通常大丈夫だと思います。頻繁にテキストを多用する編集のために、実際のVimを外部ツールとして起動できます。
kizzx2


2

あなたが探しているのはインテリセンスのようなものですか?

insevimはこの問題に対処しているようです。

ここにスクリーンショットへのリンク


2
はい、これが私が探しているものです。残念ながら、これはWindowsでのみ動作します(私はOS Xを使用しています)。また、最後の更新は2003年頃に行われたようです。:-(
Konrad Rudolph

よくあなたはソースコードを得ることができます:)それができない場合、私が考えることができる唯一のことはomnicompletionです..またはこれを見てください:ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop少なくとも.netについては..
Ric Tokyo

リック、コメントを2つの別々の回答として提供してください。それらは非常に貴重です。私はそれらを適切に尊重したいと思います!そうは言っても、現時点ではMonoDevelopはOS Xでは使用できず、現在OmniCppCompleteを調査しています。
Konrad Rudolph、

笑これは窓だけです!:(なぜuはuはVSを持っているWindows上でこれを望まなければならない。私は、Linux上で解決策を探しています。
ニルス

Nils:誰もがVisual Studioにアクセスできるわけではなく、多くの人々がWindows環境に適用したいviスキルを持っています。Linuxへの移植がありましたが、現在はダウンしています。とにかく、何を達成しようとしていますか?デフォルトのオートコンプリート機能だけで十分ですか? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/...
リック東京

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