Jak mogę użyć kilku wyzwalaczy dla tego samego fragmentu?


11

Utworzyłem fragment kodu, który chcę dać innym wyzwalaczom, więc zamiast powiedzieć, triggerże chcę go również uruchomić myothertrigger:

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

Czy istnieje prosty sposób na zrobienie tego zamiast kopiowania fragmentu?

Edycja: Żeby było jasne, używam UltiSnips , ale jeśli jest lepsza wtyczka, mógłbym to sprawdzić.


2
Odpowiedź zależy od używanego silnika fragmentu. Za pomocą mu-template możesz dołączyć jeden fragment kodu do drugiego, skopiować plik fragmentu pod inną nazwą lub po prostu utworzyć symboliczne łącze. Nie jestem pewien, czy inne silniki na to pozwolą. Może być, jeśli któregoś dnia przybędą, by wspierać włączenie fragmentu z fragmentów „dzwoniącego”. Być może mógłbyś zdefiniować rdzeń swojego fragmentu kodu w funkcji python lub viml i sprawić, by fragmenty wywoływały tę samą funkcję?
Luc Hermitte

3
Pytanie jest oznaczone jako plugin-ultisnips, więc zakładam, że OP używa ultisnips.
EvergreenTree

Mój błąd ^^ '(µTemplate nie jest lepszy, po prostu bardzo inny, starszy i bardziej dostosowany do moich potrzeb (utrzymuję go): Mam fragmenty root, które zachowują się jak funkcje, które mogę wywoływać z różnymi opcjami tworzenia różne, ale bardzo bliskie rzeczy. np. w C ++ Mam fragmenty dla klasy podstawowej, klasy wartości, klasy wyjątku ... które wszystkie zależą od tego samego zestawu fragmentu klasy + fragmentu funkcji + fragmentu ... Ale jak już powiedziałem, składnia jest zupełnie inna, a funkcja zastępcza jest mniej ergonomiczna niż ta, do której jesteś przyzwyczajony. Robienie tego, czego szukasz, byłoby łatwe, ale niekonieczne warte migracji)
Luc Hermitte

2
Jeśli przełączysz się na neosnippetwtyczkę Shougo , jej składnia zawiera aliassłowo kluczowe do tego właśnie celu.
VanLaser,

Odpowiedzi:


8

Obecnie nie ma takiej możliwości w UltiSnips. Jest jednak otwarta prośba o funkcję na Github . Osobiście chciałbym również mieć funkcję aliasu dla wyzwalaczy, jak wskazano tutaj .

Miejmy nadzieję, że SirVer (opiekun UltiSnips) też tak pomyśli i uwzględni to w przyszłości :)


5

Chociaż nie ma określonej składni aliasów, ten sam efekt można osiągnąć, używając 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

W tym pliku urywków wyzwalacz incexitjest „aliasem” wyzwalacza incstdlib. W rzeczywistości incexitrozwija się incstdlibi expand(snip)jest wywoływany, gdy UltiSnips przechodzi do tabstopu $1. Po expand(snip)prostu wykonuje funkcję VimScript, UltiSnips#ExpandSnippetktóra rozwinie się incstdlibw swoją ostateczną rozszerzoną formę #include <stdlib.h>.

Inną opcją jest użycie zamiast tego obsługi wyrażeń regularnych UltiSnips:

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

Tutaj masz trzy spusty inctrue, incfalsei incboolże są tak samo skuteczne. Jedyną wadą jest to, że wtyczki autouzupełniania, takie jak YouCompleteMe, nie będą ich automatycznie uzupełniać.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.