Автозавершення у Vim


257

Коротше кажучи, я шукаю працюючу функцію автозаповнення для редактора Vim. Я раніше заперечував, що Vim повністю замінює IDE під Linux, і хоча це, безумовно, правда, йому не вистачає однієї важливої ​​особливості: автозавершення.

Я знаю , про Ctrl+ N, інтеграції Буйний Ctags , Taglist , cppcomplete і OmniCppComplete . На жаль, жодне з них не відповідає моєму опису "працюючого автозавершення:"

  • Ctrl+N добре працює (лише), якщо ви забули, як написати class, або while. Що ж, добре.
  • Ctags дає вам зачатки, але має безліч недоліків.
  • Теглист - це лише пакунок 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технічно є найбільш надійним, але непомірно повільним через відсутність кешування результатів та часткової компіляції. Я мушу визнати, що я не пробував усіх відповідей, тому що деякі вимагають складних, трудомістких налаштувань. Я затримаю дихання на корисний плагін тепер, коли кланг нарешті дозволяє розробникам створювати AST з C ++ джерел (до цих пір не було в наявності хороших безкоштовних аналізаторів для C ++).
Конрад Рудольф

2
Ви clang_completeнещодавно пробували ? Він може використовуватись libclangіз кешуванням зараз, і таким чином повинен бути швидшим.
Ян Ларрес

@Jan Дякую за інформацію Коли я востаннє спробував це, підтримка libclang все ще була схематичною. Я, мабуть, повинен спробувати ще раз, коли знайду час.
Конрад Рудольф

(Причина редагування відката: назви продуктів не є кодом, вони не належать formatted like this.)
Konrad Rudolph

Відповіді:


171

Спробуйте YouCompleteMe . Він використовує Clang через інтерфейс libclang, пропонуючи семантичне завершення C / C ++ / Objective-C. Це дуже схоже на clang_complete, але істотно швидше і з нечітким узгодженням.

На додаток до вищезазначеного, YCM також забезпечує семантичне завершення для C #, Python, Go, TypeScript тощо. Він також забезпечує несемантичне завершення на основі ідентифікаторів для мов, для яких не має семантичної підтримки.


69
Насправді я прийму це рішення. Нарешті плагін, який постачає. Я використовую його вже кілька днів. На це питання знадобилося лише чотири роки. ;-)
Конрад Рудольф

5
чудова робота з YouCompletMe валлориком! 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. Не можу нічого сказати про великі проекти, тому що у мене їх немає. :)
Лумі

Здається, що clang_complete з використанням libclang має кешування зараз. Це повинна бути прийнята відповідь. Ви спробували clang_complete в ядрі Linux? найкраща індексація, яку я бачив для ядра, - це використання Eclipse CDT, якщо clang_complete може обробляти ядро, воно повинне бути в змозі виконати все, що завгодно.
тире

clang_complete - просто найкращий плагін Vim, який я використовую.
Кромулент

1
@Cromulent Ах, перевірити YouCompleteMe, це набагато краще.
Конрад Рудольф

@KonradRudolph Дякую Я перевірю це.
Кромулент

7

за запитом, ось коментар, який я давав раніше:

подивіться на це:

це посилання має допомогти вам, якщо ви хочете використовувати monodevelop на MacOSX

Удачі та щасливого кодування.


Посилання OmniCompletion розірвано
dotoree

1
Я пропоную github.com/nosami/OmniSharpServer з YouCompleteMe для C #, як було запропоновано вище
rafee

6

Щойно я знайшов проект Eclim, пов'язаний в іншому питанні . Це виглядає досить перспективно, принаймні для інтеграції Java.


Ви перевірили? Здається цікавим.
Pacane

@Pacane: ні. Мені не довелося користуватися Java місяцями і не мав вільного часу для експериментів.
Конрад Рудольф

1
Eclim, здається, є прекрасним рішенням для Java, хоча Eclipse все ще залишається звіром для завантаження навіть у
безголівковій

2
Для Java ви можете використовувати Vrapper . Я вважаю, що зазвичай це нормально з чудовим автоматичним завершенням. Для епізодичного текстового редагування я можу запустити справжній Vim як зовнішній інструмент.
kizzx2


2

це те, що ви шукаєте щось на кшталт intellisense?

Здається, інсевім вирішує це питання.

посилання на скріншоти тут


2
Це було б те, що я шукаю, так. На жаль, він працює лише в Windows (я використовую OS X). Також останнє оновлення, здається, було здійснено близько 2003 року :-(
Konrad Rudolph

добре, ви можете отримати вихідний код :) якщо не це, єдине, про що я можу придумати, - це omnicompletion .. або подивіться на це: ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop для .net речі принаймні ..
Ric Tokyo

Рік, будь ласка, надайте свій коментар як дві окремі відповіді, вони безцінні, і я хотів би їх належним чином вшанувати! Однак, MonoDevelop зараз не використовується в OS X, і я зараз переглядаю OmniCppComplete.
Конрад Рудольф

Lol це тільки вікна! :( Навіщо вам хотіти цього в Windows, де у вас є VS? Шукаю рішення в Linux.
Nils

Нілс: Не кожен має доступ до Visual Studio, також багато людей мають навички, які вони хочуть застосувати в середовищі Windows. Був порт для Linux, але його зараз немає. У будь-якому випадку, чого ви намагаєтесь досягти? Ви впевнені, що Вам просто не потрібні функції автоматичного завершення за замовчуванням? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/…
Рік Токіо

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.