Есть ли плагины автозаполнения для vim?

11

Есть ли плагин автозаполнения для vim? Какие у меня есть варианты?

В данный момент я использую AutoComplPop , но у него плохая интеграция с snipMate, которую я использую, и очень медленный на файлах Ruby (даже <100 строк).

Я видел пару других плагинов, но они мертвы как минимум больше года. Итак, есть идеи?

naquad
источник
1
ACP здесь работает очень хорошо, и у меня нет проблем с SnipMate. Есть настройки ( let g:acp_behaviorSnipmateLength=-1см. :help autocomplpop), Которые вы должны добавить в свой .vimrc, вы добавили его?
Ромен

Ответы:

15

Это старый вопрос, но я продолжаю возвращаться к нему время от времени с проблеском угасающей надежды, думая, что однажды я найду правильную комбинацию плагинов, чтобы дать мне идеальное автозаполнение в Vim. Поиски продолжаются, но это все исследования, которые я проводил в течение нескольких лет.

Прежде всего, вы должны понимать, что Vim - это текстовый редактор, а не редактор кода. Редакторы кода, IDES, такие инструменты, как набор инструментов Jetbrains, код Visual Studio, Eclipse и т. Д.

Vim принципиально не может точно «автозаполнить» код. Автозаполнение требует анализа исходного кода и анализа AST. Учтите, что Vim не мог выполнять асинхронные операции, пока Vim 8 не был выпущен в 2016 году, поэтому попытка запустить любое программное обеспечение для интроспекции кода в плагине Vim было бы кошмаром. Это запечатлено в истории экосистемы Vim, чтобы этого не делать. И все те, кто пытается это сделать, как Tern For Vim, действительно кошмары в использовании.

Лучшее, что может сделать текстовый редактор - это отрывки и заполнение теми же словами / строками / и т. Д., О которых он знает. Если вы ищете автозаполнение кода, вы должны использовать редактор кода, а не текстовый редактор.

Это ваши варианты, из которых я попробовал все:

  • Два полезных сочетания клавиш: Ctrl- n, которые автоматически заполняют слово, основываясь только на текущих открытых вами буферах (без самоанализа кода), и Ctrl- xCtrl-, lкоторые автоматически заполняют полную строку кода, если вы хотите дублировать один. Вы, вероятно, знаете Ctrl- xCtrl- f, который будет автоматически заполнять имя файла, включая путь, относительно текущего :pwd. Модель-полный модуль может быть слегка полезно , если вы не ищите с /\v.

  • Встроенный в Vim « Omnicompletion » запускается Ctrl- x, Ctrl- o(это то, что авторы Vim хотят, чтобы вы печатали каждый раз) вместе с набором языковых плагинов, если они существуют. Вы можете :echo &omnifuncв файле посмотреть, настроена ли Vim Omnicompletion Vim в выбранном вами файле.

  • AutoComplPop для автоматического открытия вышеуказанного меню Omnicompletion при наборе текста.

  • SuperTab, который позволяет нажимать, Tabчтобы вызвать встроенное завершение Vim.

  • NeoComplCache, который является завершением ключевого слова (не отличается от встроенного завершения Vim, не указан), сложной .vimrcнастройкой и NeoSnippet для завершения фрагмента.

  • Комбинация монстров exuberant-ctagsи DoctorJS(проект Mozilla, который был мертв в течение года), TagBar и доморощенная вещь для извлечения завершения из файлов тегов.

  • SnipMate , базовый плагин для дополнения тегов, а также фрагменты , и вы сами поймете , как добавлять фрагменты, так как это немного сложно.

  • UltiSnips вместе с UltiSnips-Snippets, которые отличаются от вышеупомянутых фрагментов.

  • Крачка для Vim , многообещающая библиотека, которая выполняет самоанализ кода для получения правильного автозаполнения. Однако он глючит, очень медленный, имеет утечки памяти, которые приводят к сбою Vim, и, возможно, является заброшенным.

  • YouCompleteMe , нечеткое завершение по типу, которое запускает сервер в фоновом режиме, наряду с домашней функцией для завершения фрагмента.

  • Eclim - благородная попытка запустить сервер Eclipse в фоновом режиме и сообщить Vim об автозаполнениях, которые он анализирует на лету. Это работает примерно так же, как крачка.

  • Наконец, Closetag или delimitMate или AutoClose или доморощенный bananagram для автоматического закрытия тегов и скобки автоматически при вводе.

Почти каждый плагин в этом списке будет конфликтовать почти с каждым другим плагином в этом списке.

YouCompleteMe, похоже, является лидером пакета, но мне никогда не удавалось заставить его работать должным образом с завершением тега, а его завершение кода-интроспекцией еще не доказало свою эффективность

Мое личное мнение таково, что текущее состояние мира автозаполнения Vim находится в плохом состоянии. Для небольших проектов вам может пригодиться одно из указанных выше решений. Если вы имеете дело с простым API-интерфейсом, который вы можете держать главным образом в своей голове, завершение без интроспекции кода, вероятно, будет в порядке. Если вы работаете с большим проектом или вам нужна безопасность типов при программировании, полноценная IDE ( Eclipse , Visual Studio , WebStorm ) подойдет вам гораздо лучше, чем Vim.

Недостатком IDE, конечно же, является то, что у вас больше не будет силы Vim. Я не использовал ни одной IDE с приемлемым режимом Vim.

Vim имеет умеренный языковой уклон к нетипизированным C-подобным языкам, и в противном случае он ожидает, что любые специфичные для языка функции будут добавлены пользователями в качестве плагинов. К сожалению, это привело к раздробленной экосистеме автозаполнения. Некоторые варианты являются приличными, но нет ничего идеального, и редко встречается лидер большинства / лучшая практика.

Энди Рэй
источник
6

Вот хороший: YouCompleteMe

YouCompleteMe, который заставляет раскрывающееся меню автоматически появляться при вводе, и он поддерживает нечеткий выбор, поэтому, если у вас есть вызываемый идентификатор, partition_finderи вы вводите что-то наподобие ptfво время редактирования файла C ++, раскрывающийся список предложений будет включать и то, printfи другое, partition_finderтак как они содержат одинаковые буквы в том же порядке. Если у вас есть переменная с именем myBrain, вы можете напечатать, brnи она предложит это. YouCompleteMe также расставляет приоритеты для предложений, основываясь на предыдущей частоте использования.

trusktr
источник
2

Я использую neocomplcache с фрагментами snipmate + snipmate

let g:neocomplcache_snippets_dir='~/.vim/bundle/snipmate-snippets/snippets'

ты можешь видеть мой vimrc

Хуан Пабло
источник
2

Я пробую necomplecache с neosnippet. Я предполагаю, что он будет лучше интегрирован, так как оба написаны одним и тем же человеком.

Forethinker
источник
1

Я считаю, что у vim есть одна встроенная система под названием OmniComplete. В режиме вставки используйте ctrl+x,ctrl+o.

В противном случае вы можете выполнить завершение ключевых слов из режима вставки с помощью ctrl+n. Когда вы вызываете его, вы увидите раскрывающийся список возможных совпадений слов, найденных в редактируемом вами файле, а также в других открытых вами файлах. Продолжайте нажимать, ctrl+nчтобы переключаться между вариантами. Когда вы найдете нужное слово, просто продолжайте печатать как обычно.

Если вы не можете найти нужное слово, в ctrl+nконечном итоге вычеркните его из списка, и вы сможете продолжать печатать, или вы можете нажать, ESCа затем bcwперейти bк началу слова оскорбления и cпередать wорд тому, который вы хотели.

Conrad.Dean
источник
Встроенный в Vim, кажется, отстой. Всякий раз, когда я нажимаю <cx> <co>, он просто говорит "Шаблон не найден" Однако, если я нажму <cn>, в выпадающем списке прямо под набираемым словом появится завершение. Это то же самое? Есть ли способ сделать так, чтобы выпадающий список автозаполнения появлялся автоматически, не нажимая ярлык?
trusktr
Я не знаю о плагине, который делает автозаполнение всплывающим без взаимодействия, извините :(. <c-x><c-o>Работает только для вещей, которые vim явно сказали, как поддерживать. По умолчанию я думаю, что он может сделать только пару незначительных вещей, и прочее как завершение CSS, но если вы хотите что-то вроде Eclipse, есть пара плагинов vim, которые пытаются предоставить вам это
Conrad.Dean
1
Я нашел плагин для vim под названием YouCompleteMe, который позволяет автоматически отображать выпадающее меню при вводе текста и поддерживает нечеткий выбор, поэтому, если у меня есть вызываемый идентификатор partition_finderи я что- ptfто напишу во время редактирования файла C ++, выпадающее меню предложит printfи partition_finderпотому что они содержат одинаковые буквы в одинаковом порядке. Если у меня есть переменная с именем myBrain, я могу напечатать, brnи она появится. YouCompleteMe также расставляет приоритеты для предложений, основываясь на предыдущей частоте использования. Проверьте это здесь: valloric.github.io/YouCompleteMe
trusktr
1

Я создал новый плагин SimpleAutoComplPop из оригинального AutoComplPop. Хотя я не знаком с ruby ​​или snipMate, вы можете попробовать, и я рад получить отзывы :)

Rox
источник