Jaka jest różnica między wtyczkami vim snippets?


25

Istnieje wiele wtyczek dla vima: ultisnips , snipmate , xptemplate , neosnippet i wiele innych.

Wszystkie mają zalety i wady oraz mniej lub więcej zależności. Do tej pory korzystałem z ultisnips, ale nigdy nie byłem z tego całkowicie zadowolony.

Ponieważ mamy bardzo interesujące i kompletne pytanie dotyczące menedżerów wtyczek , myślę, że przydatne byłoby posiadanie tego samego rodzaju wyjaśnień na temat wtyczek fragmentów.

Jest tutaj lista , która może być dobrym początkiem, ale niektóre kompletne, jasne i precyzyjne odpowiedzi, jak nasza społeczność może pisać, byłyby bardzo przydatne.


1
Tę matrycę masz także na wiki Marc'a Webera: vim-wiki.mawercer.de/wiki/topic/…
Luc Hermitte

2
IMHO jest to dość ogólne, być może jeśli opracujesz „nigdy nie byłeś z niego całkowicie zadowolony”? Używam „neosnippet.vim” Shougo.
VanLaser

powinieneś zaktualizować wiki o informacje tutaj. dzięki.
Christian Brabandt,

@ChristianBrabandt: Tak, jak tylko będę miał trochę czasu (w ciągu kilku najbliższych dni) zaktualizuję go.
statox

Odpowiedzi:


22

Używam ultisnips od kilku tygodni.

Myślę, że główne zalety tej wtyczki są następujące:

  • Jest dość szybki, nawet przy dużej liczbie dostępnych fragmentów.
  • Podstawowa składnia służąca do definiowania nowego fragmentu kodu jest łatwa do zrozumienia, dlatego łatwo jest szybko utworzyć nowy fragment kodu, robiąc to, co chcesz. (W przypadku bardziej złożonych fragmentów może być wymagana dodatkowa praca).
  • Działa bardzo dobrze po wyjęciu z pudełka; podstawowa konfiguracja pozwala bardzo szybko korzystać z urywków.
  • To jest naprawdę konfigurowalne. Nawet jeśli podstawowa konfiguracja działa dobrze, jeśli jesteś zaawansowanym użytkownikiem, możesz naprawdę ją dostroić.

Przede wszystkim ultisnips to silnik fragmentów, co oznacza, że ​​wtyczka zapewnia funkcje do używania fragmentów, ale nie zapewnia samych fragmentów. Aby uzyskać fragmenty, autor zaleca vim-snippets .

Po zainstalowaniu obu wtyczek będziesz mógł używać swoich fragmentów.

Fragmenty definicje są przechowywane w plikach o nazwach następujących wzorów: ft.snippets, ft_*.snippets, lub ft/*, gdzie ftjest «filetype» bieżącego dokumentu i *jest shell-jak wieloznacznym dopasowywania dowolny ciąg w tym pustym ciągiem. (Należy pamiętać, że cuda.cppobsługiwana jest składnia typu kropkowanego typu pliku ).

W ten sposób fragmenty specyficzne dla typu pliku są rozwijane tylko wtedy, gdy ustawiony jest typ pliku bufora. Dostępny jest specjalny typ pliku alldo tworzenia urywków rozszerzonych na wszystkie bufory.

Oprócz urywków dostarczanych przez vim-snippets użytkownik może zdefiniować własne urywki. Zalecam umieszczenie ich w katalogu w ~/.vim/my-snippets/Ultisnipsten sposób, aby Ultisnips je znalazł bez dodatkowej konfiguracji i łatwo jest je przechowywać w repozytorium plików kropkowych.

Aby rozwinąć fragmenty, Ultisnips udostępnia zmienną, g:UltiSnipsExpandTrigger która definiuje mapowanie, które wyzwoli rozszerzenie (wybrałem **to, co jest dla mnie całkiem wygodne). Pamiętaj, że integracja powinna być możliwa, ale nie przetestowałem jej sam).

Dla zaawansowanych użytkowników, Ultisnips udostępnia również niektóre funkcje, aby dostosować zachowanie rozszerzenia lub uruchomić go inaczej. Widzieć:h UltiSnips-trigger-functions


Jest to pierwszy menedżer urywków, którego naprawdę szeroko używałem i myślę, że jest to dobry na początek ze względu na jego prostotę po wyjęciu z pudełka i możliwość dostrojenia.

Na koniec znajduje się lista screencastów, które stanowią dobre wprowadzenie do wtyczki:


Czy wiesz, jak to zrobić, aby nie rozszerzał się podczas wyzwalania, chyba że poprzedza go spacja LUB a >(jak w nawiasie zamykającym HTML. Fakt, że nie wie, że na końcu znacznika jest denerwujący, ponieważ jeśli włączę opcja ipowoduje, że rozszerza go, nawet jeśli jest w środku słowa, które nie jest dobre
Tallboy

13

Używam oryginalnego SnipMate, odkąd zacząłem używać Vima.

  • Nie ma zewnętrznych zależności.
  • Używa bardzo prostej składni.
  • Jest bardzo łatwy w konfiguracji.
  • Został porzucony od 2009 roku.

Nie mam na co narzekać.


16
Po raz pierwszy widziałem, jak ktoś wspomniał o porzuceniu jako funkcję. : D
mur

6
Opuszczony projekt jest projektem stabilnym. Nie musisz się martwić o to, że lokalna instancja jest nieaktualna lub że aktualizacja zakłóca przepływ pracy wraz ze zmianą interfejsu API. Jeśli zaspokoił twoje potrzeby po zainstalowaniu, będzie to robił wiecznie. Chyba że twoje potrzeby się zmienią. Stabilność jest funkcją nr 1, której szukam w każdym narzędziu.
romainl

3
„Jeśli zaspokoił twoje potrzeby po zainstalowaniu, będzie to robić wiecznie. Chyba że twoje potrzeby się zmienią”. Lub znajdziesz błąd, w którym to momencie musisz go naprawić samodzielnie, znaleźć kogoś innego, aby go naprawić lub poszukać alternatywy; być może ten, który nie został porzucony.

1
Dzięki za odpowiedź @romainl! Mam jedno pytanie: Powiedziałeś, że wtyczka została porzucona, ale readme przekierowuje do nowszej wersji, która wydaje się dość aktywna, a kilka zatwierdzeń wydaje się naprawiać niektóre rzeczy, czy nie lepiej jest użyć nowej?
statox

1
Istnieje kilka błędów i błędów w dokumentacji w UltraSnips, które sprawiają, że wprowadzenie jest niezbyt przyjemne. Po jego uruchomieniu postanowiłem sprawdzić SnipMate i mogę zrozumieć argument @ romainl na temat stabilności.
chb

7

Oto lista funkcji z mu-template . Discl .: Jestem jego opiekunem.

  • Pliki szablonów można rozwijać:
    • automatycznie przy otwieraniu nowego bufora (chyba że dezaktywowany w .vimrc),
    • wyraźnie za pośrednictwem menu lub wiersza poleceń,
    • z trybu INSERT w sposób podobny do fragmentu;
    • z trybu VISUAL, aby otaczać zaznaczenie fragmentem - otoczenie można zastosować do różnych stref we fragmencie (np. strefy kodu lub stref warunkowych w whileinstrukcji sterującej);
  • Wszystkie fragmenty są zdefiniowane we własnym pliku szablonu - wszystkie inne silniki fragmentów używają jednego pliku dla każdego typu pliku i umieszczają w nim wszystkie fragmenty;
  • Pliki szablonów mogą zostać zastąpione przez użytkownika lub w kontekście konkretnego projektu;
  • Fragmenty kodu specyficzne dla typu pliku można zdefiniować dla trybu INSERT (można je dziedziczyć, np. Fragmenty kodu C można używać z C ++, Java itp.), Lista pasujących fragmentów kodu zostanie wyświetlona z podpowiedzią do każdego fragmentu;
  • Można wstawiać obliczone wyrażenia VimL;
  • Instrukcje VimL mogą być wykonywane podczas ekspansji - używam go do automatycznego dodawania brakujących instrukcji dołączania lub importowania;
  • Pliki szablonów mogą zawierać inne pliki szablonów w sposób podobny do funkcji (parametry są nawet obsługiwane) - AFAIK, implementuje to bardzo niewiele silników urywków, nie są one nawet w stanie obsługiwać aliasów urywków, co jest łatwe do wdrożenia dzięki ta cecha ;
  • W pełni zintegrowany z moim systemem zastępczym;
  • Obsługuje ponowne wcięcie (w razie potrzeby) i wcięcie w języku Python;
  • Działa dobrze przy składaniu vim;
  • Przyjazny dla mnie;
  • Gdy kilka fragmentów pasuje, pojawia się menu zaawansowanego ukończenia (zostało zainspirowane wyskakującym menu YouCompleteMe);
  • Opcje stylów są stosowane automatycznie (jak wolisz swoje wsporniki? if (...) {\n}? if (...)\n{\n}Coś innego?), No i oczywiście, mogą być dostrajane w zależności od aktualnego projektu, lub bieżącego typu pliku, albo nawet obu;
  • Wtyczka ma 100% VimL. Można jednak użyć Pythona z pliku szablonu.
  • mu-template zależy od dwóch wtyczek bibliotecznych (lh-vim-lib i lh-dev) oraz od mojego systemu zastępczego (lh-brackets) - dlatego polecam zainstalować go z VAM lub VimFlavor, ponieważ dostarczam pliki, które deklarują zależności;
  • Licencja jest kompatybilna z generowaniem kodu - oznacza to, że chociaż kod mu-template jest objęty GPLv3, fragmenty nie są, możesz używać ich w kodzie zastrzeżonym: niektóre fragmenty są jednak objęte licencją Boost Software License;

  • Rozwinięcie następuje po załadowaniu wszelkich lokalnych vimrcs - w celu ustawienia zmiennych specyficznych dla projektu przed wykonaniem rozwinięcia.

  • Dzięki wtyczce StakeHolders Toma Link, µTemplate ma powiązane symbole zastępcze (modyfikowanie jednego nazwanego symbolu zastępczego modyfikuje inne symbole zastępcze o tej samej nazwie). Brak instalacji Interesariuszy nie uniemożliwi korzystania z µTemplate.

Szczerze mówiąc, składnia szablonów jest nieco uciążliwa, a system symboli zastępczych należy do pierwszej generacji symboli zastępczych - mu-template jest jednym z najstarszych mechanizmów Vim'a dla szablonu / fragmentów kodu.

Jednak fakt, że pozwala fragmentom zawierać inne fragmenty (warunkowo i z parametrami), które mogą zostać zastąpione, jest dość ważny. Typowe zastosowania to

  • szablon pliku C ++

    1. który zawiera nagłówek pliku (zwykle dostosowywany inaczej dla każdego projektu w celu uwzględnienia właściwej informacji o prawach autorskich)
    2. następnie załaduj szablon najlepiej pasujący do bieżącego typu pliku (.h, .cpp lub plik testu jednostkowego)
      • w przypadku pliku nagłówkowego uwzględnione zostaną zabezpieczenia przeciw ponownemu włączeniu - sposób ich obliczania może zostać nadpisany (ponownie w celu przestrzegania zasad projektu)
      • w przypadku plików .cpp pasujący plik .h jest automatycznie dołączany, jeśli zostanie znaleziony
  • Mam ogólny fragment kodu / kreatora w lh-cpp. I kilka wyspecjalizowanych rodzajów klas, które korzystają z tego wspólnego szablonu klas, ale z różnymi parametrami.


Dzięki za odpowiedź! Mam pytanie: powiedziałeś, All snippets are defined in their own template-file -- all other snippet engines use one file per filetype and put all snippets in it jakie są zalety tej architektury w porównaniu do zwykłej (tj. Jeden plik według rodzaju pliku)?
statox

@statox Powiedziałbym, że jest to problem z obsługą fragmentów. Niektóre fragmenty są nadmiernie złożone. Spójrz na internals/class-skeletonprzykład na lh-cpp . Wolałbym, żeby nie mieszał się z fragmentami instrukcji sterujących. Ale muszę przyznać, że zebranie wszystkich oświadczeń kontrolnych razem nie byłoby tak problematyczne. Co więcej, dzięki takiemu podejściu mogę bardzo łatwo zastąpić moje fragmenty, aktualizować je w locie, używać ich jako funkcji itp.
Luc Hermitte

Rzeczywiście, kiedy widzę twój link, rozumiem, dlaczego niektóre fragmenty lepiej żyją we własnych plikach. Dziękuję za wyjaśnienia.
statox

1
@statox W rzeczywistości wiele fragmentów, które mam tendencję do bycia złożonymi: wykrywają, dedukują i próbują robić jak najwięcej inteligentnych rzeczy, jak to możliwe. Przez większość czasu przenoszę kod na funkcje ładowane automatycznie, ale czasem bardziej sensowne jest użycie kilku fragmentów, które się nawzajem wywołują (i działają jako punkty wariacyjne, które można dostosować do potrzeb projektu -> oświadczenia o prawach autorskich, ...)
Luc Hermitte

4

SnipMate i UltiSnips są dwoma najpopularniejszymi silnikami urywków dla Vima. Oba są inspirowane składnią fragmentu TextMate. UltiSnips może uruchamiać wszystkie fragmenty SnipMate, ale ma także dodatkową składnię, aby był bardziej wydajny.

Dobrą zasadą jest to, że jeśli twój Vim ma obsługę Pythona, użyj UltiSnips. Jeśli nie, użyj SnipMate.

W mojej aplikacji .vimrcładuję (przy użyciu wtyczki) dowolną wtyczkę w zależności od dostępności języka 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 może także uruchamiać kody python we fragmencie, co pozwala mu robić fajne sztuczki. To jeden z moich ulubionych fragmentów, który rysuje ramkę wokół tekstu (od Jak mogę robić notatki z wykładów matematycznych przy użyciu LaTeX i Vim | Gilles Castel )

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

Za pomocą tego fragmentu mogę wypisać coś takiego:

┌─────────────────────┐
│ this is a cool box! │
└─────────────────────┘
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.