อะไรคือความแตกต่างระหว่างส่วนย่อยของกลุ่มตัวอย่าง?


25

มีปลั๊กอินตัวอย่างจำนวนมากสำหรับ vim: ultisnips , snipmate , xptemplate , neosnippetและอีกมากมาย

พวกเขาทั้งหมดมีข้อดีข้อเสียและการพึ่งพามากหรือน้อย จนถึงตอนนี้ฉันใช้ ultisnips แต่ก็ไม่เคยพอใจมันเลย

เนื่องจากเรามีคำถามที่น่าสนใจและสมบูรณ์เกี่ยวกับตัวจัดการปลั๊กอินฉันคิดว่ามันมีประโยชน์มากที่จะมีคำอธิบายเกี่ยวกับตัวอย่างของปลั๊กอิน

มีรายชื่ออยู่ที่นี่ซึ่งอาจเป็นการเริ่มต้นที่ดี แต่คำตอบที่สมบูรณ์ชัดเจนและ precises เนื่องจากชุมชนของเราสามารถเขียนได้จะมีประโยชน์มาก


1
คุณมีเมทริกซ์นี้ไว้ในวิกิพีเดียของมาร์กเบอร์: vim-wiki.mawercer.de/wiki/topic/ …
Luc Hermitte

2
IMHO นี่เป็นเรื่องที่ค่อนข้างทั่วไปบางทีถ้าคุณอธิบายอย่างละเอียดว่า "ไม่เคยพอใจกับมัน" ฉันใช้ "neosnippet.vim" ของ Shougo
VanLaser

คุณควรอัพเดต wiki ด้วยข้อมูลจากที่นี่ ขอบคุณ
Christian Brabandt

@ChristianBrabandt: ใช่ทันทีที่ฉันมีเวลา (ในอีกไม่กี่วันถัดไป) ฉันจะอัปเดต
statox

คำตอบ:


22

ฉันใช้ultisnipsมาหลายสัปดาห์แล้ว

ฉันคิดว่าข้อดีหลัก ๆ ของปลั๊กอินนี้คือ:

  • มันค่อนข้างเร็วแม้จะมีตัวอย่างจำนวนมาก
  • ไวยากรณ์พื้นฐานในการกำหนดตัวอย่างใหม่นั้นง่ายต่อการเข้าใจดังนั้นจึงเป็นเรื่องง่ายที่จะสร้างตัวอย่างใหม่อย่างรวดเร็วทำสิ่งที่คุณต้องการจะทำ (สำหรับตัวอย่างที่ซับซ้อนมากขึ้นอาจต้องมีการทำงานเพิ่มเติม)
  • มันใช้งานได้ดีมากนอกกรอบ; การกำหนดค่าพื้นฐานช่วยให้คุณใช้ตัวอย่างได้อย่างรวดเร็ว
  • มันสามารถกำหนดค่าได้จริง ๆ แม้ว่าการกำหนดค่าพื้นฐานจะทำงานได้ดีหากคุณเป็นผู้ใช้ระดับสูงคุณสามารถปรับแต่งได้อย่างประณีต

ก่อนอื่น ultisnips คือเอ็นจิ้นตัวอย่างซึ่งหมายความว่าปลั๊กอินมีคุณสมบัติในการใช้ตัวอย่าง แต่ไม่ได้จัดเตรียมตัวอย่างเอง เพื่อให้ได้ตัวอย่างที่ผู้เขียนแนะนำ ที่เป็นกลุ่มตัวอย่าง-

เมื่อคุณติดตั้งปลั๊กอินทั้งสองแล้วคุณจะสามารถใช้ตัวอย่างข้อมูลได้

คำจำกัดความของตัวอย่างถูกเก็บไว้ในไฟล์ที่ชื่อรูปแบบต่อไปนี้: ft.snippets, ft_*.snippetsหรือft/*, โดยที่ft'filetype' ของเอกสารปัจจุบันและ*เป็น wildcard เหมือนเชลล์ที่ตรงกับสตริงใด ๆ รวมถึงสตริงว่าง (โปรดทราบว่าcuda.cppได้รับการสนับสนุนไวยากรณ์ชนิดไฟล์ที่เป็นจุด)

วิธีนี้ข้อมูลโค้ดเฉพาะสำหรับชนิดไฟล์จะถูกขยายเมื่อตั้งค่าชนิดไฟล์ของบัฟเฟอร์เท่านั้น ชนิดไฟล์พิเศษallมีให้เพื่อสร้างตัวอย่างข้อมูลที่ขยายบนบัฟเฟอร์ทั้งหมด

นอกเหนือจากตัวอย่างที่ให้บริการโดย vim-snippets ผู้ใช้สามารถกำหนดตัวอย่างของตัวเอง คำแนะนำของฉันคือการวางไว้ในไดเรกทอรี ~/.vim/my-snippets/Ultisnipsด้วยวิธีนี้ Ultisnips จะค้นหาได้โดยไม่ต้องกำหนดค่าเพิ่มเติมและง่ายต่อการบำรุงรักษาไว้ในที่เก็บ dotfile

ในการขยายตัวอย่าง Ultisnips มีตัวแปรg:UltiSnipsExpandTrigger ที่กำหนดการแมปซึ่งจะทำให้เกิดการขยายตัว (ฉันเลือก **ที่จะสะดวกสำหรับฉัน) โปรดทราบว่าการผสานควรเป็นไปได้ แต่ฉันไม่ได้ทดสอบด้วยตัวเอง)

สำหรับผู้ใช้ระดับสูง Ultisnips ยังมีฟังก์ชั่นบางอย่างเพื่อปรับแต่งพฤติกรรมของการขยายตัว ดู:h UltiSnips-trigger-functions


นี่เป็นผู้จัดการตัวอย่างคนแรกที่ฉันใช้อย่างกว้างขวางและฉันคิดว่านี่เป็นสิ่งที่ดีที่เริ่มต้นด้วยความเรียบง่ายนอกกรอบและความเป็นไปได้ที่จะปรับ

ในที่สุดนี่คือรายการของ screencasts ที่ให้การแนะนำที่ดีกับปลั๊กอิน:


คุณรู้วิธีที่จะทำให้มันไม่ขยายเมื่อมีการทริกเกอร์เว้นแต่จะนำหน้าด้วยช่องว่างหรือ a >(ในขณะที่ปิดวงเล็บของ HTML ความจริงมันไม่ทราบว่าในตอนท้ายของแท็กเป็นที่น่ารำคาญเพราะถ้าฉันเปิดใช้งาน ตัวเลือกiแล้วมันทำให้มันจึงขยายมันแม้ว่าในช่วงกลางของคำที่ไม่ดีที่.
น้ำใจ

12

ฉันใช้SnipMateดั้งเดิมมาตั้งแต่เริ่มใช้ Vim

  • มันไม่มีการอ้างอิงภายนอก
  • มันใช้ไวยากรณ์ที่ง่ายมาก
  • มันง่ายมากที่จะติดตั้ง
  • มันถูกละทิ้งตั้งแต่ 2552

ฉันไม่มีอะไรจะบ่น


16
นั่นเป็นครั้งแรกที่ฉันได้เห็นใครพูดถึงการละทิ้งเป็นคุณลักษณะ : D
muru

6
โครงการที่ถูกทอดทิ้งเป็นโครงการที่มั่นคง คุณไม่จำเป็นต้องกังวลเกี่ยวกับอินสแตนซ์ในพื้นที่ของคุณที่ล้าสมัยหรือเกี่ยวกับการปรับปรุงการแบ่งเวิร์กโฟลว์ของคุณด้วยการเปลี่ยนแปลง API ถ้ามันพอใจกับความต้องการของคุณเมื่อคุณติดตั้งมันจะทำเช่นนั้นตลอด เว้นแต่ความต้องการของคุณเปลี่ยนแปลง ความเสถียรเป็นคุณสมบัติ # 1 ที่ฉันมองหาในเครื่องมือใด ๆ
romainl

3
"ถ้ามันพอใจกับความต้องการของคุณเมื่อคุณติดตั้งมันจะดำเนินต่อไปเรื่อย ๆ ตลอดไปเว้นแต่ความต้องการของคุณจะเปลี่ยนไป" หรือคุณพบข้อบกพร่อง ณ จุดนี้คุณต้องแก้ไขด้วยตัวเองค้นหาคนอื่นเพื่อแก้ไขหรือหาทางเลือกอื่น หนึ่งที่ไม่ได้ถูกทอดทิ้งบางที

1
ขอบคุณสำหรับคำตอบของคุณ @romainl! ฉันมีหนึ่งคำถาม: คุณบอกว่าปลั๊กอินถูกยกเลิก แต่ readme เปลี่ยนเส้นทางไปเป็นเวอร์ชั่นที่ใหม่กว่าซึ่งดูเหมือนว่าค่อนข้างแอคทีฟและหลายคอมมิทดูเหมือนจะแก้ไขบางสิ่งบางอย่างมันจะดีกว่าหรือไม่ที่จะใช้ใหม่
statox

1
มีข้อผิดพลาดเล็กน้อยและข้อผิดพลาดเอกสารใน UltraSnips ที่ทำให้ประสบการณ์การแนะนำสั้นกว่าที่พอใจ ในที่สุดหลังจากทำให้มันทำงานฉันตัดสินใจที่จะตรวจสอบ SnipMate และสามารถเข้าใจข้อโต้แย้งของ @ romainl เพื่อความมั่นคง
chb

7

นี่คือรายการของคุณสมบัติจากหมู่บ้านแม่แบบ เปิดเผย: ฉันเป็นผู้ดูแล

  • เทมเพลตไฟล์สามารถขยายได้:
    • โดยอัตโนมัติเมื่อเปิดบัฟเฟอร์ใหม่ (เว้นแต่ปิดการใช้งานจาก. vimrc)
    • อย่างชัดเจนผ่านเมนูหรือบรรทัดคำสั่ง
    • จากโหมด INSERT ในลักษณะคล้ายตัวอย่าง
    • จากโหมด VISUAL- เพื่อล้อมรอบการเลือกด้วยตัวอย่าง - การล้อมรอบอาจนำไปใช้กับโซนที่แตกต่างกันในตัวอย่าง (เช่นรหัสหรือโซนเงื่อนไขในwhileคำสั่งควบคุม);
  • ตัวอย่างทั้งหมดมีการกำหนดไว้ในไฟล์เทมเพลตของตัวเอง - เอ็นจิ้นตัวอย่างอื่น ๆ ทั้งหมดใช้หนึ่งไฟล์ต่อไฟล์หนึ่งไฟล์และวางตัวอย่างทั้งหมดไว้ในนั้น
  • เทมเพลตไฟล์สามารถแทนที่ได้โดยผู้ใช้หรือในบริบทของโครงการเฉพาะ
  • ตัวอย่างไฟล์ที่สามารถกำหนดได้สำหรับโหมด INSERT (สามารถสืบทอดตัวอย่างเช่น C ตัวอย่างสามารถใช้จาก C ++, Java, ฯลฯ ) รายการของตัวอย่างที่ตรงกันจะถูกนำเสนอด้วยคำแนะนำสำหรับแต่ละตัวอย่าง;
  • สามารถแทรกนิพจน์ VimL ที่คำนวณได้
  • คำสั่ง VimL สามารถเรียกใช้งานได้ในระหว่างการขยาย - ฉันใช้เพื่อเพิ่มคำสั่ง include หรือคำสั่งที่หายไปโดยอัตโนมัติ
  • ไฟล์เทมเพลตสามารถรวมไฟล์เทมเพลตอื่น ๆ ในลักษณะที่เหมือนฟังก์ชั่น (รองรับพารามิเตอร์ได้ด้วย) - AFAIK เอ็นจิ้นตัวอย่างน้อยมากที่ใช้สิ่งนี้พวกเขาไม่สามารถรองรับนามแฝงของโค้ดได้ คุณลักษณะนี้
  • บูรณาการอย่างเต็มที่กับระบบตัวแทนของฉัน;
  • รองรับการเยื้องใหม่ (หากต้องการ) และการเยื้อง Python
  • ทำงานได้ดีกับการพับเป็นกลุ่ม
  • ฉันเป็นมิตร
  • เมื่อหลายตัวอย่างตรงกับเมนูเสร็จสมบูรณ์ขั้นสูงจะปรากฏขึ้น (มันได้รับแรงบันดาลใจจากเมนูป๊อปอัพ YouCompleteMe);
  • ตัวเลือกรูปแบบจะถูกนำไปใช้โดยอัตโนมัติ (คุณชอบวงเล็บอย่างไรif (...) {\n}? if (...)\n{\n}มีอย่างอื่นอีกไหม) และแน่นอนว่าสามารถปรับได้ตามโครงการปัจจุบันหรือประเภทไฟล์ปัจจุบันหรือแม้กระทั่งทั้งสองอย่าง
  • ปลั๊กอินคือ 100% VimL Python สามารถใช้งานได้จากไฟล์เทมเพลต
  • mu-template ขึ้นอยู่กับไลบรารี่ของไลบรารี่สองตัว (lh-vim-lib และ lh-dev) และในระบบตัวยึดตำแหน่งของฉัน (lh-brackets) - นั่นเป็นเหตุผลที่ฉันแนะนำให้ติดตั้งมันด้วย VAM หรือ VimFlavor เพราะฉันให้ไฟล์ที่ประกาศ การพึ่งพา;
  • ใบอนุญาตใช้งานร่วมกันได้กับการสร้างรหัส - ซึ่งหมายความว่าแม้ว่ารหัส mu-template จะอยู่ภายใต้ GPLv3 แต่คุณไม่สามารถใช้ตัวอย่างในรหัสที่เป็นกรรมสิทธิ์: ตัวอย่างบางส่วนอยู่ภายใต้ใบอนุญาตซอฟต์แวร์ Boost แม้ว่า;

  • การขยายตัวเกิดขึ้นหลังจากที่มี vimrcs อยู่ภายในเครื่องโหลด - เพื่อตั้งค่าตัวแปรเฉพาะโครงการก่อนที่จะทำการขยายเสร็จ

  • ต้องขอบคุณปลั๊กอิน StakeHolders ของ Tom Link em แผ่นข้อความได้เชื่อมโยงตัวยึดตำแหน่งไว้ (การแก้ไขตัวยึดตำแหน่งที่มีชื่อหนึ่งชื่อจะแก้ไขตัวยึดตำแหน่งอื่นที่มีชื่อเดียวกัน) การไม่ติดตั้งผู้มีส่วนได้เสียจะไม่ป้องกันคุณจากการใช้ emTemplate

เพื่อความซื่อสัตย์อย่างสมบูรณ์ไวยากรณ์ของเทมเพลตนั้นค่อนข้างยุ่งยากและระบบตัวยึดเป็นของตัวยึดตำแหน่งแรกที่สร้าง - mu-template เป็นหนึ่งในเอ็นจินเทมเพลต / ตัวอย่างที่เก่าแก่ที่สุดสำหรับ Vim

อย่างไรก็ตามความจริงมันอนุญาตให้ตัวอย่างรวมถึงตัวอย่างอื่น ๆ (เงื่อนไขและมีพารามิเตอร์) ซึ่งอาจจะหรืออาจจะไม่ถูกแทนที่เป็นสิ่งสำคัญมาก แอพพลิเคชั่นทั่วไปคือ

  • เท็มเพลตไฟล์ C ++

    1. ซึ่งรวมถึงส่วนหัวของไฟล์ (โดยปกติจะมีการปรับจูนที่แตกต่างกันสำหรับแต่ละโครงการเพื่อรวมประกาศลิขสิทธิ์ที่ถูกต้อง)
    2. จากนั้นโหลดเทมเพลตที่เหมาะสมที่สุดสำหรับไฟล์ประเภทปัจจุบัน (.h, .cpp หรือไฟล์ทดสอบหน่วย)
      • ในกรณีส่วนหัวไฟล์จะมีการรวมตัวกันป้องกันการรวมตัวใหม่อีกครั้ง - วิธีที่พวกเขาคำนวณอาจถูกเขียนทับ (อีกครั้งเพื่อทำตามนโยบายโครงการ)
      • ในกรณีของไฟล์. cpp ไฟล์. h ที่ตรงกันจะถูกรวมโดยอัตโนมัติหากพบ
  • ฉันมีตัวอย่างข้อมูลทั่วไป / ตัวช่วยสร้างใน lh-cpp และคลาสชนิดพิเศษหลายชนิดที่ใช้แม่แบบคลาสทั่วไปนี้ แต่มีพารามิเตอร์ต่างกัน


ขอบคุณสำหรับคำตอบ! ฉันมีคำถาม: คุณพูดว่าAll snippets are defined in their own template-file -- all other snippet engines use one file per filetype and put all snippets in it อะไรคือข้อดีของสถาปัตยกรรมนี้เมื่อเทียบกับปกติ (เช่นหนึ่งไฟล์โดย filetype)
statox

@statox ฉันจะบอกว่านี่เป็นปัญหาการบำรุงรักษาตัวอย่าง ตัวอย่างบางส่วนมีความซับซ้อนมากเกินไป internals/class-skeletonตัวอย่างเช่นlh-cpp ฉันไม่อยากให้มันผสมกับตัวอย่างคำสั่งควบคุม แต่ฉันต้องยอมรับว่าการมีคำสั่งควบคุมทั้งหมดเข้าด้วยกันจะไม่เป็นปัญหา ยิ่งไปกว่านั้นด้วยวิธีการนี้ฉันสามารถแทนที่ตัวอย่างของฉันอัปเดตพวกเขาได้ทันทีใช้เป็นฟังก์ชั่น ฯลฯ
Luc Hermitte

แน่นอนเมื่อฉันเห็นลิงก์ของคุณฉันสามารถเข้าใจได้ว่าทำไมตัวอย่างบางส่วนจึงมีชีวิตที่ดีกว่าในไฟล์ของตนเอง ขอบคุณสำหรับคำชี้แจงของคุณ
statox

1
@statox ที่จริงแล้วเกร็ดเล็กเกร็ดน้อยจำนวนมากที่ฉันมักจะมีความซับซ้อน: พวกเขาตรวจจับอนุมานและพยายามทำสิ่งที่ชาญฉลาดมากที่สุดเท่าที่จะทำได้ ส่วนใหญ่เวลาที่ฉันย้ายรหัสเพื่อฟังก์ชั่น autoloaded แต่บางครั้งมันทำให้รู้สึกมากขึ้นเพื่อใช้หลายตัวอย่างที่เรียกกันคนอื่น ๆ (และทำหน้าที่เป็นจุดเปลี่ยนแปลงที่สามารถติดตามความต้องการของโครงการ -> งบลิขสิทธิ์, ... )
Luc Hermitte

4

SnipMate และ UltiSnips เป็นเอ็นจิ้น snippet ที่ได้รับความนิยมสูงสุดสำหรับ Vim ทั้งสองได้รับแรงบันดาลใจมาจากไวยากรณ์ตัวอย่างของ TextMate UltiSnips สามารถเรียกใช้ตัวอย่าง SnipMate ทั้งหมด แต่ยังมีไวยากรณ์เพิ่มเติมเพื่อให้มีประสิทธิภาพยิ่งขึ้น

กฎง่ายๆคือถ้าหาก Vim ของคุณรองรับไพ ธ อนให้ใช้ UltiSnips ถ้าไม่เช่นนั้นใช้ SnipMate

ในของ.vimrcฉันฉันโหลด (ใช้ปลั๊ก) ปลั๊กอินอย่างใดอย่างหนึ่งขึ้นอยู่กับความพร้อมใช้งานของหลาม

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 ยังสามารถเรียกใช้โค้ดไพ ธ อนในตัวอย่างโค้ดได้ นี่เป็นหนึ่งในตัวอย่างที่ฉันโปรดปรานที่วาดกล่องล้อมรอบข้อความ (จากวิธีที่ฉันสามารถจดบันทึกในการบรรยายทางคณิตศาสตร์โดยใช้ LaTeX และ Vim | Gilles Castel )

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

ด้วยตัวอย่างนี้ฉันสามารถแสดงผลบางอย่างเช่นนี้:

┌─────────────────────┐
│ this is a cool box! │
└─────────────────────┘
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.