Apa perbedaan antara plugin potongan vim?


25

Ada banyak plugin snippet untuk vim: ultisnips , snipmate , xptemplate , neosnippet , dan banyak lagi.

Mereka semua memiliki pro dan kontra dan lebih atau kurang ketergantungan. Sejauh ini saya telah menggunakan ultisnips tetapi tidak pernah benar-benar puas dengannya.

Karena kami memiliki pertanyaan yang sangat menarik dan lengkap tentang pengelola plugin, saya pikir akan sangat berguna untuk memiliki jenis penjelasan yang sama tentang plugin snippet.

Ada daftar di sini yang bisa menjadi awal yang baik tetapi beberapa jawaban yang lengkap, jelas dan tepat karena komunitas kami dapat menulis akan sangat berguna.


1
Anda juga memiliki matriks ini disediakan di wiki Marc Weber: vim-wiki.mawercer.de/wiki/topic/…
Luc Hermitte

2
IMHO ini cukup umum, mungkin jika Anda menguraikan "tidak pernah benar-benar puas dengan itu"? Saya menggunakan "neosnippet.vim" milik Shougo.
VanLaser

Anda harus memperbarui wiki dengan informasi dari sini. Terima kasih.
Christian Brabandt

@ChristianBrabandt: Yap segera setelah saya punya waktu (dalam beberapa hari ke depan) saya akan memperbaruinya.
statox

Jawaban:


22

Saya telah menggunakan ultisnips selama beberapa minggu sekarang.

Saya pikir kelebihan utama dari plugin ini adalah sebagai berikut:

  • Ini cukup cepat bahkan dengan banyak cuplikan tersedia.
  • Sintaks dasar untuk mendefinisikan snippet baru mudah dipahami, sehingga mudah untuk membuat snippet baru dengan melakukan apa yang ingin Anda lakukan. (Untuk cuplikan yang lebih kompleks, beberapa pekerjaan tambahan mungkin diperlukan.)
  • Ini bekerja sangat baik di luar kotak; konfigurasi dasar memungkinkan Anda menggunakan snippet dengan sangat cepat.
  • Ini benar-benar dapat dikonfigurasi. Bahkan jika konfigurasi dasar berfungsi dengan baik, jika Anda adalah pengguna yang kuat, Anda dapat menyetelnya dengan sangat halus.

Pertama-tama ultisnips adalah mesin snippet yang berarti bahwa plugin menyediakan fitur untuk menggunakan snippet tetapi tidak menyediakan snippet itu sendiri. Untuk mendapatkan potongan, penulis merekomendasikan potongan-potongan vim .

Setelah kedua plugin terpasang, Anda dapat menggunakan cuplikan.

Definisi potongan disimpan dalam file bernama pola berikut: ft.snippets,, ft_*.snippetsatau ft/*, di mana ft'filetype' dari dokumen saat ini dan *wildcard seperti shell yang cocok dengan sembarang string termasuk string kosong. (Perhatikan bahwa sintaks tipe file bertitik suka cuda.cppdidukung.)

Dengan cara ini cuplikan khusus untuk tipe file diperluas hanya ketika tipe file buffer diatur. Tipe file khusus alltersedia untuk membuat cuplikan diperluas pada semua buffer.

Selain snippet yang disediakan oleh vim-snippet, pengguna dapat menentukan snippetnya sendiri. Rekomendasi saya adalah untuk menempatkan mereka di direktori ~/.vim/my-snippets/Ultisnipsdengan cara ini Ultisnips akan menemukannya tanpa konfigurasi tambahan dan mudah untuk mempertahankannya dalam repositori dotfile.

Untuk memperluas cuplikan, Ultisnips menyediakan variabel g:UltiSnipsExpandTrigger yang mendefinisikan pemetaan yang akan memicu ekspansi (saya memilih **mana yang cukup nyaman bagi saya). Perhatikan bahwa integrasi seharusnya dimungkinkan tetapi saya tidak mengujinya sendiri).

Untuk pengguna listrik, Ultisnips juga menyediakan beberapa fungsi untuk menyesuaikan perilaku ekspansi, atau untuk memicunya secara berbeda. Lihat:h UltiSnips-trigger-functions


Ini adalah manajer cuplikan pertama yang benar-benar saya gunakan secara luas dan saya pikir ini adalah yang baik untuk memulai dengan kesederhanaan di luar kotak dan kemungkinan untuk disetel.

Akhirnya di sini adalah daftar screencasts yang memberikan pengantar yang bagus untuk plugin:


Apakah Anda tahu cara membuatnya sehingga tidak meluas saat memicu kecuali diawali oleh spasi ATAU a >(seperti pada penutup kurung HTML. Fakta itu tidak tahu bahwa pada akhir tag itu mengganggu, karena jika saya mengaktifkan pilihan ikemudian membuatnya jadi memperluas bahkan jika itu di tengah kata yang tidak baik
Tallboy

13

Saya telah menggunakan SnipMate asli sejak saya mulai menggunakan Vim.

  • Itu tidak memiliki ketergantungan eksternal.
  • Ini menggunakan sintaks yang sangat sederhana.
  • Sangat mudah diatur.
  • Sudah ditinggalkan sejak 2009.

Saya tidak perlu mengeluh.


16
Itulah pertama kalinya saya melihat seseorang menyebut pengabaian sebagai fitur. : D
muru

6
Proyek terbengkalai adalah proyek yang stabil. Anda tidak perlu khawatir tentang instance lokal Anda ketinggalan zaman atau tentang pembaruan yang merusak alur kerja Anda dengan perubahan API. Jika itu memenuhi kebutuhan Anda ketika Anda menginstalnya, itu akan terus melakukannya selamanya. Kecuali jika kebutuhan Anda berubah. Stabilitas adalah fitur # 1 yang saya cari di alat apa pun .
romainl

3
"Jika itu memuaskan kebutuhanmu ketika kamu menginstalnya, itu akan terus melakukannya selamanya. Kecuali jika kebutuhanmu berubah." Atau Anda menemukan bug, pada titik mana Anda harus memperbaikinya sendiri, menemukan orang lain untuk memperbaikinya, atau mencari alternatif; yang belum ditinggalkan, mungkin.

1
Terima kasih atas jawaban Anda @romainl! Saya punya satu pertanyaan: Anda bilang pluginnya ditinggalkan, tetapi readme mengalihkan ke versi yang lebih baru yang tampaknya cukup aktif dan beberapa komitmen tampaknya memperbaiki beberapa hal, bukankah lebih baik menggunakan yang baru?
statox

1
Ada beberapa bug dan kesalahan dokumentasi di UltraSnips yang membuat pengalaman pengantar yang kurang menyenangkan. Setelah akhirnya menjalankannya, saya memutuskan untuk memeriksa SnipMate dan dapat memahami argumen @ romainl untuk stabilitas.
chb

7

Berikut adalah daftar fitur dari mu-template . Discl .: Saya pengelolanya.

  • File template dapat diperluas:
    • secara otomatis saat membuka buffer baru (kecuali dinonaktifkan dari .vimrc),
    • secara eksplisit melalui menu atau baris perintah,
    • dari mode INSERT dalam mode seperti potongan;
    • dari mode VISUAL untuk mengelilingi seleksi dengan snippet - sekitarnya dapat diterapkan ke zona berbeda dalam snippet (mis. kode atau zona kondisi dalam whilepernyataan kontrol);
  • Semua snippet didefinisikan dalam file template mereka sendiri - semua mesin snippet lainnya menggunakan satu file per filetype dan memasukkan semua snippet ke dalamnya;
  • File template dapat diganti oleh pengguna, atau dalam konteks proyek tertentu;
  • Cuplikan spesifik tipe file dapat didefinisikan untuk mode INSERT (mereka dapat diwarisi, mis. Cuplikan C dapat digunakan dari C ++, Java, dll.), Daftar cuplikan yang cocok akan disajikan dengan petunjuk untuk setiap cuplikan;
  • Ekspresi VimL terkomputasi dapat dimasukkan;
  • Instruksi VimL dapat dijalankan selama ekspansi - Saya menggunakannya untuk secara otomatis menambahkan pernyataan yang hilang atau mengimpor pernyataan;
  • File template dapat menyertakan file template lain dengan cara yang mirip fungsi (parameter bahkan didukung) - AFAIK, sangat sedikit mesin snippet yang mengimplementasikan ini, mereka bahkan tidak dapat mendukung alias snippet, yang sepele untuk diimplementasikan berkat fitur ini;
  • Sepenuhnya terintegrasi dengan sistem placeholder saya;
  • Mendukung indentasi ulang (jika diinginkan), dan indentasi Python;
  • Bekerja dengan baik dengan pelipatan vim;
  • Aku ramah;
  • Ketika beberapa cuplikan cocok, menu penyelesaian lanjutan muncul (telah terinspirasi oleh menu popup YouCompleteMe);
  • Pilihan gaya yang diterapkan secara otomatis (bagaimana Anda lebih memilih kurung Anda? if (...) {\n}? if (...)\n{\n}Sesuatu yang lain??), Dan tentu saja, mereka dapat diperbaiki tergantung pada proyek ini, atau filetype saat ini, atau bahkan keduanya;
  • Plugin ini 100% VimL. Python dapat digunakan dari file templat.
  • mu-template tergantung pada dua plugin perpustakaan (lh-vim-lib dan lh-dev), dan pada sistem placeholder saya (lh-kurung) - itu sebabnya saya merekomendasikan untuk menginstalnya dengan VAM atau VimFlavor karena saya menyediakan file yang menyatakan ketergantungan;
  • Lisensi tersebut kompatibel dengan pembuatan kode - itu berarti bahwa sementara kode template-mu di bawah GPLv3, snippet tidak, Anda dapat menggunakannya dalam kode berpemilik: beberapa snippet berada di bawah Lisensi Perangkat Lunak Peningkatan;

  • Ekspansi terjadi setelah setiap vimrcs lokal yang ada dimuat - untuk mengatur variabel spesifik proyek sebelum ekspansi dilakukan.

  • Berkat plugin StakeHolders Tom Link, µTemplate telah mengikat placeholder (memodifikasi satu placeholder yang dimodifikasi memodifikasi placeholder lain dengan nama yang sama). Tidak menginstal Stakeholder tidak akan mencegah Anda menggunakan µTemplate.

Sejujurnya, sintaks template sedikit rumit, dan sistem placeholder menjadi milik generasi placeholder pertama - mu-template adalah salah satu mesin template / snippet tertua untuk Vim.

Namun, fakta yang mengizinkan snippet untuk memasukkan snippet lain (secara kondisional, dan dengan parameter) yang mungkin atau mungkin tidak ditimpa cukup penting. Aplikasi tipikal adalah

  • templat file C ++

    1. yang termasuk header file (biasanya disetel berbeda untuk setiap proyek untuk memasukkan pemberitahuan hak cipta yang tepat)
    2. kemudian muat templat yang paling cocok untuk jenis file saat ini (.h, .cpp, atau file unit test)
      • dalam file header-file, penjaga anti-reinklusi akan dimasukkan - cara mereka dikomputasi dapat diganti (lagi untuk mengikuti kebijakan proyek)
      • dalam case file .cpp, file .h yang cocok secara otomatis disertakan jika ditemukan
  • Saya memiliki cuplikan kelas umum / penyihir di lh-cpp. Dan beberapa jenis kelas khusus yang menggunakan templat kelas umum ini, tetapi dengan parameter yang berbeda.


Terima kasih atas jawaban anda! Saya punya pertanyaan: Anda mengatakan All snippets are defined in their own template-file -- all other snippet engines use one file per filetype and put all snippets in it apa kelebihan arsitektur ini dibandingkan dengan yang biasa (yaitu satu file dengan tipe file)?
statox

@statox Saya akan mengatakan, ini adalah masalah pemeliharaan snippet. Beberapa cuplikan terlalu rumit. Lihatlah lh-cpp internals/class-skeletonmisalnya. Saya lebih suka tidak menyatu dengan cuplikan pernyataan kontrol. Tetapi saya harus mengakui, bahwa memiliki semua pernyataan kontrol bersama tidak akan menjadi masalah. Selain itu, berkat pendekatan ini, saya dapat dengan mudah menimpa cuplikan saya, memperbaruinya dengan cepat, menggunakannya sebagai fungsi, dll.
Luc Hermitte

Memang ketika saya melihat tautan Anda, saya dapat memahami mengapa beberapa cuplikan lebih baik hidup di file mereka sendiri. Terima kasih atas klarifikasi Anda.
statox

1
@statox Sebenarnya, banyak cuplikan saya cenderung kompleks: mereka mendeteksi, menyimpulkan, dan mencoba melakukan sebanyak mungkin hal cerdas. Sebagian besar waktu saya memindahkan kode ke fungsi autoloaded, tetapi kadang-kadang, lebih masuk akal untuk menggunakan beberapa snippet yang memanggil satu sama lain (dan bertindak sebagai titik variasi yang dapat disesuaikan untuk kebutuhan proyek -> pernyataan hak cipta, ...)
Luc Hermitte

4

SnipMate dan UltiSnips adalah dua mesin cuplikan paling populer untuk Vim. Keduanya terinspirasi dari sintaks potongan TextMate. UltiSnips dapat menjalankan semua snipMate snippet tetapi juga memiliki sintaks tambahan untuk membuatnya lebih kuat.

Aturan praktis yang baik adalah bahwa jika Vim Anda memiliki dukungan python, maka gunakan UltiSnips. Jika tidak, gunakan SnipMate.

Di saya .vimrc, saya memuat (menggunakan Plug) baik plugin tergantung pada ketersediaan 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 juga dapat menjalankan kode python di snippet-nya, memungkinkannya melakukan beberapa trik keren. Ini adalah salah satu cuplikan favorit saya yang menggambar kotak di sekitar teks (dari Bagaimana saya dapat membuat catatan dalam kuliah matematika menggunakan LaTeX dan Vim | Gilles Castel )

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

Dengan cuplikan ini, saya dapat menampilkan sesuatu seperti ini:

┌─────────────────────┐
│ this is a cool box! │
└─────────────────────┘
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.