В чем разница между плагинами vim snippets?


25

Для vim существует множество плагинов для сниппетов: ultisnips , snipmate , xptemplate , neosnippet и многие другие.

Все они имеют свои плюсы и минусы и более или менее зависимые. До сих пор я использовал ultisnips, но никогда не был полностью удовлетворен этим.

Поскольку у нас есть очень интересный и полный вопрос о менеджерах плагинов, я думаю, что было бы весьма полезно иметь такие же объяснения о плагинах сниппетов.

Существует листинг здесь , который может быть хорошее начало , но некоторые полные, ясные и precises ответов , как наше сообщество может писать было бы очень полезно.


1
У вас также есть эта матрица на вики Марка Вебера: vim-wiki.mawercer.de/wiki/topic/…
Люк Эрмит

2
ИМХО, это довольно общий характер, возможно, если вы укажете «никогда не был полностью доволен этим»? Я использую Shougo "neosnippet.vim".
VanLaser

Вы должны обновить вики с информацией отсюда. Спасибо.
Кристиан Брабандт

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

Ответы:


22

Я использую ультиснипс уже несколько недель.

Я думаю, что основные преимущества этого плагина следующие:

  • Это довольно быстро, даже с большим количеством доступных фрагментов.
  • Базовый синтаксис для определения нового фрагмента легко понять, поэтому легко быстро создать новый фрагмент, выполняя то, что вы хотите. (Для более сложных фрагментов может потребоваться дополнительная работа.)
  • Это работает очень хорошо из коробки; базовая конфигурация позволяет очень быстро использовать фрагменты.
  • Это действительно настраивается. Даже если базовая конфигурация работает хорошо, если вы опытный пользователь, вы действительно можете настроить ее очень хорошо.

Прежде всего 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то она делает это так , что расширяет его , даже если его в середине слова , которые не лучшим образом .
напольный

13

Я использую оригинальный SnipMate с тех пор, как начал использовать Vim.

  • У него нет внешних зависимостей.
  • Он использует очень простой синтаксис.
  • Это очень легко настроить.
  • Он был заброшен с 2009 года.

Мне не на что жаловаться.


16
Это первый раз, когда я вижу, что кто-то упоминает отказ как особенность. : D
Муру

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

3
«Если он удовлетворял ваши потребности, когда вы устанавливали его, он будет продолжать действовать вечно. Если ваши потребности не изменятся». Или вы обнаружите ошибку, после которой вам нужно исправить ее самостоятельно, найти кого-то еще, чтобы исправить ее, или найти альтернативу; тот, который не был оставлен, возможно.

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

1
В UltraSnips есть несколько ошибок и ошибок в документации, которые делают вводный процесс менее приятным. Наконец, запустив его, я решил проверить SnipMate и понять аргумент @ romainl о стабильности.
БКИ

7

Вот список функций из mu-шаблона . Discl .: Я его сопровождающий.

  • Шаблон-файлы могут быть расширены:
    • автоматически при открытии нового буфера (если не отключен из .vimrc),
    • явно через меню или командную строку,
    • из INSERT-режима в виде фрагмента кода;
    • из режима VISUAL, чтобы окружить выделение фрагментом - окружение может быть применено к различным зонам во фрагменте (например, зоны кода или условия в whileуправляющем утверждении);
  • Все фрагменты определены в своем собственном файле-шаблоне - все остальные движки фрагментов используют один файл на тип файла и помещают в него все фрагменты;
  • Файлы-шаблоны могут быть переопределены пользователем или в контексте конкретного проекта;
  • Для INSERT-режима могут быть определены фрагменты, специфичные для типов файлов (они могут быть унаследованы, например, фрагменты C могут использоваться из C ++, Java и т. Д.), Список подходящих фрагментов будет представлен с подсказкой для каждого фрагмента;
  • Вычисляемые выражения VimL могут быть вставлены;
  • Инструкции VimL могут быть выполнены во время расширения - я использую его для автоматического добавления пропущенных включений или операторов импорта;
  • Файлы-шаблоны могут включать в себя другие файлы-шаблоны в функциональной манере (параметры даже поддерживаются) - AFAIK, очень немногие движки сниппетов реализуют это, они даже не могут поддерживать псевдонимы сниппетов, что тривиально реализовать благодаря эта особенность ;
  • Полностью интегрирован с моей системой заполнителей;
  • Поддерживает повторный отступ (при желании) и отступ Python;
  • Хорошо работает с Vim Fold;
  • I18n дружелюбный;
  • Когда совпадают несколько фрагментов, появляется расширенное меню завершения (оно было вдохновлено всплывающим меню YouCompleteMe);
  • Настройки стиля применяются автоматически (как вы предпочитаете скобки? if (...) {\n}? if (...)\n{\n}Что - то еще?), И, конечно, они могут быть точно настроены в зависимости от текущего проекта или текущего типа файлов, или даже оба;
  • Плагин на 100% VimL. Python может быть использован из файла шаблона, хотя.
  • mu-template зависит от двух библиотечных плагинов (lh-vim-lib и lh-dev) и от моей системы заполнителей (lh-brackets) - поэтому я рекомендую установить его с VAM или VimFlavor, поскольку я предоставляю файлы, которые объявляют зависимости;
  • Лицензия совместима с генерацией кода - это означает, что, хотя код mu-шаблона находится под GPLv3, фрагменты - нет, вы можете использовать их в проприетарном коде: хотя некоторые фрагменты находятся под лицензией Boost Software License;

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

  • Благодаря плагину Tom Link 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. Я бы предпочел, чтобы он не смешивался с фрагментами контрольного оператора. Но я должен признать, что объединить все контрольные заявления не было бы так проблематично. Более того, благодаря такому подходу я могу очень легко переопределить мои фрагменты, обновить их на лету, использовать их в качестве функций и т. Д.
Люк Эрмитт

Действительно, когда я вижу вашу ссылку, я понимаю, почему некоторые фрагменты лучше жить в своих собственных файлах. Спасибо за ваши разъяснения.
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.