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 ++.
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 go libclang
teraz używać z buforowaniem, dlatego powinien być szybszy.
formatted like this
.)
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)