Czy są jakieś wtyczki autouzupełniania dla vima?


12

Czy jest vim dla wtyczki autouzupełniania? Jakie są moje opcje tutaj?

W tej chwili korzystam z AutoComplPop , ale ma złą integrację z snipMate, której używam, i działa bardzo wolno na plikach Ruby (nawet <100 linii).

Widziałem kilka innych wtyczek, ale są one martwe od co najmniej ponad roku. Jakieś pomysły?


1
ACP działa tutaj bardzo dobrze i nie mam problemu z SnipMate. Istnieją ustawienia ( let g:acp_behaviorSnipmateLength=-1zobacz :help autocomplpop), które należy dodać do .vimrc, dodałeś je?
romainl

Odpowiedzi:


16

To stare pytanie, ale od czasu do czasu wracam do niego z blaskiem gasnącej nadziei, myśląc, że pewnego dnia znajdę odpowiednią kombinację wtyczek, aby zapewnić mi idealne automatyczne uzupełnianie w Vimie. Poszukiwania trwają, ale to wszystkie badania, które przeprowadziłem przez kilka lat.

Przede wszystkim musisz zrozumieć, że Vim jest edytorem tekstu, a nie edytorem kodu. Edytory kodu, IDES, to narzędzia takie jak pakiet narzędzi Jetbrains, Visual Studio Code, Eclipse itp.

Vim zasadniczo nie potrafi dokładnie „autouzupełniania” kodu. Autouzupełnianie wymaga introspekcji kodu źródłowego i analizy AST. Weź pod uwagę, że Vim nie mógł wykonywać operacji asynchronicznych, dopóki Vim 8 nie został wydany w 2016 roku, więc próba uruchomienia dowolnego oprogramowania do introspekcji kodu we wtyczce Vima byłaby koszmarem. Wpisuje się w historię ekosystemu Vim, aby tego nie robić. I wszyscy, którzy próbują to zrobić, jak Tern For Vim, są rzeczywiście koszmarami do użycia.

Najlepsze, co może zrobić edytor tekstu , to urywki i uzupełnianie tych samych słów / linii / etc, o których wie. Jeśli szukasz autouzupełniania kodu, powinieneś użyć edytora kodu, a nie edytora tekstu.

Oto twoje opcje, z których wypróbowałem wszystkie:

  • Dwa przydatne skróty klawiaturowe to Ctrl- n, które automatycznie uzupełniają słowo tylko na podstawie aktualnie otwartych buforów (bez introspekcji kodu) oraz Ctrl- xCtrl- lktóre automatycznie uzupełniają pełny wiersz kodu, jeśli chcesz go zduplikować. Prawdopodobnie wiesz Ctrl- xCtrl- f, która automatycznie uzupełni nazwę pliku wraz ze ścieżką względem bieżącego :pwd. Wzór uzupełniania Wtyczka może być łagodnie przydatna, jeśli nie szukaj z /\v.

  • Wbudowane w Vima „ Omnicompletion ” wywoływane przez Ctrl- x, Ctrl- o(to autorzy Vima chcą, abyś wpisywał za każdym razem) wraz z wieloma wtyczkami specyficznymi dla języka , jeśli takie istnieją. Możesz :echo &omnifuncw pliku sprawdzić, czy masz już Omnicompletion skonfigurowane przez Vima w wybranym pliku.

  • AutoComplPop do automatycznego otwierania powyższego menu Omnicompletion podczas pisania.

  • SuperTab, który pozwala naciskać, Tababy uruchomić wbudowane zakończenie Vima.

  • NeoComplCache, czyli uzupełnianie słów kluczowych (nie określono, jak różni się od wbudowanego uzupełniania Vima), złożona .vimrckonfiguracja i NeoSnippet do uzupełniania fragmentów.

  • Potworna kombinacja exuberant-ctagsi DoctorJS(projekt Mozilli, który nie żyje od roku), TagBar i domowej roboty narzędzie do wyodrębnienia ukończenia z plików tagów.

  • SnipMate , podstawowa wtyczka do uzupełniania tagów, wraz z fragmentami , i sam wymyśl , jak dodawać fragmenty, ponieważ jest to trochę trudne.

  • UltiSnips wraz z UltiSnips-Snippets, które różnią się od powyższych fragmentów.

  • Tern for Vim , obiecująca biblioteka, która dokonuje introspekcji kodu w celu uzyskania poprawnego autouzupełniania. Jest jednak bardzo wadliwy, bardzo powolny, ma wycieki pamięci, które spowodują awarię Vima i być może porzucają oprogramowanie.

  • YouCompleteMe , niewyraźne uzupełnienie podczas pisania, które uruchamia serwer w tle, wraz z rodzimą funkcją uzupełniania fragmentów.

  • Eclim - szlachetna próba uruchomienia serwera Eclipse w tle i powiedzenia Vimowi autouzupełniania, które introspekuje w locie. Działa równie dobrze jak rybitwa.

  • Wreszcie Closetag lub delimitMate lub Autoclose lub w domu-grown bananagram do automatycznego zamykania znaczników i nawiasów automatycznie typowania.

Prawie każda wtyczka na tej liście będzie w konflikcie z prawie każdą inną wtyczką na tej liście.

YouCompleteMe wydaje się być liderem pakietu, ale nigdy nie byłem w stanie sprawić, aby działał poprawnie z uzupełnianiem tagów, a jego uzupełnianie introspekcji kodu jeszcze się nie potwierdziło.

Moja osobista opinia jest taka, że obecny stan autocompletion świecie Vim jest w złym stanie. W przypadku małych projektów może być dobrze, używając jednego z powyższych rozwiązań. Jeśli masz do czynienia z prostym interfejsem API, który możesz zachować głównie w głowie, zakończenie introspekcji bez kodu prawdopodobnie będzie w porządku. Jeśli masz do czynienia z dużym projektem lub potrzebujesz bezpieczeństwa typu podczas programowania, pełnoprawne IDE ( Eclipse , Visual Studio , WebStorm ) będzie ci pasowało znacznie lepiej niż Vim.

Wadą IDE jest oczywiście to, że nie będziesz już mieć mocy Vima w swoich rękach. Nie użyłem żadnego IDE, który ma akceptowalny tryb Vima.

Vim ma umiarkowane nastawienie językowe do nietypowych języków podobnych do C, a poza tym ma nadzieję, że użytkownicy dodadzą jakieś funkcje specyficzne dla języka jako wtyczki. Niestety doprowadziło to do rozszczepionego ekosystemu autouzupełniania. Niektóre opcje są przyzwoite, ale nic nie jest idealne i rzadko istnieje lider / najlepsza praktyka.


6

Oto fajny: YouCompleteMe

YouCompleteMe, która sprawia, że ​​menu rozwijane pojawia się automatycznie podczas pisania i obsługuje rozmyte zaznaczanie, więc jeśli masz wywołany identyfikator partition_finderi wpisujesz coś w stylu ptfpodczas edycji pliku C ++, lista sugestii zawiera oba printfi partition_finderponieważ zawierają te same litery w tej samej kolejności. Jeśli masz zmienną o nazwie myBrain, możesz wpisać brni to zasugeruje. YouCompleteMe również nadaje priorytet sugestiom na podstawie poprzedniej częstotliwości użytkowania.




1

Wierzę, że vim ma jeden wbudowany o nazwie OmniComplete. W trybie wstawiania użyj ctrl+x,ctrl+o.

W przeciwnym razie możesz wykonać uzupełnianie słów kluczowych z trybu wstawiania za pomocą ctrl+n. Po jej wywołaniu wyświetli się lista rozwijana zawierająca możliwe dopasowania słów znalezionych w edytowanym pliku, a także innych otwartych plików. Naciskaj, ctrl+naby przewijać opcje. Kiedy dojdziesz do słowa, które chcesz, po prostu kontynuuj pisanie jak zwykle.

Jeśli nie możesz znaleźć słowa, które chcesz, w ctrl+nkońcu zniknie z listy i będziesz mógł pisać dalej, albo możesz nacisnąć, ESCa następnie bcwprzejść bdo początku słowa, które Cię cobraża i zmienić porządek na żądany w.


Wbudowany Vim wydaje się ssać. Ilekroć naciskam <cx> <co>, po prostu mówi „Nie znaleziono wzoru”. Jednak po naciśnięciu klawisza <cn> uzupełnienia pojawią się w menu rozwijanym tuż pod wpisywanym słowem. Czy to to samo? Czy istnieje sposób, aby lista autouzupełniania wyświetlała się automatycznie, bez konieczności naciskania skrótu?
trusktr

Nie znam wtyczki, która powoduje, że autouzupełnianie wyskakuje bez interakcji, przepraszam :(. <c-x><c-o>Działa tylko dla rzeczy, które vim został wyraźnie poinformowany o tym, jak wspierać. Domyślnie myślę, że może zrobić tylko kilka drobnych rzeczy i tak dalej jak ukończenie CSS, ale jeśli chcesz czegoś takiego jak Eclipse, istnieje kilka wtyczek vim, które starają się to zapewnić dla Ciebie
Conrad.Dean

1
Znalazłem plugin vim nazwie YouCompleteMe sprawia, że menu rozwijane pojawia się automatycznie w trakcie pisania i obsługuje rozmytej wybór, więc jeśli mam identyfikator o nazwie partition_finderi wpisać coś takiego ptfpodczas edytowania C ++ plik, menu rozwijane będą sugerować zarówno printfi partition_finderponieważ zawierają te same litery w tej samej kolejności. Jeśli mam zmienną o nazwie myBrain, mogę pisać brni pojawi się. YouCompleteMe również nadaje priorytet sugestiom na podstawie poprzedniej częstotliwości użytkowania. Sprawdź to tutaj: valloric.github.io/YouCompleteMe
trusktr 13.04.13

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.