Jak uzyskać inteligentne automatyczne uzupełnianie w C ++

32

Niektóre edytory (takie jak Visual Studio w systemie Windows) wykonują autouzupełnianie w C ++, które rozumieją C ++. Na przykład biorąc pod uwagę:

#include <vector>

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

W studiu wizualnym automatyczne uzupełnianie zna jedyną metodę, std::vector<int>która zaczyna się od „i” insert.

Czy możliwe jest uzyskanie tego rodzaju autouzupełniania w vimie?

Chris Jefferson
źródło
3
Wtyczki YouCompleteMe może nauczyć warunki do autouzupełniania i można zrozumieć języków rodziny C.
alxndr
@alxndr Dokumentacja była dla mnie dość myląca, jeśli chodzi o instalację z Vundle. I jak tylko zacząłem, serwer YCM się zawiesił!
Abhinav Gauniyal
YCM działa dla mnie stosunkowo dobrze, chyba że mam szablony ciężkie (boost.geo), w których dodaje on do systemu sporo lootów. Moja konfiguracja jest tymczasem bałagan, trudno częściach YCM wyciąg ...
Johannes
@yo 'To pytanie jest dość specyficzne dla używania vima z C ++. Rozwiązania tego problemu prawdopodobnie nie będą dotyczyły kogoś, kto używa Vima do pisania Perla (i odwrotnie). Więc c ++ wydaje mi się w porządku; ale oczywiście Vi i Vim Meta to odpowiednie miejsce do dyskusji na ten temat.
derobert
2
@AbhinavGauniyal To brzmi podobnie do problemów, które widziałem wcześniej podczas korzystania z YCM. W jakim systemie jesteś? Dla OSX patrz tutaj . Nie używam MacVima, ale zainstalowałem CMake z Homebrew. Potem cdprzeszedłem do katalogu wtyczek YCM ( ~/.vim/bundledla mnie) i uruchomiłem ./install --clang-completer.
bsmith89,

Odpowiedzi:

28

Naprawdę podoba mi się clang_complete . Wymaga clang i musisz powiedzieć mu, gdzie znajduje się libclang w twoim systemie. Potem działa cudownie.

Ludzie mogą sugerować YouCompleteMe, ale szczerze mówiąc, ta wtyczka jest bardzo rozdęta za to, co mówi, i że wymaga dużo zbyt wielu kroków, aby zainstalować. Wielokrotnie miałem go również segfaultować Vima. Nie mogę być szczęśliwszy z clang_complete.

Oto, co otrzymuję, gdy piszę v.:clang-complete

akshay
źródło
4
Zgoda. Miałem wiele problemów z YCM (w tym wspomniane awarie). I nawet po wielu godzinach konfiguracji nigdy nie działałem w pełni.
CharlesL
1
Miałem serwer YCM wielokrotnie zawieszany, nie mogę się doczekać clang_complete, oto istotne informacje dla innych użytkowników: github.com/Rip-Rip/clang_complete/blob/master/doc/…
Abhinav Gauniyal
1
Miałem odwrotność. YCM działał dobrze (nawet jeśli był to PITA do zainstalowania), ale clang-complete nigdy nie działał ...
Sardathrion - Przywróć Monikę
Czy możesz to wszystko ukryć, aby kod był wyświetlany o kilka linii w dół?
Matt C
@MatthewCliatt, ukryj co? Menu podręczne? W kodzie nie ma nic specjalnego. Jest tuż return 0pod tym menu podręcznym.
akshay
8

Wtyczka YouCompleteMe ( Link ) działa dla mnie świetnie. Używa libclang do generowania funkcji autouzupełniania, zapewniającej dokładne zakończenie.

Ma wiele możliwości dostosowywania, szczególnie podczas pracy z flagami kompilacji. Możesz edytować „generator flag”, edytując skrypt Pythona dla każdego projektu ( przykład ). Ale dla mnie główną zaletą jest to, że obsługuje bazę danych kompilacji Clang ( Link! ). Oznacza to, że możesz skompilować kod normalnie i poprosić clang o wyplucie wszystkich flag użytych do kompilacji i użycia tych flag z YouCompleteMe. Jest to bardzo przydatne, jeśli chcesz, aby narzędzie do autouzupełniania wiedziało o twoich definicjach makr lub lokalizacji wszystkich plików nagłówków w systemie bez żadnego wysiłku, aby wpisywać je ręcznie.

Allan Hasegawa
źródło
3

YouCompleteMe nie jest trudny do zainstalowania i był dla mnie dość stabilny, migrowałem z clang_complete do YouCompleteMe lata temu. Zgadzam się z jedną rzeczą, jest ona naprawdę nadęta ogromną historią zatwierdzania, wieloma wewnętrznymi zależnościami i wsparciem dla wielu języków, którymi możesz się nie przejmować, ale nadal będzie klonować powiązane z nim podmoduły. To jest problem z YouComplemeMe, ale… to działa.

Ja pracowałem na widelec ze szczególnym celu, aby lepiej wspierać C ++, można sprawdzić to gif pokazując go:

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

Wykorzystuje informacje o nowych parametrach, które Clang jest w stanie podać, możesz dowiedzieć się więcej na ten temat z mojego artykułu: http://nosubstance.me/articles/2015-01-29-better-completion-for-cpp/ .

pepper_chico
źródło
Dzisiaj zamiast tego używam coc.nvim + ccls.
pepper_chico