Яка різниця між плагінами vim snippets?


25

Існує велика кількість плагінів фрагментів для vim: ultisnips , snipmate , xpredplate , neosnippet та багато іншого.

Усі вони мають свої плюси і мінуси і більш-менш залежність. Поки я використовував ultisnips, але ніколи не був повністю задоволений цим.

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

Існує лістинг тут , який може бути гарний початок , але деякі повні, ясні і precises відповідей , як наше співтовариство може писати було б дуже корисно.


1
Ви також маєте цю матрицю на вікі Marc Weber: vim-wiki.mawercer.de/wiki/topic/…
Люк Ермітт

2
ІМХО це досить загальне, можливо, якщо ви докладно пояснили, що "ніколи не був задоволений цим"? Я використовую "neosnippet.vim" Shougo.
VanLaser

ви повинні оновити вікі з інформацією звідси. Спасибі.
Крістіан Брабандт

@ChristianBrabandt: Так, як тільки у мене буде час (у найближчі кілька днів), я його оновлю.
statox

Відповіді:


22

Я вже кілька тижнів використовую ultisnips .

Я думаю, що основними перевагами цього плагіна є наступні:

  • Це досить швидко навіть при наявності великої кількості фрагментів.
  • Основний синтаксис для визначення нового фрагмента легко зрозуміти, тому легко швидко створити новий фрагмент, виконуючи те, що ви хочете зробити. (Для більш складних фрагментів може знадобитися деяка додаткова робота.)
  • Це дуже добре працює поза коробкою; основна конфігурація дозволяє дуже швидко використовувати фрагменти.
  • Це дійсно конфігурується. Навіть якщо основна конфігурація працює добре, якщо ви користувач живлення, ви можете дійсно налаштувати її.

Перш за все, ultisnips - це фрагмент двигуна, що означає, що плагін надає функції для використання фрагментів, але не надає самі фрагменти. Щоб отримати фрагменти, автор рекомендує vim-фрагменти .

Після встановлення обох плагінів ви зможете використовувати свої фрагменти.

Фрагменти визначення зберігаються в файлах , названих наступних моделей: ft.snippets, ft_*.snippetsабо ft/*, де ftце "Filetype" поточного документа і *являє собою оболонку, як по шаблоном відповідності будь-який рядок , включаючи порожню рядок. (Зверніть увагу, що підтримується крапковий синтаксис типу файлів cuda.cpp.)

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

Крім фрагментів, наданих vim-snippets, користувач може визначити власні фрагменти. Моя рекомендація полягає в тому, щоб помістити їх у каталог ~/.vim/my-snippets/Ultisnipsтаким чином, Ultisnips знайде їх без додаткової конфігурації, і їх легко підтримувати в сховищі dotfile.

Для розширення фрагментів Ultisnips надає змінну, g:UltiSnipsExpandTrigger яка визначає відображення, яке спричинить розширення (я вибрав, **що для мене досить зручно). Зауважте, що інтеграція повинна бути можливою, але я її не перевіряв сам).

Для користувачів електроенергії Ultisnips також пропонує деякі функції, щоб налаштувати поведінку розширення або викликати його по-іншому. Побачити:h UltiSnips-trigger-functions


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

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


Чи знаєте ви, як зробити так, щоб він не розширювався при запуску, якщо йому не передує пробіл АБО a >(як у закриваючому дужці HTML. Факт, який він не знає, його в кінці тегу дратує, тому що якщо я включу Опція iтоді робить його таким чином, він розширює його, навіть якщо це в середині слова, що не є корисним
Tallboy

13

Я використовую оригінальний SnipMate з моменту початку використання Vim.

  • Він не має зовнішніх залежностей.
  • Тут використовується дуже простий синтаксис.
  • Це дуже просто налаштувати.
  • Від неї покинуто з 2009 року.

Мені нема чого скаржитися.


16
Це вперше я бачив, як хтось згадував про залишення як особливість. : D
муру

6
Занедбаний проект - це стабільний проект. Вам не потрібно турбуватися про застарілість вашого локального примірника або про те, що оновлення порушує ваш робочий процес зі зміною API. Якщо він задовольнив ваші потреби, коли ви встановили його, він буде робити це назавжди. Якщо не зміниться ваші потреби. Стабільність - це особливість №1, яку я шукаю в будь-якому інструменті.
romainl

3
"Якщо він задовольнив ваші потреби, коли ви встановили його, він буде робити це назавжди. Якщо тільки ваші потреби не зміниться." Або ви знайдете помилку, в який момент вам потрібно виправити її самостійно, знайти когось іншого, щоб виправити її, або шукати альтернативу; той, який не був покинутий, можливо.

1
Дякуємо за вашу відповідь @romainl! У мене є одне запитання: Ви сказали, що плагін покинутий, але readme перенаправляє на нову версію, яка здається досить активною, і, здається, кілька виправлень виправляють деякі речі, чи не краще використовувати новий?
statox

1
У UltraSnips є декілька помилок та помилок у документації, які роблять не менш приємним вступний досвід. Після останнього запуску я вирішив перевірити SnipMate і можу зрозуміти аргумент @ romainl щодо стабільності.
чб

7

Ось список функцій із mu-template . Discl.: Я його підтримка.

  • Файли шаблонів можна розширити:
    • автоматично при відкритті нового буфера (якщо його не вимкнено з .vimrc),
    • явно через меню або командний рядок,
    • з INSERT-режиму у фрагменті;
    • з режиму VISUAL для оточення виділення фрагментом - оточуючі можуть застосовуватися до різних зон фрагменту (наприклад, код або зони стану в whileоператорі управління);
  • Усі фрагменти визначені у власному файлі шаблонів - усі інші двигуни фрагментів використовують один файл у форматі файлів і вкладають у нього всі фрагменти;
  • Файли шаблонів можуть бути замінені користувачем або в контексті конкретного проекту;
  • Файли-фрагменти, характерні для типу файлів, можуть бути визначені для INSERT-режиму (вони можуть бути успадковані, наприклад, C-фрагменти можуть використовуватися з C ++, Java тощо), список відповідних фрагментів буде представлений з підказкою для кожного фрагмента;
  • Обчислювані вирази VimL можна вставити;
  • Інструкції VimL можуть бути виконані під час розширення - я використовую їх для автоматичного додавання відсутніх включень або імпорту заяв;
  • Файли шаблонів можуть включати інші файли шаблонів у вигляді функції (параметри навіть підтримуються) - AFAIK, дуже мало фрагментів двигунів реалізують це, вони навіть не в змозі підтримувати фрагменти псевдоніму, що тривіально реалізувати завдяки ця особливість;
  • Повністю інтегрований із моєю системою заповнення;
  • Підтримує повторне відступ (за бажанням) і відступ Python;
  • Добре справляється із складанням vim;
  • I18n дружній;
  • Коли кілька фрагментів збігаються, з'являється розширене меню завершення (воно надихнулося спливаючим меню YouCompleteMe);
  • Налаштування стилю застосовуються автоматично (як ви вважаєте за краще дужки? if (...) {\n}? if (...)\n{\n}Що - то ще?), І, звичайно, вони можуть бути точно налаштовані в залежності від поточного проекту або поточного типу файлів, або навіть обидва;
  • Плагін - 100% VimL. Python може бути використаний з файлу шаблону.
  • mu-шаблон залежить від двох плагінів бібліотеки (lh-vim-lib та lh-dev) та від моєї системи заповнювачів (lh-дужки) - саме тому я рекомендую встановлювати його за допомогою VAM або VimFlavor, оскільки я надаю файли, які декларують залежності;
  • Ліцензія сумісна з генерацією коду - це означає, що, хоча код му-шаблону знаходиться під GPLv3, фрагментів немає, ви можете використовувати їх у фірмовому коді: хоча деякі фрагменти знаходяться під ліцензією Boost Software License;

  • Розширення відбувається після завантаження будь-яких місцевих присутніх vimrcs - для того, щоб встановити змінні, характерні для проекту, до того, як буде виконано розширення.

  • Завдяки плагіну Тома Лінка StakeHolders, µTemplate має прив’язані заповнювачі (зміна одного названого заповнювача місць змінює інші заповнювачі заповнення з тим самим іменем). Не встановлення зацікавлених сторін не завадить використовувати µTemplate.

Якщо чесно сказати, синтаксис шаблонів трохи громіздкий, а система заповнювачів належить до першого покоління заповнювачів - mu-template є одним із найстаріших двигунів шаблонів / фрагментів для Vim.

Однак той факт, що дозволяє фрагментам включати інші фрагменти (умовно та з параметрами), які можуть бути або не можуть бути замінені, є досить важливим. Типові програми є

  • шаблон файлу C ++

    1. який включає заголовок файлу (зазвичай тонко налаштований по-різному для кожного проекту, щоб включити правильне повідомлення про авторські права)
    2. потім завантажте шаблон, що найкраще підходить для поточного типу файлу (.h, .cpp або тестовий файл одиниці)
      • у випадку файлів заголовка будуть включені захисні засоби проти повторного включення - спосіб їх обчислення може бути відмінено (знову ж таки, щоб дотримуватися проектної політики)
      • у випадку .cpp файлів, відповідний .h файл автоматично включається, якщо його знайдено
  • У мене є фрагмент / майстер загального класу в lh-cpp. І кілька видів спеціалізованих класів, які використовують цей загальний шаблон класу, але з різними параметрами.


Дякую за вашу відповідь! У мене виникає питання: ви сказали, у All snippets are defined in their own template-file -- all other snippet engines use one file per filetype and put all snippets in it чому перевага цієї архітектури порівняно зі звичайною (тобто один файл за типом файлу)?
statox

@statox Я б сказав, це проблема технічного обслуговування фрагментів. Деякі фрагменти надмірно складні. Погляньте, наприклад, на lh-cpp internals/class-skeleton. Я краще не змішав би його з фрагментами оператора control. Але я мушу визнати, що поєднання всіх контрольних заяв разом не було б таким проблематичним. Більше того, завдяки такому підходу я можу дуже легко змінити свої фрагменти, оновити їх на льоту, використовувати їх як функції тощо
Люк Ермітт

Дійсно, коли я бачу ваше посилання, я можу зрозуміти, чому деякі фрагменти краще жити у власних файлах. Дякуємо за пояснення
statox

1
@statox Насправді багато фрагментів у мене, як правило, складні: вони виявляють, виводять і намагаються зробити якомога більше розумних речей. Більшу частину часу я переміщую код до автоматично завантажених функцій, але іноді має сенс використовувати кілька фрагментів, які дзвонять один одному (і виступають як точки варіації, які можна налаштувати на потреби проекту -> заяви про авторські права, ...)
Люк Ермітта

4

SnipMate та UltiSnips - два найпопулярніших фрагменти двигуна Vim. Обидва надихаються з фрагмента синтаксису TextMate. UltiSnips може запускати всі фрагменти SnipMate, але також мати додатковий синтаксис, щоб зробити його більш потужним.

Хорошим правилом є те, що якщо ваш Vim має підтримку python, тоді використовуйте UltiSnips. Якщо ні, то використовуйте SnipMate.

У моєму випадку .vimrcя завантажую (використовуючи Plug) або плагін, залежно від наявності python.

if (has('python') || has('python3'))
    Plug 'SirVer/ultisnips'
else
    Plug 'garbas/vim-snipmate'
    Plug 'MarcWeber/vim-addon-mw-utils' "required for snipmate
    Plug 'tomtom/tlib_vim' "required for snipmate
endif

UltiSnips також може запускати коди python у своєму фрагменті, що дозволяє йому робити кілька цікавих хитрощів. Це один з моїх улюблених фрагментів, який малює поле навколо тексту (з Як я можу робити конспекти на лекціях з математики за допомогою LaTeX та Vim | Gilles Castel )

snippet box2 "Box"
`!p snip.rv = '┌' + '─' * (len(t[1]) + 2) + '┐'`
│ $1 │
`!p snip.rv = '└' + '─' * (len(t[1]) + 2) + '┘'`
$0
endsnippet

За допомогою цього фрагмента я можу вивести щось подібне:

┌─────────────────────┐
│ this is a cool box! │
└─────────────────────┘
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.