Как я могу использовать несколько триггеров для одного фрагмента?

11

Я сделал фрагмент, который я хочу дать другим триггерам, поэтому вместо того, чтобы сказать, triggerя также хочу вызвать его с помощью myothertrigger:

snippet trigger "just an example" 
my text ...
endsnippet

Есть ли простой способ сделать это вместо копирования фрагмента?

Изменить: Чтобы было ясно, я использую UltiSnips , но если есть лучший плагин, я мог бы изучить это.

Agold
источник
2
Ответ будет зависеть от движка сниппета, который вы используете. С помощью mu-template вы можете включить один фрагмент из другого, скопировать файл фрагмента под другим именем или просто создать символическую ссылку. Я не уверен, что другие двигатели могли бы позволить это. Может быть, когда-нибудь они поддержат включение фрагментов из фрагментов «вызывающего». Возможно, вы могли бы определить ядро ​​своего фрагмента в функции python или viml, и ваши фрагменты вызывали бы ту же функцию?
Люк Эрмитт
3
Вопрос помечен как plugin-ultisnips, так что я бы предположил, что OP использует ultisnips.
EvergreenTree
Моя ошибка ^^ '(µTemplate не лучше, просто сильно отличается, старше и больше соответствует моим потребностям (я поддерживаю это): у меня есть корневые фрагменты, которые ведут себя как функции, которые я могу вызывать с различными вариантами для создания разные, но очень близкие вещи. Например, в C ++ у меня есть фрагменты для базового класса, класса значений, класса исключений ... все они зависят от одного и того же набора класса-фрагмента + функции-фрагмента + ... Но, как я уже сказал, синтаксис совершенно другой, а функция заполнителя менее эргономична, чем та, к которой вы привыкли. Делать то, что вы ищете, было бы легко, но не обязательно, что стоит
переходить
2
Если вы переключитесь на neosnippetплагин Shougo , его синтаксис имеет aliasключевое слово для этой цели.
VanLaser

Ответы:

8

В настоящее время нет способа сделать это в UltiSnips. Для этого на Github есть открытый запрос-функция . Лично я хотел бы использовать псевдоним для триггеров, как указано здесь .

Будем надеяться, что SirVer (сопровождающий UltiSnips) тоже так подумает и включит его в будущем :)

cbaumhardt
источник
5

Хотя нет определенного синтаксиса для псевдонимов, вы можете достичь того же эффекта, используя post_jump:

# c.snippets
global !p
def expand(snip):
    if snip.tabstop != 1:
        return
    vim.eval('feedkeys("\<C-R>=UltiSnips#ExpandSnippet()\<CR>")')
endglobal

snippet incstdlib "#include <stdlib.h>" !b
#include <stdlib.h> /* exit(), malloc(), free() */
$0
endsnippet

post_jump "expand(snip)"
snippet incexit "#include <stdlib.h>" !b
incstdlib$1
endsnippet

В этом файле сниппетов триггер incexitявляется «псевдонимом» триггера incstdlib. В действительности incexitрасширяется до incstdlibи expand(snip)вызывается, когда UltiSnips переходит на вкладку $1. expand(snip)Просто выполняет функцию VimScript , UltiSnips#ExpandSnippetкоторая будет расширяться incstdlibв это окончательном развернутом виде #include <stdlib.h>.

Другой вариант - вместо этого использовать поддержку регулярных выражений UltiSnips:

snippet "inc(true|false|bool)" "#include <stdbool.h>" r
#include <stdbool.h> /* true, false */
endsnippet

Здесь у вас будет три триггера inctrue, incfalseи incboolони практически одинаковы. Единственным недостатком является то, что плагины автозаполнения, такие как YouCompleteMe, не будут автозаполнять их.

ecerulm
источник