So erhalten Sie eine intelligente automatische Vervollständigung in C ++


32

Einige Editoren (wie Visual Studio unter Windows) führen C ++ - Autovervollständigungen durch, die C ++ verstehen. Zum Beispiel gegeben:

#include <vector>

int main(void) {
  std::vector<int> v;
  v.i

Im Visual Studio kennt die automatische Vervollständigung die einzige Methode std::vector<int>, die mit einem i beginnt insert.

Ist es möglich, diese Art der Autovervollständigung in vim zu bekommen?


3
Das YouCompleteMe-Plugin kann Begriffe für die automatische Vervollständigung lernen und Sprachen der C-Familie verstehen.
Alxndr

@alxndr Dokumentation war für mich ziemlich verwirrend - für die Installation mit vundle. Und als ich damit anfing, stürzte der YCM-Server ab!
Abhinav Gauniyal

YCM funktioniert für mich relativ gut, es sei denn, ich habe Template-schweres (boost.geo) Zeug, das dem System laooooots hinzufügt. Mein Setup ist ein Chaos inzwischen schwer zu extrahieren YCM Teile ...
johannes

@yo 'Diese Frage ist ziemlich spezifisch für die Verwendung von vim mit C ++. Lösungen dafür werden wahrscheinlich nicht auf jemanden zutreffen, der Vim zum Schreiben von Perl verwendet (und umgekehrt). Also scheint mir C ++ in Ordnung zu sein; Aber natürlich sind Vi und Vim Meta der richtige Ort, um darüber zu diskutieren.
Derobert

2
@AbhinavGauniyal Das klingt ähnlich wie bei Problemen mit YCM. Auf welchem ​​System bist du? Für OSX siehe hier . Ich verwende kein MacVim, aber ich habe CMake mit Homebrew installiert. Dann ging ich cdin das YCM-Plugin-Verzeichnis ( ~/.vim/bundlefür mich) und lief ./install --clang-completer.
bsmith89

Antworten:


28

Ich mag clang_complete wirklich dafür. Es erfordert clang und Sie müssen ihm mitteilen, wo sich libclang in Ihrem System befindet. Danach funktioniert es wunderbar.

Man könnte YouCompleteMe vorschlagen, aber um ehrlich zu sein, das Plugin ist sehr überladen, was es verspricht, und es erfordert viel zu viele Schritte, um es zu installieren. Ich hatte es auch mehrfach segfault Vim. Ich könnte nicht glücklicher mit clang_complete sein.

Folgendes erhalte ich, wenn ich tippe v.:klirrend


4
Einverstanden. Ich hatte viele Probleme mit YCM (einschließlich der erwähnten Segfaults). Und selbst nach stundenlanger Konfiguration funktionierte es nie vollständig.
CharlesL

1
Ich hatte YCM-Server mehrere Male abgestürzt und freute mich auf clang_complete. Hier sind relevante Informationen für andere Benutzer: github.com/Rip-Rip/clang_complete/blob/master/doc/…
Abhinav Gauniyal

1
Ich hatte das Gegenteil. YCM funktionierte einwandfrei (auch wenn es ein PITA war, das installiert werden musste), aber klirrend funktionierte es nie ...
Sardathrion - Reinstate Monica

Können Sie das alles verstecken, damit Sie Ihren Code ein paar Zeilen weiter sehen können?
Matt C

@MatthewCliatt, was verstecken? Das Popup-Menü? Der Code enthält nichts Besonderes. Es befindet sich direkt return 0unter diesem Popup-Menü.
Akshay

8

Das YouCompleteMe ( Link ) -Plugin hat bei mir großartige Arbeit geleistet. Es verwendet libclang, um die Autocomplete-Funktion zu generieren, die eine genaue Vervollständigung liefert.

Es ist sehr anpassbar, insbesondere wenn Sie mit Kompilierungsflags arbeiten. Sie können den "Flaggenerator" bearbeiten, indem Sie ein Python-Skript pro Projekt bearbeiten ( Beispiel ). Aber für mich ist der Hauptvorteil, dass es die Clang Compilation Database ( Link! ) Unterstützt . Dies bedeutet, dass Sie Ihren Code normal kompilieren und clang bitten können, alle für die Kompilierung verwendeten Flags zu spucken und diese Flags mit YouCompleteMe zu verwenden. Sehr praktisch, wenn Sie möchten, dass Ihr Autovervollständigungstool Ihre Makrodefinitionen oder den Speicherort aller Header-Dateien in Ihrem System kennt, ohne dass Sie diese manuell eingeben müssen.


3

YouCompleteMe ist nicht so schwer zu installieren, und es war ziemlich stabil für mich. Ich bin vor Jahren von clang_complete auf YouCompleteMe migriert. Eine Sache, der ich zustimme, ist in der Tat aufgebläht mit einer riesigen Commit-Historie, vielen internen Abhängigkeiten und der Unterstützung für viele Sprachen, für die Sie sich vielleicht nicht interessieren, die aber dennoch die zugehörigen Submodule klonen werden. Das ist ein Problem mit YouComplemeMe, immer noch ... es macht die Arbeit.

Ich habe an einer Abzweigung mit besonderer Absicht gearbeitet, um C ++ besser zu unterstützen. Sie können dieses GIF überprüfen, das es anzeigt:

https://s3.amazonaws.com/f.cl.ly/items/1e2F0A123h331c1G0L0R/SadBart.gif

Es nutzt die neuen Parameterinformationen, die Clang bereitstellen kann. Weitere Informationen hierzu finden Sie in meinem Artikel: http://nosubstance.me/articles/2015-01-29-better-completion-for-cpp/ .


Heute benutze ich stattdessen coc.nvim + ccls.
pepper_chico
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.