Автозаполнение в Vim

257

Короче говоря, я ищу работающую функцию автозаполнения для редактора Vim. Ранее я утверждал, что Vim полностью заменяет IDE в Linux, и, хотя это, безусловно, правда, в ней отсутствует одна важная функция: автозаполнение.

Я знаю , о Ctrl+ N, интеграции Буйный Ctags , Taglist , cppcomplete и OmniCppComplete . Увы, ни один из них не подходит под мое описание «рабочего автозаполнения»:

  • Ctrl+N работает хорошо (только), если вы забыли, как пишется class, или while. Ну что ж.
  • Ctags дает вам зачатки, но имеет много недостатков.
  • Taglist - это просто оболочка Ctags и, как таковая, наследует большинство своих недостатков (хотя он хорошо работает для объявлений объявлений).
  • cppcomplete просто не работает, как было обещано, и я не могу понять, что я сделал неправильно, или если он «работает» правильно, и ограничения заложены в дизайн.
  • OmniCppComplete, похоже, имеет те же проблемы, что и cppcomplete, то есть автозаполнение не работает должным образом. Кроме того, tagsфайл еще раз необходимо обновить вручную.

Я осознаю тот факт, что даже современные, полноценные интегрированные среды разработки не предлагают хорошего завершения кода C ++. Вот почему я принял недостаток Вима в этой области до сих пор. Но я думаю, что фундаментальный уровень завершения кода не слишком сложен, и фактически необходим для продуктивного использования. Поэтому я ищу что-то, что может сделать по крайней мере следующие вещи.

  • Синтаксическая осведомленность . cppcomplete обещает (но не выполняет для меня) правильное автоматическое завершение с учетом области действия следующего:

    variableName.abc
    variableName->abc
    typeName::abc

    И действительно, все остальное совершенно бесполезно.

  • Конфигурируемость . Мне нужно указать (легко), где находятся исходные файлы и, следовательно, откуда скрипт получает информацию об автозаполнении. На самом деле, у меня в каталоге есть Makefile, в котором указаны необходимые пути включения. Eclipse может интерпретировать найденную в нем информацию, а почему не сценарий Vim?

  • Актуальность . Как только я что-то изменю в своем файле, я хочу, чтобы автозаполнение отражало это. Я не хочу, чтобы вручную вызвать ctags(или что-то сопоставимое). Кроме того, изменения должны быть постепенными , то есть, когда я изменил только один файл, это совершенно недопустимо для ctagsповторного анализа всего дерева каталогов (которое может быть огромным).

Я что-нибудь забыл? Не стесняйтесь обновлять.

У меня достаточно много настроек и / или настроек, но я не хочу программировать решение с нуля, и я не очень хорошо отлаживаю скрипты Vim.

И последнее замечание: мне бы очень хотелось что-то похожее для Java и C #, но я думаю, что на это слишком много надежды: ctagsанализируются только файлы кода, и у Java и C # есть огромные, предварительно скомпилированные фреймворки, которые нужно будет проиндексировать. К сожалению, разработка .NET без IDE - это даже больше PITA, чем C ++.

Конрад Рудольф
источник
4
Прошло много времени с тех пор, как вы задавали этот вопрос, вы, наконец, нашли хороший? Я спрашиваю, потому что я не вижу принятых ответов. Лично я должен признать, что прибегал к префиксам своих переменных / функций. Например, все они начинаются с sh(значит, это в моей библиотеке) и сопровождаются сокращением моего класса. Например shPдля Parserкласса. Тогда все, что вам нужно сделать, это написать shPи нажать CTRL + p (или CTRL + n, если хотите) и получить членов класса от последнего использования до первого (или от первого до последнего, если CTRL + n)
Шахбаз
4
@ Shahbaz На самом деле я убежден, что на данный момент не существует достаточно хорошего решения. clang_completeявляется технически наиболее надежным, но запредельно медленным из-за отсутствия кэширования результатов и частичной компиляции. Я должен признать, что я не пробовал все ответы, потому что некоторые требуют сложной, трудоемкой настройки. Я задержу дыхание на предмет пригодного для использования плагина теперь, когда clang, наконец, позволяет разработчикам создавать AST из источников C ++ (до сих пор не было хороших бесплатных анализаторов для C ++).
Конрад Рудольф
2
Вы пробовали clang_completeнедавно? Его можно использовать libclangс кэшированием сейчас и, следовательно, должно быть быстрее.
Ян Ларрес
@Jan Спасибо за информацию. Когда я в последний раз пробовал это сделать, поддержка libclang все еще была отрывочной. Я, наверное, должен попробовать еще раз, как только у меня будет время.
Конрад Рудольф
(Причина отката редактирования: названия продуктов не являются кодом, они не принадлежат formatted like this.)
Конрад Рудольф

Ответы:

171

Попробуйте YouCompleteMe . Он использует Clang через интерфейс libclang, предлагая семантическое завершение C / C ++ / Objective-C. Это очень похоже на clang_complete, но существенно быстрее и с нечетким соответствием.

В дополнение к вышесказанному, YCM также обеспечивает семантическое завершение для C #, Python, Go, TypeScript и т. Д. Оно также обеспечивает несемантическое завершение на основе идентификаторов для языков, для которых у него нет семантической поддержки.

Valloric
источник
69
На самом деле, я собираюсь принять это решение. Наконец плагин, который доставляет. Я использую его уже несколько дней. Потребовалось всего четыре года, чтобы ответить на этот вопрос. ;-)
Конрад Рудольф
5
отличная работа с YouCompletMe valloric! Congrats
statquant
5
Очень жаль, что YouCompleteMe - это полная PITA для установки на Windows :(
xx
2
@DrTwox Из readme: «YCM не имеет официальной поддержки Windows , но это не значит, что вы не можете заставить его работать там. См. Вики-страницу руководства по установке Windows. Не стесняйтесь добавлять к ней».
user456584
7
В этом посте должно быть упомянуто, что вы являетесь автором, так как это самореклама на границе (хотя я не буду утверждать, что она отвечает на вопрос, тем не менее, вы должны включить отказ от ответственности).
EntangledLoops
36

Также есть clang_complete, который использует clangкомпилятор для обеспечения завершения кода для проектов C ++. Есть еще один вопрос с советами по устранению неполадок для этого плагина.

Плагин, кажется, работает довольно хорошо, пока проект компилируется, но он слишком медленный для больших проектов (так как он пытается выполнить полную компиляцию для генерации списка тегов).

Конрад Рудольф
источник
clang_completeПлагин хорошо работает на Cygwin и Windows. Ничего не могу сказать о больших проектах, потому что у меня их нет. :)
Lumi
Кажется, clang_complete, использующий libclang, теперь имеет кеширование. Это должен быть принятый ответ. Вы пробовали clang_complete на ядре Linux? лучшее индексирование, которое я видел для ядра, - это использование Eclipse CDT, если clang_complete может обрабатывать ядро, то оно должно быть способно завершить что угодно.
dashesy
clang_complete - это просто лучший плагин Vim, который я использую.
Cromulent
1
@Cromulent Ах, проверьте YouCompleteMe, это намного лучше.
Конрад Рудольф
@KonradRudolph Спасибо. Я проверю это.
Cromulent
7

согласно запросу, вот комментарий, который я дал ранее:

Посмотри на это:

эта ссылка должна помочь вам, если вы хотите использовать monodevelop на MacOSX

Удачи и счастливого кодирования.

Рик Токио
источник
OmniCompletion ссылка не работает
Dotoree
1
Я предлагаю github.com/nosami/OmniSharpServer с YouCompleteMe для C #, как было предложено выше
rafee
6

Я только что нашел проект Eclim, связанный с другим вопросом . Это выглядит довольно многообещающе, по крайней мере, для интеграции с Java.

Конрад Рудольф
источник
Вы проверяли это? Кажется интересным
Пакане
@Pacane: нет. Мне не приходилось использовать Java несколько месяцев, и у меня не было свободного времени для экспериментов.
Конрад Рудольф
1
Eclim, кажется, является отличным решением для Java, хотя Eclipse по-прежнему остается
чудовищным
2
Для Java вы можете использовать Vrapper . Я нахожу, что это обычно хорошо с превосходным автозаполнением. Для периодического редактирования текста я могу запустить настоящий Vim как внешний инструмент.
kizzx2
3

Я немного опоздал на вечеринку , но autocomplpop может быть полезным.

romainl
источник
2

это то, что вы ищете что-то вроде intellisense?

Insesvim, кажется, решает проблему.

ссылка на скриншоты здесь

Рик Токио
источник
2
Это было бы то, что я ищу, да. К сожалению, он работает только на Windows (я использую OS X). Кроме того, последнее обновление, кажется, было сделано около 2003 года. :-(
Конрад Рудольф
ну, вы можете получить исходный код :), если нет, то единственное, о чем я могу думать, это омниполнение ... или взгляните на это: ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop для .net вещи по крайней мере ..
Рик Токио
Рик, пожалуйста, оставьте свой комментарий в виде двух отдельных ответов, они неоценимы, и я бы хотел их правильно почтить! Тем не менее, MonoDevelop непригоден для OS X на данный момент, и я в настоящее время изучаю OmniCppComplete.
Конрад Рудольф
Лол это только окна! :( Почему вы должны хотеть это в Windows, где у вас есть VS .. Я ищу решение для Linux.
Nils
Нильс: Не у всех есть доступ к Visual Studio, также у многих есть навыки работы с vi, которые они хотят применить в среде Windows. Был порт для Linux, но в настоящее время он не работает. В любом случае, чего вы пытаетесь достичь? Вы уверены, что вам просто не нужны функции автозаполнения по умолчанию? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/…
Рик Токио