Sự khác biệt giữa các plugin vim snippets là gì?


25

Có một số lượng lớn các đoạn trích cho vim: ultisnips , snipmate , xptemplate , neosnippet và nhiều hơn nữa.

Họ đều có ưu và nhược điểm và ít nhiều phụ thuộc. Cho đến nay tôi đã sử dụng ultisnips nhưng chưa bao giờ hoàn toàn hài lòng với nó.

Vì chúng tôi có một câu hỏi rất thú vị và đầy đủ về các trình quản lý plugin, tôi nghĩ sẽ rất hữu ích khi có cùng một lời giải thích về các plugin đoạn trích.

Có một danh sách ở đây có thể là một khởi đầu tốt nhưng một số câu trả lời đầy đủ, rõ ràng và có trước vì cộng đồng của chúng tôi có thể viết sẽ khá hữu ích.


1
Bạn cũng có ma trận này được cung cấp trên wiki Marc Weber: vim-wiki.mawercer.de/wiki/topic/ Kẻ
Luc Hermitte

2
IMHO điều này khá chung chung, có lẽ nếu bạn xây dựng "không bao giờ hoàn toàn hài lòng với nó"? Tôi sử dụng "neosnippet.vim" của Shougo.
VanLaser

bạn nên cập nhật wiki với thông tin từ đây. cảm ơn.
Christian Brabandt

@ChristianBrabandt: Yep ngay khi tôi có thời gian (trong vài ngày tới) tôi sẽ cập nhật nó.
statox

Câu trả lời:


22

Tôi đã sử dụng ultisnips trong vài tuần nay.

Tôi nghĩ những ưu điểm chính của plugin này là:

  • Nó là khá nhanh ngay cả với một số lượng lớn các đoạn có sẵn.
  • Cú pháp cơ bản để xác định một đoạn mã mới rất dễ hiểu, do đó dễ dàng nhanh chóng tạo một đoạn mã mới làm những gì bạn muốn làm. (Đối với các đoạn phức tạp hơn, một số công việc bổ sung có thể được yêu cầu.)
  • Nó hoạt động rất tốt ra khỏi hộp; một cấu hình cơ bản cho phép bạn sử dụng đoạn trích rất nhanh.
  • Nó thực sự là cấu hình. Ngay cả khi cấu hình cơ bản hoạt động tốt, nếu bạn là người sử dụng năng lượng, bạn thực sự có thể điều chỉnh nó khá tốt.

Trước hết ultisnips là một công cụ đoạn trích, có nghĩa là plugin cung cấp các tính năng để sử dụng đoạn trích nhưng không tự cung cấp đoạn trích. Để có được đoạn trích, tác giả khuyến nghị vim-snippets .

Khi bạn đã cài đặt cả hai plugin, bạn sẽ có thể sử dụng đoạn mã của mình.

Các định nghĩa của đoạn trích được lưu trữ trong các tệp có tên các mẫu sau : ft.snippets, ft_*.snippetshoặc ft/*, trong đó ftlà 'filetype' của tài liệu hiện tại và *là ký tự đại diện giống như vỏ khớp với bất kỳ chuỗi nào kể cả chuỗi rỗng. (Lưu ý rằng cú pháp kiểu chấm chấm như cuda.cppđược hỗ trợ.)

Bằng cách này, các đoạn mã dành riêng cho một kiểu tệp chỉ được mở rộng khi kiểu tệp của bộ đệm được đặt. Một kiểu tệp đặc biệt allcó sẵn để tạo các đoạn được mở rộng trên tất cả các bộ đệm.

Ngoài các đoạn được cung cấp bởi vim-snippets, người dùng có thể xác định đoạn trích của riêng mình. Đề nghị của tôi sẽ là đặt chúng trong thư ~/.vim/my-snippets/Ultisnipsmục theo cách này Ultisnips sẽ tìm thấy chúng mà không cần cấu hình bổ sung và thật dễ dàng để duy trì chúng trong kho lưu trữ dotfile.

Để mở rộng các đoạn mã, Ultisnips cung cấp một biến g:UltiSnipsExpandTrigger xác định ánh xạ sẽ kích hoạt mở rộng (tôi đã chọn cách **này khá thuận tiện cho tôi). Lưu ý rằng có thể tích hợp nhưng tôi không tự mình kiểm tra nó).

Đối với người dùng có quyền lực, Ultisnips cũng cung cấp một số chức năng để tùy chỉnh hành vi của bản mở rộng hoặc để kích hoạt nó theo cách khác. Xem:h UltiSnips-trigger-functions


Đây là trình quản lý đoạn mã đầu tiên mà tôi thực sự sử dụng rộng rãi và tôi nghĩ rằng đây là một trình quản lý tốt để bắt đầu vì tính đơn giản của nó và khả năng điều chỉnh của nó.

Cuối cùng, đây là danh sách các screencasts giới thiệu tốt về plugin:


Bạn có biết làm thế nào để nó không mở rộng khi kích hoạt trừ khi nó đi trước khoảng trắng HOẶC a >(như trong phần đóng của HTML. Thực tế là nó không biết nó ở cuối thẻ là khó chịu, bởi vì nếu tôi bật tùy chọn isau đó nó làm cho nó mở rộng ra ngay cả khi nó ở giữa một từ không tốt.
Tallboy

12

Tôi đã sử dụng SnipMate ban đầu kể từ khi tôi bắt đầu sử dụng Vim.

  • Nó không có phụ thuộc bên ngoài.
  • Nó sử dụng một cú pháp rất đơn giản.
  • Nó rất dễ dàng để thiết lập.
  • Nó đã bị bỏ rơi từ năm 2009.

Tôi không có gì để phàn nàn.


16
Đó là lần đầu tiên tôi thấy bất cứ ai đề cập đến việc từ bỏ như một tính năng. : D
muru

6
Một dự án bị bỏ rơi là một dự án ổn định. Bạn không cần phải lo lắng về trường hợp cục bộ của mình bị lỗi thời hoặc về một bản cập nhật phá vỡ quy trình làm việc của bạn bằng thay đổi API. Nếu nó thỏa mãn nhu cầu của bạn khi bạn cài đặt nó, nó sẽ tiếp tục làm như vậy mãi mãi. Trừ khi nhu cầu của bạn thay đổi. Tính ổn định là tính năng số 1 tôi tìm kiếm trong bất kỳ công cụ nào .
romainl

3
"Nếu nó thỏa mãn nhu cầu của bạn khi bạn cài đặt nó, nó sẽ tiếp tục làm như vậy mãi mãi. Trừ khi nhu cầu của bạn thay đổi." Hoặc bạn tìm thấy một lỗi, tại thời điểm đó bạn cần tự sửa nó, tìm người khác để sửa nó hoặc tìm kiếm một giải pháp thay thế; một trong đó đã không bị bỏ rơi, có lẽ.

1
Cảm ơn câu trả lời của bạn @romainl! Tôi có một câu hỏi: Bạn nói rằng plugin bị bỏ rơi, nhưng readme chuyển hướng sang phiên bản mới hơn có vẻ khá tích cực và một số cam kết dường như khắc phục một số thứ không tốt hơn để sử dụng cái mới?
statox

1
Có một vài lỗi và lỗi tài liệu trong UltraSnips tạo ra trải nghiệm giới thiệu không mấy dễ chịu. Sau khi cuối cùng nó cũng chạy, tôi quyết định kiểm tra SnipMate và có thể hiểu đối số của @ romainl về sự ổn định.
chb

7

Dưới đây là danh sách các tính năng từ mu-template . Discl.: Tôi là người duy trì của nó.

  • Tệp mẫu có thể được mở rộng:
    • tự động khi mở bộ đệm mới (trừ khi bị vô hiệu hóa từ .vimrc),
    • rõ ràng thông qua các menu hoặc dòng lệnh,
    • từ chế độ INSERT theo kiểu đoạn trích;
    • từ chế độ VISUAL để bao quanh vùng chọn bằng một đoạn mã - xung quanh có thể được áp dụng cho các vùng khác nhau trong đoạn mã (ví dụ: vùng mã hoặc vùng điều kiện trong whilecâu lệnh điều khiển);
  • Tất cả các đoạn mã được xác định trong tệp mẫu riêng của chúng - tất cả các công cụ đoạn mã khác sử dụng một tệp cho mỗi tệp filetype và đặt tất cả các đoạn mã trong đó;
  • Các tệp mẫu có thể bị ghi đè bởi người dùng hoặc trong ngữ cảnh của một dự án cụ thể;
  • Đoạn mã cụ thể có thể được xác định cho chế độ INSERT (chúng có thể được kế thừa, ví dụ đoạn mã C có thể được sử dụng từ C ++, Java, v.v.), danh sách các đoạn phù hợp sẽ được trình bày với một gợi ý cho mỗi đoạn mã;
  • Các biểu thức VimL được tính toán có thể được chèn vào;
  • Các hướng dẫn VimL có thể được thực thi trong quá trình mở rộng - Tôi sử dụng nó để tự động thêm các câu lệnh bao gồm thiếu hoặc nhập;
  • Các tệp mẫu có thể bao gồm các tệp mẫu khác theo cách giống như chức năng (các tham số thậm chí được hỗ trợ) - AFAIK, rất ít công cụ đoạn trích thực hiện điều này, chúng thậm chí không thể hỗ trợ các bí danh đoạn trích, điều này không quan trọng để thực hiện nhờ tính năng này ;
  • Tích hợp đầy đủ với hệ thống giữ chỗ của tôi;
  • Hỗ trợ thụt lại (nếu muốn) và thụt Python;
  • Hoạt động tốt với vim gấp;
  • I18n thân thiện;
  • Khi một số đoạn trùng khớp, một menu hoàn thành nâng cao sẽ bật lên (nó được lấy cảm hứng từ menu bật lên YouCompleteMe);
  • Tùy chọn kiểu được áp dụng tự động (bạn thích dấu ngoặc của mình như thế if (...) {\n}nào if (...)\n{\n}?? Một cái gì khác?), Và tất nhiên, chúng có thể được điều chỉnh tốt tùy thuộc vào dự án hiện tại hoặc kiểu tệp hiện tại hoặc thậm chí cả hai;
  • Plugin là 100% VimL. Python có thể được sử dụng từ tệp mẫu mặc dù.
  • mu-template phụ thuộc vào hai plugin thư viện (lh-vim-lib và lh-dev) và trên hệ thống giữ chỗ của tôi (lh-ngoặc) - đó là lý do tại sao tôi khuyên bạn nên cài đặt nó với VAM hoặc VimFlavor khi tôi cung cấp các tệp khai báo sự phụ thuộc;
  • Giấy phép tương thích với việc tạo mã - điều đó có nghĩa là trong khi mã mu-template nằm dưới GPLv3, đoạn mã không có, bạn có thể sử dụng chúng trong mã độc quyền: mặc dù một số đoạn mã nằm dưới Giấy phép phần mềm Boost;

  • Việc mở rộng xảy ra sau khi bất kỳ vimrcs cục bộ nào được tải - để đặt các biến cụ thể cho dự án trước khi mở rộng được thực hiện.

  • Nhờ có plugin StakeHolders của Tom Link, màTememem đã gắn kết các trình giữ chỗ (sửa đổi một trình giữ chỗ có tên sửa đổi các trình giữ chỗ khác có cùng tên). Không cài đặt các bên liên quan sẽ không ngăn bạn sử dụng Tiết mục.

Thành thật mà nói, cú pháp mẫu hơi cồng kềnh và hệ thống giữ chỗ thuộc về thế hệ giữ chỗ đầu tiên - mu-template là một trong những công cụ mẫu / đoạn trích cũ nhất cho Vim.

Tuy nhiên, thực tế là nó cho phép các đoạn mã bao gồm các đoạn mã khác (có điều kiện và với các tham số) có thể hoặc không bị ghi đè là khá quan trọng. Các ứng dụng điển hình là

  • mẫu tệp C ++

    1. bao gồm một tiêu đề tệp (thường được tinh chỉnh khác nhau cho từng dự án để bao gồm thông báo bản quyền đúng)
    2. sau đó tải mẫu phù hợp nhất cho loại tệp hiện tại (.h, .cpp hoặc tệp thử nghiệm đơn vị)
      • trong trường hợp tệp tiêu đề, các bộ bảo vệ chống tái phát sẽ được đưa vào - cách chúng được tính toán có thể bị ghi đè (một lần nữa để tuân theo các chính sách của dự án)
      • trong trường hợp tệp .cpp, tệp .h phù hợp sẽ tự động được bao gồm nếu tìm thấy
  • Tôi có một đoạn mã chung / trình hướng dẫn trong lh-cpp. Và một số loại lớp chuyên biệt sử dụng mẫu lớp chung này, nhưng với các tham số khác nhau.


Cảm ơn câu trả lời của bạn! Tôi có một câu hỏi: bạn đã nói All snippets are defined in their own template-file -- all other snippet engines use one file per filetype and put all snippets in it lợi thế của kiến ​​trúc này là gì so với kiến ​​trúc thông thường (tức là một tệp bằng filetype)?
statox

@statox Tôi muốn nói, đây là vấn đề bảo trì đoạn trích. Một số đoạn quá phức tạp. Hãy xem lh-cpp internals/class-skeletonchẳng hạn. Tôi thà không pha trộn nó với các đoạn câu lệnh điều khiển. Nhưng tôi phải thừa nhận rằng việc có tất cả các tuyên bố kiểm soát cùng nhau sẽ không thành vấn đề. Hơn nữa, nhờ cách tiếp cận này, tôi có thể dễ dàng ghi đè lên các đoạn mã của mình, cập nhật chúng một cách nhanh chóng, sử dụng chúng làm chức năng, v.v.
Luc Hermitte

Thật vậy, khi tôi thấy liên kết của bạn, tôi có thể hiểu tại sao một số đoạn trích sống tốt hơn trong các tệp của riêng họ. Cảm ơn bạn đã làm rõ.
statox

1
@statox Trên thực tế, nhiều đoạn tôi có xu hướng phức tạp: họ phát hiện, suy luận và cố gắng làm càng nhiều điều thông minh càng tốt. Hầu hết thời gian tôi di chuyển mã đến các chức năng tự động tải, nhưng đôi khi, sẽ hợp lý hơn khi sử dụng một số đoạn gọi cho nhau (và đóng vai trò là các điểm biến thể có thể được điều chỉnh cho nhu cầu của dự án -> báo cáo bản quyền, ...)
Luc Hermitte

4

SnipMate và UltiSnips là hai công cụ snippet phổ biến nhất cho Vim. Cả hai đều được lấy cảm hứng từ cú pháp đoạn trích của TextMate. UltiSnips có thể chạy tất cả các đoạn SnipMate nhưng cũng có cú pháp bổ sung để làm cho nó mạnh hơn.

Một nguyên tắc nhỏ là nếu Vim của bạn có hỗ trợ python, thì hãy sử dụng UltiSnips. Nếu không, sau đó sử dụng SnipMate.

Theo tôi .vimrc, tôi tải (sử dụng Plug) hoặc tùy thuộc vào tính khả dụng của 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 cũng có thể chạy mã python trong đoạn trích của nó, cho phép nó thực hiện một số thủ thuật thú vị. Đây là một trong những đoạn yêu thích của tôi vẽ một hộp xung quanh một văn bản (từ cách tôi có thể ghi chú trong các bài giảng toán học bằng LaTeX và Vim | Gilles Castel )

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

Với đoạn mã này, tôi có thể xuất ra một cái gì đó như thế này:

┌─────────────────────┐
│ this is a cool box! │
└─────────────────────┘
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.