Vim: Робота розумнішого автозавершення


75

Я використовую ctags, taglist тощо для автоматичного заповнення у Vim. Однак це дуже обмежено в порівнянні з Visual Studio intellisense або Eclipse автозавершення. Мені цікаво, чи можна налаштувати Vim на:

  1. Показувати автозаповнення щоразу. або -> набираються. Але лише після деякого тексту, який може бути змінною (наприклад, уникайте показу автоматичного завершення після числа).

  2. Показати параметри функції, коли (введено.

  3. Припиніть видаляти список автозавершення, коли деякі видаляють усі символи після. або ->: Коли я вводжу ім'я змінної, натисніть. або -> для пошуку певного учасника мені часто доводиться видаляти всі символи, які я вводжу після. або ->, але це змушує Vim приховувати список автозавершення. Я хотів би, щоб він залишався видимим, якщо я не натиснув клавішу Esc.

  4. Відображення пов’язаного автоматичного заповнення: Коли я вводжу змінну та натискаю ^ X ^ O, зазвичай мені відображаються всі теги у файлі ctags. Я хотів би, щоб він відображав лише теги, пов’язані зі змінною.

Дякую за допомогу.

РЕДАГУВАТИ : Деякі люди голосують за це питання, але, схоже, жоден орган не знає відповіді. Тож просто хотів зазначити, що вам не потрібно надати повну відповідь; непоганими були б також часткові відповіді на будь-який із згаданих пунктів.


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

1
Дякую. На жаль, ніхто, схоже, не знає відповіді :-( Напевно, нам слід поговорити з розробниками Vim (або, можливо, він лише один), щоб серйозно це розглянути, адже це головний недолік Vim.
Рафід,

Відповіді:




8

Щоб змусити vim запускати певну поведінку при натисканні клавіші, потрібно зіставити ключ із функцією.

Наприклад, щоб зіставити ключ .для виклику певного типу завершення в INSERTрежимі, який вам потрібно зробити:

:inoremap <expr> <buffer> . MyFunction()

а потім функції потрібно буде оцінити контекст, де вона була викликана, і представити відповідну відповідь користувачеві.

Редагувати : Це основа того, як clang completeпрацює @honk.

Я не впевнений, чи можете ви налаштувати поведінку omnifunc відповідно до ваших потреб, але на моєму досвіді я ніколи не заходив занадто далеко. Як сказав @Mikhail, вам потрібно буде відстежувати те, що на практиці означає певною мірою інтерпретувати або навіть запускати код.


5

Я використовую vim щодня, і я не знаю жодного існуючого сценарію, який може це зробити. Ця дія вимагала б розуміння класів та відстеження змінних. someObject->означає, що VIM буде знати, який клас є змінною someObject, а потім матиме можливість шукати методи / змінні в цьому класі.

Написати сценарії для vim відносно просто, хоча, як ви вже коментували, на це ще ніхто не відповів. Голосуйте за мене.


Добре, давайте спростимо це тоді. Чи можна було б перевірити, коли '.' або '->' написані і відповідно показують автозаповнення?
Рафід

2

Я хотів би мати ту саму функціональність, яку ви шукаєте, і щойно натрапив на перспективний плагін:

https://github.com/Shougo/neocomplcache схоже, що це може бути новий autocomplpop, і, здається, працює досить добре під час моїх початкових випробувань ... тепер для налаштування завершення omni для роботи з scala ~


Виглядає цікаво. Справа, однак, у автоматичному заповненні Vim полягає в тому, що він не враховує контекст. Наприклад, якщо я пишу '.' або '->' після змінної, я повинен бачити лише члени цієї змінної, а не всі можливі завершення.
Рафід

Це причина, чому я закінчив використовувати такі плагіни, як VsVim та ViEmu.
Рафід

о? У мене склалося враження, що це те, що робить завершення omni .. але я щойно розпочав своє прагнення до запуску такого роду функціональних можливостей .. Я сподівався, що якимось чином теги та omnicompletion можуть це зробити. Я спробував перейти на більш поширену IDE, але я почувався настільки брудним, коли завантажував його і кидав весь цей проект на
голову

Ну, насправді я навпаки, у мене таке враження, що він цього не робить, але не впевнений насправді :-) Але, чесно кажучи, я сумніваюся, що плагіни на Vim коли-небудь зможуть запропонувати автоматичне заповнення, як Visual Studio, особливо якщо він працює від таких плагінів, як Visual Assist або Resharper, тому я вважаю, що краще мати плагін Vim у Visual Studio, ніж плагін автоматичного завершення на Vim.
Рафід


1

У будь-якому випадку я рекомендую YouCompleteMe (YCM) . Він забезпечує (нечітке) узгодження ідентифікаторів вашого поточного файлу, а також завершення шляху, інтеграцію із зовнішніми механізмами завершення, ...

оголошення 1)
Якщо вам подобається семантичне завершення затемнення, використовуйте eclim для інтеграції vim із затемненням. (попереджувально використовувати інший семантичний механізм для YCM)

оголошення 2)
Ці 2 добре грають між собою, до речі.: YCM може навіть надати визначення функції (= список параметрів) нещодавно завершеної функції!

оголошення 3)
це те, що YCM робить у будь-якому випадку

оголошення 4)
не зовсім впевнений, що ви маєте на увазі під цим. ніколи не використовував ctags!

PS: Я настійно рекомендую додатково використовувати UltiSnips та Tagbar (і якщо вам подобається UndoTree ), що робить vim ідеальною IDE для мене.

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