จดหมายรักถึง Neovim
(caio.ca)- Neovim ทำให้การแก้ไขโค้ดไม่ใช่เรื่องของการพิมพ์ให้เร็ว แต่เป็นลูปซ้ำๆ ของการย้ายตำแหน่ง แก้ไข ลบ ปรับโครงสร้าง และตรวจสอบผลทดสอบ
- ไวยากรณ์การแก้ไข ของ Vim ช่วยลดแรงเสียดทานของการแก้ไขซ้ำๆ ด้วยการประกอบงานตามหน่วยความหมาย เช่น
ci",dap,., มาโคร และ text object - Neovim ไม่ได้บังคับให้ต้องใช้ file explorer, terminal หรือ Git panel แต่ให้ผู้ใช้เลือกใช้ Telescope, Fugitive, LSP และอื่นๆ โดยมี buffer เป็นศูนย์กลาง
- การตั้งค่าสามารถเป็นไฟล์ที่เก็บไว้ใน Git และยังคงเป็น ส่วนหนึ่งของระบบ ที่ทำงานร่วมกับ shell, tmux, ripgrep, git และ language server
- แม้จะทันสมัยขึ้นด้วย Lua, LSP ในตัว, Treesitter และ Lazy.nvim แต่คุณค่าหลักคือสิ่งที่เรียนรู้จะสะสมอยู่ได้นาน และ workflow จะค่อยๆ วิวัฒน์ขึ้นด้วยตัวเอง
สัมผัสของการทำงานที่ต่อเนื่องจาก Vim มาสู่ Neovim
- เริ่มใช้ Vim ในปี 2011 และช่วงแรกก็ทั้งคัดลอก
.vimrcมาใช้ ทั้งยังไม่เข้าใจว่าทำไมjถึงย้ายเคอร์เซอร์แทนที่จะพิมพ์ตัวอักษร - สัปดาห์แรกยาก และเดือนแรกก็ยังรู้สึกแปลก แต่พอคุ้นกับโมเดลของ Vim แล้ว โปรแกรมแก้ไขอื่นๆ กลับให้ความรู้สึกราวกับมีชั้นกันกระแทกระหว่างโค้ดกับผู้ใช้
- เคยใช้ทั้ง VS Code, JetBrains IDE, Sublime, Atom, Zed และโปรแกรมแก้ไขอื่นๆ อีกหลายตัว โดยเครื่องมือของ JetBrains ก็ทรงพลังมาก ส่วน VS Code ก็ประสบความสำเร็จเพราะดีพอสำหรับแทบทุกคนและขยายความสามารถได้ง่าย
- แต่เหตุผลที่ยังใช้ Neovim ต่อไป คือมันขยับไปตามวิธีทำงาน และรองรับลูปซ้ำๆ ของการแก้ไขโค้ดได้อย่างตรงจุด
วิธีมองการแก้ไขไม่ใช่คีย์ลัด แต่เป็นภาษา
- การแก้ไขโค้ดไม่ใช่งานพิมพ์ให้เร็ว แต่ใกล้เคียงกับงานที่วนซ้ำไปมาระหว่างการย้ายตำแหน่ง การแก้ไขเล็กๆ การลบ abstraction ที่ไม่เหมาะ การปรับโครงสร้างฟังก์ชัน การย้ายไฟล์ และการตรวจสอบผลทดสอบกับการวินิจฉัย
- โปรแกรมแก้ไขส่วนใหญ่มองข้อความเป็นเอกสาร และมองคีย์บอร์ดเป็นอุปกรณ์ป้อนข้อมูล แต่ Vim มอง การแก้ไขเป็นไวยากรณ์ (grammar)
ci"ใช้เปลี่ยนข้อความในเครื่องหมายอัญประกาศ,dapใช้ลบย่อหน้า และ.ใช้ทำซ้ำการเปลี่ยนแปลงล่าสุด- มาโครช่วยสอนกิจวัตรเล็กๆ ให้ทำหนึ่งครั้งแล้วนำไปใช้ซ้ำได้ทั้งไฟล์ และ text object ก็ทำให้การแก้ไขยึดตามหน่วยความหมายแทนจำนวนตัวอักษร
- เมื่อไวยากรณ์ของ Vim ติดมือแล้ว ก็จะไม่ค่อยต้องลากโค้ดด้วยเมาส์ คลิกแถบด้านข้าง หรือเปิด command palette สำหรับงานที่ทำวันละหลายสิบครั้ง
- งานที่ทำบ่อยจะกลายเป็นการเคลื่อนไหวเล็กๆ ที่ตรงไปตรงมา และเสียงรบกวนจากตัวโปรแกรมแก้ไขก็ลดลง
Neovim ที่ไม่บังคับ workflow
- โปรแกรมแก้ไขแบบเน้น GUI มักมีมุมมองตายตัวเกี่ยวกับตำแหน่งและรูปแบบของ explorer, terminal, Git panel และ debugger จนเมื่อเวลาผ่านไป ตัวโปรแกรมแก้ไขก็เริ่มคล้ายห้องนักบิน
- Neovim เริ่มต้นจาก buffer และสิ่งที่จะวางไว้รอบๆ นั้นขึ้นอยู่กับผู้ใช้
- ถ้าต้องการ file tree ก็เพิ่มได้ และถ้าต้องการ fuzzy search ก็เลือกเครื่องมือที่เหมาะอย่าง Telescope หรือ fzf-lua ได้
- สำหรับการผสานกับ Git ก็ใช้ Fugitive ได้ ส่วน LSP, diagnostics, formatting, snippets, Treesitter, test runner และ autocomplete ก็จัดการได้โดยไม่กลายเป็นแดชบอร์ด Electron ที่อืดช้า
- ความเร็วไม่ใช่แค่เรื่องเวลาเริ่มเปิด แต่เป็นเรื่องของ ความไว้วางใจ
- กดปุ่มแล้วต้องตอบสนองทันที
- เวลาเปิดไฟล์ใหญ่ UI ทั้งหมดไม่ควรสะดุด
- ไม่ว่าจะต่อผ่าน SSH, pair ผ่าน tmux หรือแก้ไขในหน้าต่างเทอร์มินัลเล็กๆ ความรู้สึกของโปรแกรมแก้ไขที่ใช้ทุกวันก็ควรเหมือนเดิม
- ไม่ว่าจะเป็นโปรเจกต์บนเครื่องตัวเอง เซิร์ฟเวอร์ระยะไกล การปรับค่า config แบบเร็วๆ แอป Rails ขนาดใหญ่ shell script เล็กๆ หรือการเขียน Markdown ก็ยังใช้การเคลื่อนไหวเดิม คำสั่งเดิม และความจำของกล้ามเนื้อแบบเดิมได้
- ความสม่ำเสมอ แบบนี้สะสมต่อเนื่องได้ตลอดทั้งอาชีพ
การตั้งค่าที่เป็นเจ้าของได้ และเครื่องมือที่ยังเป็นส่วนหนึ่งของระบบ
- การตั้งค่า Neovim เป็นไฟล์ใน Git จึงอ่านเองได้ ทำพังเองได้ และถ้ารู้ตัวว่าปลั๊กอินไหนไม่จำเป็นก็ลบทิ้งครึ่งหนึ่งได้เลย
- ไม่ต้องพึ่งฐานข้อมูลการตั้งค่าที่ลึกลับ สถานะบัญชีซิงก์ที่เข้าใจเพียงครึ่งเดียว หรือส่วนขยายที่ทำงานแปลกๆ อยู่เบื้องหลังเพราะมีการเปลี่ยน checkbox ตั้งแต่หลายเวอร์ชันก่อน
- โปรแกรมแก้ไขสมัยใหม่หลายตัวพยายามเป็นสถานที่ที่ทุกอย่างเกิดขึ้น แต่ Neovim พอใจกับการเป็นชิ้นส่วนที่คมและเฉียบของระบบที่ใหญ่กว่า
- มันไม่ได้พยายามแทนที่ shell แต่ทำงานร่วมกับ tmux, ripgrep, git, language server, formatter, linter และ test runner
- การที่ไม่จำเป็นต้องครอบครองทั้งโต๊ะทำงาน ก็เป็นอีกเหตุผลหนึ่งที่ทำให้ Neovim อยู่มาได้นาน
- ตั้งแต่ปี 2011 มีทั้งโปรแกรมแก้ไข ระบบนิเวศของส่วนขยาย ธีม marketplace และ AI panel เกิดขึ้นมากมาย แต่ Vim ก็เป็นเครื่องมือที่เก่าแก่อยู่แล้ว และ Neovim ก็ทำให้ส่วนที่จำเป็นทันสมัยขึ้นโดยไม่ทิ้งเหตุผลที่ผู้คนเห็นว่ามันสำคัญ
ความทันสมัยและผลตอบแทนจากการเรียนรู้ที่อยู่ได้นาน
- Lua ทำให้การตั้งค่าดีขึ้นมาก และระบบนิเวศของปลั๊กอินก็ดีขึ้นอย่างมากเช่นกัน
- LSP ในตัวนำความสามารถแบบ IDE เข้ามาสู่โปรแกรมแก้ไข โดยไม่ทำให้รู้สึกเทอะทะ
- Treesitter ทำให้ syntax highlighting และการรับรู้โค้ดทันสมัยขึ้น ส่วน Lazy.nvim ก็ทำให้การจัดการปลั๊กอินรวดเร็วและเรียบง่าย
- เสน่ห์หลักของ Neovim คือสิ่งที่เรียนรู้ไปแล้วจะยังมีประโยชน์ต่อไปแม้เวลาจะผ่านไป
- เรียนรู้ motion หนึ่งอย่าง ก็ยังช่วยได้ต่อเนื่อง
- เขียนมาโครได้ ความน่าเบื่อของการแก้ไขก็หายไป
- ค้นพบ text object แล้ว การ refactor ที่น่ารำคาญก็ง่ายขึ้น
- ปรับคำสั่งเพียงหนึ่งอย่าง มันก็กลายเป็นส่วนหนึ่งของมือ
- โปรแกรมแก้ไขไม่ได้ดีขึ้นเพราะบริษัทออก sidebar แบบใหม่ แต่ดีขึ้นเพราะผู้ใช้จัดการกับมันได้เก่งขึ้น
- ประสิทธิภาพการทำงานวัดได้ยากด้วยคำว่า “ประหยัดเวลาไป 5 วินาทีตรงนี้” แต่เกิดจากแรงเสียดทานที่ลดลงในการแก้ไขเล็กๆ นับพันครั้ง
- สามารถสลับไปมาระหว่างโค้ด การทดสอบ git diff และผลการค้นหา โดยยังโฟกัสที่ปัญหาได้โดยไม่รู้สึกเหมือนย้ายไปอีกห้องหนึ่ง
- Neovim มีความสามารถในการเขียนโปรแกรมสูง จึงทำให้ผู้ใช้ กำหนด workflow ด้วยตัวเอง แทนที่จะรับค่าเริ่มต้นไปเฉยๆ
- ถ้าเรื่องที่ไม่สะดวกเกิดขึ้นซ้ำเป็นครั้งที่สอง ก็มักแก้ได้ด้วย mapping, command, ฟังก์ชัน Lua เล็กๆ, ปลั๊กอินที่ดีกว่า หรือไม่ก็ลบปลั๊กอินทิ้งไปเลย
- การตั้งค่าจะค่อยๆ วิวัฒน์ให้เข้ากับวิธีทำงานจริง และเมื่อรู้ชัดว่าต้องการเปลี่ยนอะไร ก็แทบไม่เหลืออะไรมาขวางระหว่างความคิดกับการแก้ไข
- ตลอด 15 ปีที่ผ่านมา ทั้งภาษา เฟรมเวิร์ก สมรรถนะของเครื่อง และกระแสนิยมในวงการเปลี่ยนไป แต่ Vim และ Neovim ก็ยังคงเป็นโปรแกรมแก้ไขหลักที่ดีที่สุดสำหรับการทำงานเสมอมา
1 ความคิดเห็น
ความคิดเห็นจาก Lobste.rs
เริ่มใช้ vim เมื่อ 12~14 ปีก่อน เพราะต้องการเอดิเตอร์ที่เบาและแสดงโค้ดตรงหน้าได้ทันที
เริ่มเรียนรู้แบบไม่ใช้เมาส์ และภายหลังก็รู้สึกยินดีที่ได้รู้ว่า Mitchell Hashimoto ก็เรียนรู้ vim ในลักษณะคล้ายกัน
รู้จัก neovim ผ่าน TJ DeVries(https://www.youtube.com/@teej_dv) และช่อง YouTube ของเขา และได้เห็นเขาแฮ็กโปรเจกต์ต่าง ๆ อย่าง neovim, telescope เป็นต้น
การ ย้ายไปใช้ Lua รู้สึกเป็นธรรมชาติมาก และก็เป็นภาษาขนาดเล็กที่ชอบอยู่แล้วด้วย
ปลั๊กอินตัวแรกที่ใช้คือ treesitter กับ telescope และจนถึงตอนนี้ก็ยังใช้ neovim อยู่พร้อมปลั๊กอินเล็ก ๆ อีกไม่กี่ตัว
neovim ไม่เคยพังสำหรับฉันเลย และมันก็ทำงานได้ดีเฉย ๆ ฉันไม่ใช้ปลั๊กอิน LLM และคิดว่า ecosystem นั้นอยู่นอกเอดิเตอร์ก็ได้
หวังว่าทีมจะยังคงมอบแค่ เอดิเตอร์เขียนโค้ดที่เบาและโฟกัสชัดเจน ต่อไป
เพราะแบบนั้น การที่ neovim เพิ่ม Lua เข้ามาจึงดูน่าสนใจมาก
ราว ๆ 20 ปีก่อน เคยลองคิดดูว่าอะไรคือ องค์ประกอบที่ทำให้ชีวิตประจำวันสนุกขึ้น นอกเหนือจากเรื่องประสิทธิภาพล้วน ๆ
อันดับบนสุดของรายการนั้นคือ linux กับ vim
ไม่ว่าจะทำงานอะไร ใช้เทคโนโลยีสแตกแบบไหน ทั้งสองอย่างนี้รับประกันสภาพแวดล้อมการทำงานที่ทั้ง ergonomic คุ้นมือ และอบอุ่นสบาย
ตอนสัมภาษณ์งานในปี 2009 เริ่มเรียนรู้ vim ให้มากกว่าแค่
:wqเพราะพนักงานทุกคนใช้ vim กันหมด ถ้าจะทำงานร่วมกันก็มีทางนั้นทางเดียวบางคนถึงขั้นปิดการใช้ปุ่มลูกศรไว้ด้วย
ก่อนหน้านั้นมีประสบการณ์กับเอดิเตอร์ในเทอร์มินัลแค่ตอนเรียนมหาวิทยาลัยที่ใช้
picoและปกติก็ใช้ GUI editor ที่กำลังนิยมในยุคนั้นโชคดีที่ได้งาน และหลังจากนั้นก็ใช้ vim มาเรื่อย ๆ
ไม่นานมานี้เพิ่งตระหนักได้ว่าวิธีคิดแบบ vim ได้ซึมเข้าไปในส่วนอื่น ๆ ของชีวิตการทำซอฟต์แวร์ด้วย
ดูเหมือนว่าจะเริ่มจากตอนทำคีย์บอร์ดเสมือนสำหรับ submap จัดการหน้าต่างด้วย Hammerspoon บน macOS และปลายปีที่แล้วพอลองใช้ Arch Linux ก็ทำให้ การจัดการหน้าต่างแบบ tiling กลายเป็นเรื่องง่ายมาก
เมื่อสักพักก่อนก็ย้ายมาใช้ neovim และมองว่ามันยอดเยี่ยมจริง ๆ
รู้ว่ามีมุกและการถกเถียงเรื่องเอดิเตอร์เยอะมาก แต่ยกเว้นบางกรณี ก็ยังเข้าใจยากว่าทำไมคนที่เขียนโค้ดเป็นอาชีพถึงไม่ใช้ vim, emacs หรือเอดิเตอร์แนวคล้าย ๆ กัน
ไม่ว่าอาชีพไหน การเลือกเครื่องมือที่ดีที่สุดสำหรับงานเป็นเรื่องสำคัญ และการ มองการแก้ไขข้อความเป็นเหมือนภาษา เป็นข้อได้เปรียบใหญ่ในงานซอฟต์แวร์
ถ้าจะพูดถึงส่วนที่ว่า “เข้าใจยาก” ข้างต้น การทำงาน คีย์ลัด และปลั๊กอินของเอดิเตอร์อย่าง VS Code ก็มีประโยชน์มากเช่นกัน
เอกสารของ VS Code ก็คุ้มค่าที่จะอ่านให้จริงจัง และมันช่วยทำงานได้หลายอย่างจริง ๆ
และสำหรับบางคนรวมถึงฉันด้วย การใช้เมาส์ย้ายเคอร์เซอร์ไปตำแหน่งใดก็ได้ในบัฟเฟอร์และเลือกช่วงใดก็ได้ เป็นวิธีที่ง่ายและเร็วพอแล้ว
KISS นั่นแหละ
เพราะเอดิเตอร์อื่นมักเป็นเครื่องมือที่ดีกว่าสำหรับงานนั้น
สำหรับ Python ที่ใช้บ่อยที่สุดทุกวันนี้ รู้สึกว่า PyCharm เป็นเครื่องมือที่ดีกว่าพวกนั้น
โชคดีที่มีปลั๊กอิน IDEAVim ที่ดีมาก จึงยังรักษา muscle memory เอาไว้ได้
ถ้าใช้บน mac ก็ยังมีข้อดีที่คีย์ลัดของระบบไม่ชนกับคีย์ลัดแบบ vi ทำให้เลือกใช้ได้ตามบริบท
ตอนใช้ C++ ก็คิดว่า CLion เป็นเครื่องมือที่ดีกว่า แต่ที่นั่น IDEAVim ก็ยังใช้ได้
สำหรับงานจุกจิกที่จัดหมวดหมู่ยาก ๆ มักใช้ zed และการจำลอง vim ของมันก็ค่อนข้างดี
เวลาต่อเข้า remote system การมีเอดิเตอร์เทอร์มินัลที่ดีนั้นมีประโยชน์แน่นอน แต่ถ้าใช้ GUI แบบเต็มได้ ก็ไม่ได้ชอบเอดิเตอร์เทอร์มินัลขนาดนั้น
ฉันชอบ modal editing เองอยู่แล้ว แต่ถ้าไม่จำเป็นต้องทิ้ง muscle memory ก็เห็นว่ามีเหตุผลมากพอที่จะใช้ GUI editor
VS Code ในสภาพเริ่มต้นก็ ดีพอสำหรับการใช้งานหลายแบบ อยู่แล้ว
มีทั้ง ctrl-p สำหรับค้นหาไฟล์, split window, syntax highlighting และรองรับภาษายอดนิยม
อย่างน้อย neovim ก็ควรมีอะไรระดับ ctrl-p ติดมาด้วย และเคยหวังให้มันกลายเป็นอะไรสักอย่างที่เหมือน Linux Mint ของเอดิเตอร์แบบ vim ที่ลดความกังวลด้านความปลอดภัยและลดกำแพงของการตั้งค่า
เวลาทำ pair programming ผ่าน tmux session บนเครื่องที่ต่อด้วย SSH หรือแก้ปัญหาในหน้าต่างเทอร์มินัลเล็ก ๆ ก็เข้าใจดีว่าอยากได้ความรู้สึกของเอดิเตอร์แบบเดียวกับที่ใช้ทุกวัน
เคยรับเงินเขียนโค้ดจำนวนมากผ่าน screen/vim บน SSH และในยุคก่อนที่ Slack จะส่งเสียงรบกวนได้ตลอดเวลา มันมีประสิทธิภาพมากจริง ๆ
สิ่งหนึ่งที่ไม่เคยหาอะไรมาแทนได้ดีใน vim editor ใด ๆ คือ visual debugger อย่างใน Visual Studio หรือ Jetbrains IDE อย่าง CLion, Rider
มันทรงพลังและเข้าถึงง่ายกว่าสิ่งอย่าง cgdb
ความเร็วไม่ได้เป็นแค่เรื่องเวลาเริ่มต้นเท่านั้น และ neovim ก็ทำได้ดีในจุดนั้น แต่การปิด neovim แบบพื้นฐานกลับ ช้ากว่า vim อย่างเห็นได้ชัด
แม้จะไม่ได้นานมาก แต่ในสภาพแวดล้อมของฉันใช้เวลาประมาณ 1 วินาที
ฉันชอบโมเดลของ vim โดย modal editing เป็นแค่ส่วนเล็ก ๆ เท่านั้น และสิ่งที่ให้คะแนน vim สูงกว่า helix หรือ IDE ทั่วไปคือ ความสามารถในการเรียนรู้แบบค่อยเป็นค่อยไป
ตอนแรกก็เข้าใจ key binding กับการตั้งค่า พอมีอะไรใช้ไม่ได้บน Windows ก็ใส่เงื่อนไขใน config จากนั้นก็เขียน autocmd กับฟังก์ชัน และต่อยอดสิ่งที่เรียนรู้มาก่อนหน้าไปเป็นปลั๊กอินเล็ก ๆ ได้อีก
แต่ถึงอย่างนั้นก็ไม่ได้รัก vim หรือ neovim แบบสุดหัวใจ
vim มีบั๊กแปลก ๆ แบบเดิมที่ไม่ถูกแก้มาหลายสิบปี ส่วน neovim แก้บั๊กไปหลายอย่างก็จริง แต่ก็นำบั๊กอีกชุดเข้ามา
บาปใหญ่ที่สุดของ neovim คือ ทำลาย Lua API ทุกครั้งที่อัปเดต
ฉันเหนื่อยกับการต้องเห็นคำเตือน deprecated ทุกครั้งที่รัน และต้องแก้ config ก่อนจะได้ทำสิ่งที่ตั้งใจจะทำ
ถ้าฟีเจอร์ใหม่บางอย่างไม่ได้จำกัดไว้เฉพาะ Lua อย่างน้อยก็คงยังพอรับได้มากกว่านี้
ไม่อย่างนั้นก็คงใช้ vimscript ต่อไปแล้วพอใจกับความเข้ากันได้ย้อนหลังที่ต่อเนื่องมากว่า 20 ปี