Чи є додатки для автодоповнення для vim?


12

Чи є плагін автодоповнення для vim? Які тут мої варіанти?

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

Я бачив пару інших плагінів, але вони мертві принаймні більше року. Отже, якісь ідеї?


1
Тут працює дуже добре, і у мене немає проблем із SnipMate. Існують налаштування ( let g:acp_behaviorSnipmateLength=-1див. :help autocomplpop), Які ви повинні додати до свого .vimrc, ви додали його?
romainl

Відповіді:


16

Це давнє запитання, але я постійно повертаюся до нього з проблиском згасаючої надії, думаючи, що одного разу я знайду правильну комбінацію плагінів, щоб дати мені ідеальне автодоповнення у Vim. Пошук триває, але це все дослідження, які я робив протягом кількох років.

Перш за все, ви повинні зрозуміти, що Vim - це текстовий редактор, а не редактор коду. Редактори коду, IDES - такі інструменти, як набір інструментів Jetbrains, Visual Studio Code, 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у файлі, щоб побачити, чи вже у вас вибраний файл Omnicompletion, встановлений Vim.

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

  • SuperTab, який дозволяє натиснути, Tabщоб запустити вбудований Vim.

  • NeoComplCache, що є ключовим словом завершення (чим він не відрізняється від вбудованого завершення Vim, не вказано), складною .vimrcустановкою та NeoSnippet для завершення фрагменту.

  • Чудовищна комбінація exuberant-ctagsта DoctorJS(проект Mozilla, який уже мертвий рік), TagBar та домашня річ , яка отримує завершення з файлів тегів.

  • SnipMate , базовий плагін для завершення тегів, разом із фрагментами , і самостійно придумайте, як додати фрагменти, оскільки це трохи складно.

  • UltiSnips разом з UltiSnips-Snippets, які відрізняються від вищезазначених фрагментів.

  • Tern for Vim - багатообіцяюча бібліотека, яка робить власне самоаналіз коду, щоб отримати правильне автозаповнення. Однак він баггі, дуже повільний, має витоки пам’яті, що призведе до аварії Vim, і, можливо, це залишення програмного забезпечення.

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

  • Eclim - шляхетна спроба запустити сервер Eclipse у фоновому режимі і повідомити Vim про автоматичні завершення, які він вводить вперед . Це працює так само, як і Терн.

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

Майже кожен плагін у цьому списку буде конфліктувати з майже будь-яким іншим плагіном у цьому списку.

YouCompleteMe, здається, є лідером пакету, але мені ніколи не вдалося змусити його працювати належним чином із заповненням тегів, і його завершення самоаналізу коду ще мало довести потужність.

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

Мінусом IDE, звичайно, є те, що у вас більше не буде сили Віма. Я не використовував жодної IDE, яка має прийнятний режим Vim.

Vim має помірний ухил до нетипізованих С-подібних мов, і в іншому випадку очікує, що будь-які особливості мови будуть додані користувачами як плагіни. На жаль, це призвело до розбитої екосистеми автозавершення. Деякі варіанти пристойні, але нічого не ідеально, і рідко є керівник більшості / найкраща практика.


6

Ось приємний: YouCompleteMe

YouCompleteMe , що робить меню, що випадає з'являється автоматично при введенні, і він підтримує нечіткий вибір, тому якщо у вас є ідентифікатор , званий partition_finderі ви друкуєте що - щось подібне ptfпри редагуванні файлу Сі ++, що випадає список пропозиції включатиме в себе як printfі partition_finderтому , що вони містять одні і ті ж букви в тому ж порядку. Якщо ви маєте назву змінної myBrain, ви можете ввести brnїї, і вона запропонує це. YouCompleteMe також визначає пріоритетність пропозицій на основі попередньої частоти використання.


2

Я використовую neocomplcache з фрагментами snipmate + snipmate

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

ви можете побачити мого vimrc



1

Я вважаю, що vim має вбудовану назву OmniComplete. У режимі вставки ctrl+x,ctrl+o.

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

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


Вбудований 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, можливо, ви спробуєте, і я радий отримати відгуки :)

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