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.