- Neovim เปิดตัว
vim.pack ซึ่งเป็น ตัวจัดการปลั๊กอินแบบฝังในตัวที่ยังอยู่ในขั้นทดลอง โดยรวมความสามารถในการติดตั้ง จัดการเวอร์ชัน และลบปลั๊กอินไว้ในตัวโดยไม่ต้องพึ่งตัวจัดการภายนอก
- (เนื่องจากยังอยู่ในช่วงทดสอบระยะแรก API อาจมีการเปลี่ยนแปลงบ่อย)
คุณสมบัติหลัก
- จัดการเฉพาะไดเรกทอรี
$XDG_DATA_HOME/nvim/site/pack/core/opt
- ปลั๊กอินต้องอยู่ในรูปแบบ Git repository เท่านั้น และจำเป็นต้องมีคำสั่ง git (อย่างน้อยเวอร์ชัน 2.36 ขึ้นไป)
- เวอร์ชันของปลั๊กอินสามารถระบุได้ด้วยแท็ก semver (รูปแบบ v1.2.3) หรือ branch/commit hash
- ทุกงาน เช่น ติดตั้ง อัปเดต ลบ และตรึงเวอร์ชัน (freeze) จัดการได้ผ่านฟังก์ชันที่มีมาในตัว
วิธีการทำงานของการติดตั้งและอัปเดต
- เพิ่ม
vim.pack.add() ลงใน init.lua (รองรับหลายรูปแบบ)
- เมื่่อรีสตาร์ต Neovim ระบบจะติดตั้งให้อัตโนมัติ
- เมื่อเรียก
vim.pack.update() จะสามารถอัปเดตทั้งหมดเป็นเวอร์ชันล่าสุดได้
- รองรับการตรวจสอบอัปเดต การแสดงตัวอย่างล่วงหน้า (อิง LSP) และการยืนยัน/ยกเลิกในคอนโซล
- เมื่อต้องการเปลี่ยนเวอร์ชัน ให้แก้การระบุเวอร์ชันใน
init.lua แล้วรัน vim.pack.update({ 'ชื่อปลั๊กอิน' })
- การ freeze เวอร์ชันจะอิงตาม commit hash ปัจจุบัน
- การลบทำได้ด้วยการเรียก
vim.pack.del()
พารามิเตอร์และพฤติกรรมหลักของ API
- add: รับรายการปลั๊กอิน และหากยังไม่มีจะดาวน์โหลดด้วย git clone และ checkout ไปยัง version ที่ระบุ
- อัปเดต: สามารถเลือกโหมดทำงานทันที/โหมดถามยืนยันได้ด้วยแฟล็ก
force และรายละเอียดการเปลี่ยนแปลงจะถูกบันทึกไว้ใน "nvim-pack.log"
- มี hook ให้ในแต่ละเหตุการณ์ (ติดตั้ง/อัปเดต/ลบ) พร้อมเปิดเผยข้อมูลเมตาของปลั๊กอิน
หมายเหตุ
- ในงานโปรดักชัน เนื่องจากเป็นตัวจัดการแบบทดลอง จึงอาจมีการเปลี่ยนพฤติกรรมอย่างฉับพลันได้
- แม้จะมีปลั๊กอินอยู่บนดิสก์แล้ว เวอร์ชันจริงกับเวอร์ชันที่ระบุอาจไม่ตรงกัน ดังนั้นจึงจำเป็นต้องซิงก์ด้วยการอัปเดต
- เมื่อลบแล้ว ต้องนำสเปกออกจาก
add ด้วยเพื่อป้องกันการติดตั้งใหม่
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
กำลังตั้งตารออัปเดตครั้งนี้มาก หวังว่าคอมมูนิตี้ปลั๊กอินของ nvim จะพัฒนาไปในทิศทางที่ทำให้ปลั๊กอิน lazy load ได้เป็นค่าเริ่มต้นโดยไม่ต้องใช้ตัวจัดการปลั๊กอินที่ซับซ้อนอย่าง lazy และอยากให้ลองดูโน้ตที่เกี่ยวข้องในเอกสารทางการของ nvim ด้วย เอกสารทางการของ nvim เรื่อง lazy loading ส่วนตัวชอบ best practices ที่ปลั๊กอิน nvim-neorocks เสนอไว้มากเช่นกัน nvim-neorocks best practices และดูเหมือนว่าช่วงหลังมีบางส่วนถูกรวมเข้าไปอย่างเป็นทางการแล้ว neovim PR #29073
setup()ใน neovim แล้ว รู้สึกว่า lazy loading ทำได้ยากกว่าวิธีแบบ Vim เดิมอยู่พอสมควร ใน Vim แค่ตั้งค่าตัวแปรไว้ ปลั๊กอินก็จะถูกโหลดเองตอนที่ฟังก์ชันถูกเรียก แต่ในฝั่ง lua ถ้ามีหลาย autocmd อ้างถึงปลั๊กอินตัวเดียวกัน ก็ต้องเรียกsetup()เองทุกจุด เลยต้องจัด orchestration เพิ่มขึ้นอีกหน่อยรู้สึกเหมือนตัวเองย้าย (Neo)Vim package manager ทุกประมาณ 3 ปี เส้นทางของฉันคือ pathogen → Vundle → vim-plug → lazy.nvim หวังว่าครั้งนี้จะเป็น package manager ตัวสุดท้ายของ Vim แล้ว
ยังคิดว่า Plug ใช้งานได้ดีอยู่ เวอร์ชันที่ฝังมาในตัวครั้งนี้อยู่ในภาษาโดยตรง เลยดูเป็น endgame ที่น่าจะตอบโจทย์ผู้ใช้ได้มากกว่า ลองใช้เองแล้ว ถึงจะไม่ได้ใช้ฟีเจอร์พิเศษที่ lazy มีให้ แต่ก็ทำงานได้ดีแบบไม่มีปัญหา
ดีใจที่ในที่สุดก็มี package manager อย่างเป็นทางการที่ฝังมาในตัวอย่างเป็นทางการ คิดว่าจากนี้ไปมันน่าจะเป็นตัวที่มีการรองรับและถูกใช้งานแพร่หลายที่สุด (แน่นอนว่าความครบเครื่องของฟีเจอร์อาจต่างกัน)
ก็ยังคิดว่า lazy.nvim ทรงพลังมาก แต่ตอนนี้หลายปลั๊กอินต้องรองรับ package manager หลายแบบ จึงรู้สึกว่าควรมีความเป็นมาตรฐานร่วมกันบ้าง ไม่แน่ใจว่าจะมีอะไรที่เร็วและน่าเชื่อถือได้เท่า lazy.nvim ไหม แต่ก็ไม่ได้รู้สึกว่าเป็นไปไม่ได้
ฉันเริ่มใช้ nixvim แล้ว ตอนช่วง vim-plug นี่แทบยอมแพ้ไปเลย การทำให้คอนฟิกคงสภาพดีเสมอบนหลายเครื่องและหลาย OS เป็นเรื่องทรมานมาก
บน Nix มันทำงานเหมือนเดิมเสมอ บน NixOS, MacOS, Linux ที่ใช้ nix-managed home-manager สามารถตั้งค่าแบบนี้ได้
เผื่อจะเป็นประโยชน์กับผู้ใช้ neovim ช่วงนี้ฉันเพิ่งย้ายจาก lazy.nvim มาใช้แค่ vim.pack ดู Pull Request นี้ ไม่มีปัญหาอะไรเลย ใช้ปลั๊กอินราว ๆ 50 ตัว ง่ายกว่าที่คิดมาก และมีเพื่อนช่วยทำคอนฟิกให้โหลดปลั๊กอินได้คล้าย lazy ด้วย โดยเฉพาะบนเครื่องที่ใช้ทำงาน เวลาโหลดปลั๊กอินที่เคยใช้ 300ms กับ lazy.nvim ตอนนี้ลดเหลือ 80ms แล้ว
ทุกครั้งที่เห็นว่ามันรองรับการ import โค้ดจาก git ได้ และยังระบุ branch หรือ commit hash ได้ด้วย ก็อยากให้มีเอกสารเรื่องฟีเจอร์ “checkout branch ณ ช่วงเวลาหนึ่ง” มากขึ้น เพราะหลาย branch ของ Vim plugin ไม่มีการทำเวอร์ชันเลย เช่น สามารถใช้
git checkout 'master@{2025-05-26 18:30:00}'เพื่อ checkout ตาม datetime ที่ต้องการได้ หวังว่ามันจะช่วยป้องกันปัญหาแบบ leftPad หรือเหตุการณ์ด้านความปลอดภัยอย่าง xz ที่เกิดจากความล้มเหลวในการจัดการเวอร์ชันฟังดูเป็นไอเดียที่น่าสนใจ แต่ก็อดสงสัยไม่ได้ว่า “ยึดเวลาตามนาฬิกาของอะไร” นาฬิกาของ repository เอง ของเครื่องฉัน หรือของ remote git โดยทั่วไปใช้ hash ก็น่าจะถูกทางกว่า และไม่แนะนำการพัฒนาซอฟต์แวร์ที่อิงเวลา (ถ้าไม่ใช่ทางเลือกสุดท้ายจริง ๆ)
อยากรู้เรื่องความเสี่ยงจาก supply chain attack เหมือนกัน ไม่แน่ใจว่า VIM plugin มีสิทธิ์มากน้อยแค่ไหน
ถ้า checkout master ณ เวลาที่ระบุ มันไม่ได้หมายความว่าจะดึงของ ณ ตอนนั้นจริง ๆ แต่จะอิงจากเวลาที่ฉัน pull ซึ่งทำให้งงอยู่เหมือนกัน (ไม่ reproducible) ถ้าต้องการ reproducibility จริง ๆ คงต้องใช้วิธีซับซ้อนขึ้น เช่น
git log --before=timeสงสัยว่าทำไมไม่ใช้ SHA ไปเลย
จริง ๆ แล้ว Vim plugin manager อาจไม่จำเป็น โดยเฉพาะถ้าจัดการ dotfiles ด้วย git แค่ clone ไฟล์ปลั๊กอินไปไว้ในไดเรกทอรีที่กำหนดก็พอแล้ว ถ้าจัดการคอนฟิกด้วย git เช่นกัน ก็ใช้ git submodules เพื่อตรึงและติดตามเวอร์ชันปลั๊กอินได้ วิธีนี้ยังเหมาะกับการ pin เวอร์ชันด้วย
ฉันเองก็เคยใช้ git submodule อยู่ปีหนึ่ง แรงจูงใจคือคิดว่ามันน่าจะแทน package manager เฉพาะทางของทุกเครื่องมือได้ (vim, tmux, zsh ฯลฯ) แต่ในทางปฏิบัติการจัดการ submodule ยุ่งยากกว่า vim-plug มาก แนวคิดดีอยู่หรอก แต่ ergonomics ของ Git ยังไม่ดีพอ สุดท้ายเลยย้อนกลับไป ถ้าใครมีประสบการณ์ว่าใช้ vim pack ที่ฝังมาในตัวแล้วสะดวกกว่า vim-plug อีก ก็อยากให้แชร์
ฉันมีความจำเป็นต้องเปิดปิดปลั๊กอินบ่อย ๆ เลยรู้สึกว่าจัดการผ่าน config สะดวกกว่าระบบไฟล์ตรง ๆ และยังเปิดใช้ปลั๊กอินตาม file type ได้ง่ายด้วย จริง ๆ แล้ว package manager ส่วนใหญ่ก็เป็นแค่ wrapper ของ git เท่านั้นเอง
ตอนนี้มันยังอยู่ในสภาพค่อนข้างดิบ แต่ถ้าวันหนึ่งฉันเลิกใช้ lazy ก็อยากให้มี deferred load ด้วย lazy.nvim นั้นยอดเยี่ยมแน่นอน แต่ช่วงหลังรู้สึกว่าผู้เขียนกำลังทำพฤติกรรมแบบ lock-in ผู้ใช้ ด้วยการลงมือทำปลั๊กอินโอเพนซอร์สชื่อดังอย่าง snack.nvim, mini.nvim เองไปหมด ไม่ค่อยเข้าใจกลยุทธ์แนว copycat/kill zone แบบนี้
แถมบางแพ็กเกจก็ไม่ได้ดูแลต่อด้วย ปล่อยค้างไว้เลย (เช่น snacks) และขอเสริมว่า mini.nvim เป็นคนละผู้เขียนกันโดยสิ้นเชิง ไม่เกี่ยวกับ lazy
ถึงอย่างนั้นก็ยังคิดว่าผู้เขียน lazy มีความสามารถในการสร้างอินเทอร์เฟซคุณภาพดีในแบบของตัวเอง ซึ่งฉันค่อนข้างชอบมาก จนบ่อยครั้งรู้สึกว่ามันดีที่สุด ตัวอย่างชัด ๆ คือ Snacks picker ที่กลายเป็นตัวเลือกที่ดีที่สุดไปแล้ว
ฉันเป็นผู้ใช้ vim รุ่นเก่า แต่สุดท้ายก็สรุปว่าการใช้ปลั๊กอินบน neovim ไม่ค่อยเวิร์กสำหรับฉัน มันพังอยู่เรื่อย ๆ คิดว่าถ้าเอาปลั๊กอินหลักอย่าง LSP, tree sitter ไปรวมเป็น native เลย neovim น่าจะไปได้ดีกว่านี้
ฉันก็รู้สึกแบบเดียวกัน และสำหรับการพัฒนา C/C++ ก็ยังเอาตัวรอดได้ดีด้วย vim-plug, gutentags(ctags), ALE แต่พอมาทำเว็บที่ต้องใช้หลาย syntax และหลายเครื่องมือ สุดท้ายก็ย้ายไปใช้ neovim distro ลองมาหลายตัวแล้ว ทั้ง Lunarvim (ที่ตอนนี้หยุดพัฒนาแล้ว) และตอนนี้ Astronvim ซึ่งเข้ากับฉันได้ดี
จริง ๆ แล้ว tree-sitter กับ LSP ถูกรวมแบบ native อยู่แล้ว ปลั๊กอิน LSP/tree-sitter หลัก ๆ มีไว้แค่ให้ค่าเริ่มต้นและ bundle query เท่านั้น และในอนาคตก็มีแผนให้ neovim bundle query เองแบบ native เพื่อไม่ต้องพึ่ง nvim-treesitter อีกต่อไป ส่วนการตั้งค่า LSP ก็ง่ายขึ้นมาก เช่น
และยังตั้ง keymap เฉพาะของแต่ละ LSP ได้ใน autocmd
"LspAttach"ด้วยฉันเดาว่าในอีก 5-10 ปีข้างหน้า เรื่องนี้น่าจะเข้าที่เข้าทางขึ้น
ใช้มาค่อนข้างนานแล้วและไม่มีปัญหาอะไรเลย ดู dotfiles ของฉัน
พูดตรง ๆ ก็ไม่จำเป็นต้องมินิมอลเสมอไป และถ้าไม่มีเหตุผลเฉพาะอื่น ๆ ก็อยากให้เป็นโซลูชันแบบรวมศูนย์ไปเลย ตอนนี้ฉันใช้ทั้ง vim pack และ git submodule ร่วมกัน แต่รู้สึกสับสนว่าโปรเจ็กต์บน GitHub ไหนคือแบบที่ดีที่สุด/แนะนำ/รองรับดี เลยไม่อยากต้องมาเลือก nvim package manager อีกแล้ว
นี่คือออริจินัลอิสชูที่เพิ่มฟีเจอร์นี้เข้าไป neovim issue ทางการ #20893 ดูเหมือนจะเป็นเป้าหมายมานานของโปรเจ็กต์ neovim แต่ไม่มีคำอธิบายว่าทำไมถึงทำ ตรง ๆ เลยตอนแรกฉันรู้สึกว่ามันเหมือน bloat เพราะปลั๊กอินที่มีอยู่เดิมก็ทำหน้าที่นี้ได้ยอดเยี่ยมอยู่แล้ว แต่ดูเหมือนบางคนจะไม่เห็นด้วย