Autouzupełnianie w Vimie

257

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, lub while. 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 tagsplik 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 dla ctagsaby 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ę: ctagstylko 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 ++.

Konrad Rudolph
źródło
4
Minęło dużo czasu, odkąd zadałeś to pytanie, czy w końcu znalazłeś dobre? Pytam, ponieważ nie widzę żadnych zaakceptowanych odpowiedzi. Osobiście jednak muszę przyznać, że uciekłem się do prefiksu moich zmiennych / funkcji. Na przykład wszystkie zaczynają się od sh(co oznacza, że ​​jest w mojej bibliotece), a następnie skrót mojej klasy. Na przykład shPdla Parserklasy. Następnie wystarczy napisać shPi 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)
Shahbaz
4
@Shahbaz W rzeczywistości jestem przekonany, że w tej chwili nie ma wystarczająco dobrego rozwiązania. clang_completejest 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 ++).
Konrad Rudolph
2
Czy próbowałeś clang_completeostatnio? Można go libclangteraz używać z buforowaniem, dlatego powinien być szybszy.
Jan Larres
@Jan Dzięki za informację. Kiedy ostatnio go wypróbowałem, obsługa libclang była nadal pobieżna. Prawdopodobnie powinienem spróbować jeszcze raz, kiedy będę miał czas.
Konrad Rudolph
(Powód wycofania edycji: nazwy produktów nie są kodem, nie należą formatted like this.)
Konrad Rudolph

Odpowiedzi:

171

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.

Valloric
źródło
69
W rzeczywistości zamierzam zaakceptować to rozwiązanie. Wreszcie wtyczka, która dostarcza. Używam go od kilku dni. Odpowiedzi na to pytanie zajęły cztery lata. ;-)
Konrad Rudolph
5
świetna robota z YouCompletMe valloric! gratulacje
statquant
5
Szkoda, że ​​YouCompleteMe to kompletna PITA do zainstalowania w systemie Windows :(
xx
2
@DrTwox Z pliku Readme: „YCM nie ma oficjalnego wsparcia dla systemu Windows , ale to nie znaczy, że nie możesz go tam uruchomić. Zobacz stronę wiki Przewodnika instalacji systemu Windows. Możesz go dodać.”
user456584
7
W tym poście należy wspomnieć, że jesteś autorem, ponieważ jest to autopromocja z pogranicza (chociaż nie będę argumentować, że odpowiada na pytanie, mimo to powinieneś dołączyć zastrzeżenie).
EntangledLoops
36

Istnieje również clang_complete, który używa clangkompilatora 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).

Konrad Rudolph
źródło
clang_completeWtyczka działa ładnie na Cygwin i Windows. Nie mogę nic powiedzieć o dużych projektach, ponieważ ich nie mam. :)
Lumi,
Wygląda na to, że clang_complete używa libclang ma teraz buforowanie. To powinna być wówczas zaakceptowana odpowiedź. Próbowałeś clang_complete na jądrze Linuksa? najlepszym indeksowaniem, jakie widziałem dla jądra, jest Eclipse CDT, jeśli clang_complete może obsługiwać jądro, powinno być w stanie ukończyć wszystko.
dashy
clang_complete to po prostu najlepsza wtyczka Vima, której używam.
Cromulent
1
@Cromulent Ah, sprawdź YouCompleteMe, jest znacznie lepiej.
Konrad Rudolph
@KonradRudolph Thanks. Sprawdzę to.
Cromulent
6

Właśnie znalazłem projekt Eclim powiązany z innym pytaniem . Wygląda to dość obiecująco, przynajmniej dla integracji z Javą.

Konrad Rudolph
źródło
Przetestowałeś to? Wygląda interesująco.
Pacane
@Pacane: nie. Nie musiałem używać Javy od miesięcy i nie miałem czasu na eksperymentowanie.
Konrad Rudolph
1
Eclim wydaje się być świetnym rozwiązaniem dla Javy, chociaż Eclipse wciąż pozostaje bestią do załadowania nawet w konfiguracji bezgłowej
Drupad Panchal
2
W przypadku Javy możesz użyć Vrapper . Uważam, że zwykle jest w porządku z doskonałym autouzupełnianiem. Aby sporadycznie edytować tekst, mogę uruchomić prawdziwy Vim jako narzędzie zewnętrzne.
kizzx2
2

czy szukasz czegoś takiego jak intellisense?

insevim wydaje się rozwiązać ten problem.

link do zrzutów ekranu tutaj

Ric Tokyo
źródło
2
Właśnie tego szukam, tak. Niestety działa tylko w systemie Windows (używam OS X). Ponadto wydaje się, że ostatnia aktualizacja została dokonana około 2003 r. :-(
Konrad Rudolph
cóż, możesz dostać kod źródłowy :) jeśli nie to, jedyne, co mogę wymyślić, to omnicompletment .. lub spójrz na to: ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop dla rzeczy .net przynajmniej ..
Ric Tokyo
Ric, podaj swój komentarz jako dwie osobne odpowiedzi, są one bezcenne i chciałbym je odpowiednio uhonorować! To powiedziawszy, MonoDevelop jest obecnie niezdatny do użytku w OS X, a obecnie szukam OmniCppComplete.
Konrad Rudolph
Lol to tylko Windows! :( Dlaczego miałbyś chcieć tego w systemie Windows, w którym masz VS .. Szukam rozwiązania w systemie Linux.
Nils
Nils: Nie każdy ma dostęp do Visual Studio, również wiele osób ma umiejętności vi, które chcą zastosować w środowisku Windows. Był Linux do Linuksa, ale obecnie nie działa. W każdym razie, co próbujesz osiągnąć? czy na pewno nie potrzebujesz tylko domyślnych funkcji autouzupełniania? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/…
Ric Tokyo