1 คะแนน โดย GN⁺ 7 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 7 시간 전
ความคิดเห็นจาก 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 นั้นอยู่นอกเอดิเตอร์ก็ได้
    หวังว่าทีมจะยังคงมอบแค่ เอดิเตอร์เขียนโค้ดที่เบาและโฟกัสชัดเจน ต่อไป

    • ประสบการณ์คล้ายกันเลย ใช้ vim และ emacs มาหลายปี และแม้จะชอบ vim มากกว่า แต่ก็อิจฉาอยู่เสมอที่ elisp เป็นภาษาโปรแกรมที่ค่อนข้างดี ในขณะที่ vimscript นั้นไม่ค่อยเท่าไร
      เพราะแบบนั้น การที่ neovim เพิ่ม Lua เข้ามาจึงดูน่าสนใจมาก
  • ราว ๆ 20 ปีก่อน เคยลองคิดดูว่าอะไรคือ องค์ประกอบที่ทำให้ชีวิตประจำวันสนุกขึ้น นอกเหนือจากเรื่องประสิทธิภาพล้วน ๆ
    อันดับบนสุดของรายการนั้นคือ linux กับ vim
    ไม่ว่าจะทำงานอะไร ใช้เทคโนโลยีสแตกแบบไหน ทั้งสองอย่างนี้รับประกันสภาพแวดล้อมการทำงานที่ทั้ง ergonomic คุ้นมือ และอบอุ่นสบาย

  • ตอนสัมภาษณ์งานในปี 2009 เริ่มเรียนรู้ vim ให้มากกว่าแค่ :wq เพราะพนักงานทุกคนใช้ vim กันหมด ถ้าจะทำงานร่วมกันก็มีทางนั้นทางเดียว
    บางคนถึงขั้นปิดการใช้ปุ่มลูกศรไว้ด้วย
    ก่อนหน้านั้นมีประสบการณ์กับเอดิเตอร์ในเทอร์มินัลแค่ตอนเรียนมหาวิทยาลัยที่ใช้ pico และปกติก็ใช้ GUI editor ที่กำลังนิยมในยุคนั้น
    โชคดีที่ได้งาน และหลังจากนั้นก็ใช้ vim มาเรื่อย ๆ
    ไม่นานมานี้เพิ่งตระหนักได้ว่าวิธีคิดแบบ vim ได้ซึมเข้าไปในส่วนอื่น ๆ ของชีวิตการทำซอฟต์แวร์ด้วย
    ดูเหมือนว่าจะเริ่มจากตอนทำคีย์บอร์ดเสมือนสำหรับ submap จัดการหน้าต่างด้วย Hammerspoon บน macOS และปลายปีที่แล้วพอลองใช้ Arch Linux ก็ทำให้ การจัดการหน้าต่างแบบ tiling กลายเป็นเรื่องง่ายมาก
    เมื่อสักพักก่อนก็ย้ายมาใช้ neovim และมองว่ามันยอดเยี่ยมจริง ๆ
    รู้ว่ามีมุกและการถกเถียงเรื่องเอดิเตอร์เยอะมาก แต่ยกเว้นบางกรณี ก็ยังเข้าใจยากว่าทำไมคนที่เขียนโค้ดเป็นอาชีพถึงไม่ใช้ vim, emacs หรือเอดิเตอร์แนวคล้าย ๆ กัน
    ไม่ว่าอาชีพไหน การเลือกเครื่องมือที่ดีที่สุดสำหรับงานเป็นเรื่องสำคัญ และการ มองการแก้ไขข้อความเป็นเหมือนภาษา เป็นข้อได้เปรียบใหญ่ในงานซอฟต์แวร์

    • ประเด็นหลักของบทความคือ “ทำไมถึงรัก Neovim” ไม่ใช่ “ทำไมถึงควรใช้มัน”
      ถ้าจะพูดถึงส่วนที่ว่า “เข้าใจยาก” ข้างต้น การทำงาน คีย์ลัด และปลั๊กอินของเอดิเตอร์อย่าง VS Code ก็มีประโยชน์มากเช่นกัน
      เอกสารของ VS Code ก็คุ้มค่าที่จะอ่านให้จริงจัง และมันช่วยทำงานได้หลายอย่างจริง ๆ
      และสำหรับบางคนรวมถึงฉันด้วย การใช้เมาส์ย้ายเคอร์เซอร์ไปตำแหน่งใดก็ได้ในบัฟเฟอร์และเลือกช่วงใดก็ได้ เป็นวิธีที่ง่ายและเร็วพอแล้ว
      KISS นั่นแหละ
    • ฉันใช้ vi mode และคำสั่งเคลื่อนที่แทบจะ everywhere แต่ใช้ vi, vim, neovim หรือ viper ของ emacs แค่เป็นครั้งคราว
      เพราะเอดิเตอร์อื่นมักเป็นเครื่องมือที่ดีกว่าสำหรับงานนั้น
      สำหรับ 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 ปี