Krótko mówiąc, szukam działającej funkcji autouzupełniania dla edytora Vima. Mam twierdził wcześniej , że Vim całkowicie zastępuje IDE pod Linuksem i choć to z pewnością prawda, że brakuje jednej ważnej funkcji: autouzupełnianie.
Wiem o Ctrl+ N, integracji Exuberant Ctags , Taglist , cppcomplete i OmniCppComplete . Niestety, żaden z nich nie pasuje do mojego opisu „działającego autouzupełniania:”
- Ctrl+N działa ładnie (tylko), jeśli zapomniałeś jak przeliterować
class
, lubwhile
. No cóż. - Ctags daje podstawy, ale ma wiele wad.
- Taglist jest tylko opakowaniem Ctags i jako taki dziedziczy większość wad (chociaż dobrze sprawdza się w przypadku deklaracji list ).
- cppcomplete po prostu nie działa zgodnie z obietnicą i nie mogę zrozumieć, co zrobiłem źle lub czy „działa” poprawnie, a ograniczenia są z założenia.
- OmniCppComplete wydaje się mieć takie same problemy jak cppcomplete, tzn. Automatyczne uzupełnianie nie działa poprawnie. Ponadto
tags
plik należy ponownie zaktualizować ręcznie.
Zdaję sobie sprawę z tego, że nawet nowoczesne, w pełni rozwinięte IDE nie zapewniają dobrego uzupełniania kodu w C ++. Dlatego do tej pory akceptowałem brak Vima w tej dziedzinie. Ale myślę, że podstawowy poziom kompletowania kodu nie jest zbyt wielkim pytaniem i jest w rzeczywistości wymagany do produktywnego wykorzystania. Więc szukam czegoś, co może osiągnąć przynajmniej następujące rzeczy.
Świadomość składni . cppcomplete obiecuje (ale nie dostarcza mi), poprawne, uwzględniające zakres automatyczne uzupełnianie następujących elementów:
variableName.abc variableName->abc typeName::abc
I naprawdę wszystko inne jest całkowicie bezużyteczne.
Konfigurowalność . Muszę określić (łatwo), gdzie znajdują się pliki źródłowe, a zatem skąd skrypt otrzymuje informacje o autouzupełnianiu. W rzeczywistości mam plik Makefile, który określa wymagane ścieżki dołączania. Eclipse potrafi interpretować informacje w nim zawarte, dlaczego nie skrypt Vima?
Aktualność . Gdy tylko zmienię coś w moim pliku, chcę, aby automatyczne uzupełnianie to odzwierciedlało. Mam nie chcesz ręcznie spustem
ctags
(lub coś porównywalnego). Ponadto, zmiany powinny być przyrostowe , czyli kiedy zmieniłem tylko jeden plik jest całkowicie nie do przyjęcia dlactags
aby ponownie przeanalizować całe drzewo katalogów (które mogą być ogromne).
Czy coś zapomniałem? Aktualizuj.
Czuję się swobodnie z dość dużą konfiguracją i / lub majsterkowaniem, ale nie chcę programować rozwiązania od zera i nie jestem dobry w debugowaniu skryptów Vima.
Ostatnia uwaga, naprawdę chciałbym coś podobnego do Java i C #, ale myślę, że to zbyt wiele, na co mam nadzieję: ctags
tylko analizuje pliki kodu, a zarówno Java, jak i C # mają ogromne, wstępnie skompilowane frameworki, które należałoby indeksować. Niestety, tworzenie .NET bez IDE jest jeszcze bardziej PITA niż C ++.
źródło
sh
(co oznacza, że jest w mojej bibliotece), a następnie skrót mojej klasy. Na przykładshP
dlaParser
klasy. Następnie wystarczy napisaćshP
i nacisnąć CTRL + p (lub CTRL + n, jeśli chcesz) i doprowadzić członków klasy od ostatniego użycia do pierwszego (lub od pierwszego do ostatniego, jeśli CTRL + n)clang_complete
jest technicznie najmocniejszy, ale zbyt wolno, ze względu na brak buforowania wyników i częściową kompilację. Muszę przyznać, że nie wypróbowałem wszystkich odpowiedzi, ponieważ niektóre wymagają skomplikowanej, czasochłonnej konfiguracji. Wstrzymam oddech na użyteczną wtyczkę teraz, gdy clang wreszcie pozwala programistom budować AST ze źródeł C ++ (do tej pory nie było dostępnych dobrych darmowych parserów dla C ++).clang_complete
ostatnio? Można golibclang
teraz używać z buforowaniem, dlatego powinien być szybszy.formatted like this
.)Odpowiedzi:
Wypróbuj YouCompleteMe . Używa Clanga przez interfejs libclang, oferując semantyczne zakończenie C / C ++ / Objective-C. Jest to podobne do clang_complete, ale znacznie szybsze i z dopasowaniem rozmytym.
Oprócz powyższego, YCM zapewnia również semantyczne uzupełnianie dla C #, Python, Go, TypeScript itp. Zapewnia również semantyczne uzupełnianie oparte na identyfikatorach dla języków, dla których nie ma wsparcia semantycznego.
źródło
Istnieje również clang_complete, który używa
clang
kompilatora do zapewnienia uzupełniania kodu dla projektów w C ++. Jest jeszcze jedno pytanie dotyczące wskazówek dotyczących rozwiązywania problemów z tą wtyczką.Wtyczka wydaje się działać dość dobrze, dopóki projekt się kompiluje, ale jest zbyt powolna w przypadku dużych projektów (ponieważ próbuje pełnej kompilacji w celu wygenerowania listy tagów).
źródło
clang_complete
Wtyczka działa ładnie na Cygwin i Windows. Nie mogę nic powiedzieć o dużych projektach, ponieważ ich nie mam. :)zgodnie z prośbą, oto komentarz, który podałem wcześniej:
Zerknij na to:
ten link powinien ci pomóc, jeśli chcesz korzystać z monodevelop na MacOSX
Powodzenia i szczęśliwego kodowania.
źródło
Właśnie znalazłem projekt Eclim powiązany z innym pytaniem . Wygląda to dość obiecująco, przynajmniej dla integracji z Javą.
źródło
Jestem trochę spóźniony na imprezę, ale autocomplpop może być pomocny.
źródło
czy szukasz czegoś takiego jak intellisense?
insevim wydaje się rozwiązać ten problem.
link do zrzutów ekranu tutaj
źródło
Czy ktoś wspomniał o code_complete?
Ale nie podobały Ci się tagi, więc prawdopodobnie nie tego szukasz ...
źródło