- เหตุผลที่เลือก Helix เป็นตัวแก้ไขสำหรับพัฒนาบนเซิร์ฟเวอร์ระยะไกล คือสามารถใช้งานได้โดยไม่ต้องติดตั้งปลั๊กอินนับสิบแบบ Vim/Neovim และช่วยลดความเสี่ยงจากการโจมตีซัพพลายเชน
- ผ่าน การตั้งค่าเชื่อมต่อกับ tmux เพื่อชดเชยความสามารถด้าน file explorer และ Git TUI ที่ Helix ยังขาดอยู่ โดยตั้งให้สามารถเรียกใช้ตัวจัดการไฟล์
yazi, lazygit และอื่น ๆ แบบป๊อปอัปได้
- ย้าย คีย์ไบน์ดิงสไตล์ Vim มาใช้ เพื่อให้การเลือกบรรทัด การเลื่อนเคอร์เซอร์ การลบข้อความ ฯลฯ ทำงานคล้าย Vim และเปลี่ยนให้
ESC ใช้รีเซ็ตมัลติเคอร์เซอร์
- เพิ่มข้อมูลอย่าง Git branch, encoding, position ลงใน statusline เพื่อเพิ่มประสิทธิภาพการทำงาน
- ใช้ Tree-sitter injection เพื่อทำ syntax highlighting ให้กับ SQL query ภายใน Python/Go, code block ใน Markdown ฯลฯ ช่วยให้อ่านง่ายขึ้น
- ใช้ การตั้งค่าขั้นสูง เช่น LSP, auto-save, color mode เพื่อเพิ่มประสิทธิภาพและปรับแต่งได้ละเอียด
ที่มาของการเลือก Helix
- จากการเพิ่มขึ้นของ การโจมตีซัพพลายเชน และปัญหาการพึ่งพาปลั๊กอิน จึงเลือกใช้ Helix แทน Vim/Neovim เป็นตัวแก้ไขสำหรับพัฒนาบนเซิร์ฟเวอร์ระยะไกล
- ข้อดีหลักคือ ใช้งานได้ด้วยความสามารถพื้นฐานที่มีมาให้ โดยไม่ต้องมีปลั๊กอินของ Neovim นับสิบตัว
- หลังจากย้ายมาใช้ Helix ก็ได้ทำ การปรับแต่งการตั้งค่า เพื่อจำลอง ประสบการณ์แบบ Neovim ที่คุ้นเคยให้ได้มากที่สุด
- นำมาแชร์เพื่อช่วยให้ผู้ใช้อื่นประหยัดเวลา
การตั้งค่า Tmux
- ใช้ Tmux เป็น terminal multiplexer และเพิ่มคีย์ไบน์ดิงแบบกำหนดเองเพื่อแก้ปัญหา การไม่มี file manager และ Git TUI
- Helix ไม่รองรับการแก้ไขไฟล์จาก file explorer ทำให้ไม่สะดวกเมื่อจำเป็นต้องสลับไปมาระหว่างหลายไฟล์อย่างรวดเร็ว
- เพิ่ม binding ต่อไปนี้ในไฟล์ตั้งค่า Tmux
prefix - y: เรียก Yazi file manager เป็นหน้าต่างป๊อปอัป (ขนาด 95% ของหน้าจอ)
prefix - g: เรียก Lazygit เป็นหน้าต่างป๊อปอัป
prefix - e: เปิด ประวัติ output ของ Tmux ใน Helix เพื่อค้นหาและคัดลอก
- prefix เริ่มต้นคือ
Ctrl + b แต่เปลี่ยนมาใช้ Ctrl + \
- มีประโยชน์กับงานที่เกี่ยวกับ output ในเทอร์มินัล โดยเฉพาะเวลาคัดลอก output ของ ClickHouse client (CSV/JSON) ไปยัง Slack
- คัดลอกได้โดยตรงแทนการส่งออกเป็นไฟล์ ช่วยลดจำนวนขั้นตอน
- แม้จะใช้เมาส์ได้ แต่การเลื่อนดูบัฟเฟอร์ของ Tmux ไม่สะดวก จึงจัดการผ่าน editor จะมีประสิทธิภาพกว่า
- โดยทั่วไป Yazi และ Lazygit จะแสดงเป็น overlay อยู่เหนือ Helix editor
การย้ายคีย์ไบน์ดิงแบบ Vim
- แม้จะคุ้นกับคีย์ไบน์ดิงของ Helix แล้ว แต่ก็ยังคง ย้าย Vim binding บางส่วน มาใช้
- Binding ในโหมด Select
0: ย้ายไปต้นบรรทัด
$: ย้ายไปท้ายบรรทัด
^: ย้ายไปยังอักขระแรกที่ไม่ใช่ช่องว่าง
G: ย้ายไปท้ายไฟล์
D: เลือกจนถึงท้ายบรรทัดแล้วลบ จากนั้นสลับไปโหมด Normal
k/j: เลือกทั้งบรรทัดขึ้น/ลง (พฤติกรรมเริ่มต้นของ Helix เป็นการเลือกบางส่วน จึงไม่สะดวก)
- Binding ในโหมด Normal
D: ลบข้อความทั้งหมดทางขวาของเคอร์เซอร์ (ย้ายมาจาก Vim เพราะ Helix ต้องกดหลายครั้งเกินไป)
V: สลับไปโหมด Select แล้วเลือกทั้งบรรทัด
ESC: รีเซ็ตมัลติเคอร์เซอร์ (ค่าเริ่มต้นของ Helix คือเครื่องหมายจุลภาค ซึ่งไม่สะดวก)
- ไม่ชอบวิธีเลือกบรรทัดของ visual mode ใน Helix จึง เปลี่ยนให้เป็นสไตล์ Vim
- ตั้งค่าให้เมื่อเลื่อนขึ้น/ลง จะเลือกทั้งบรรทัด
แถบสถานะที่ปรับปรุงแล้ว
- แถบสถานะเริ่มต้นขาดข้อมูลสำคัญอย่าง Git branch ปัจจุบัน
- องค์ประกอบของการตั้งค่าแถบสถานะ
- ซ้าย: โหมด, spinner, version control, ชื่อไฟล์, สถานะอ่านอย่างเดียว, สถานะแก้ไขแล้ว
- กลาง: ว่าง
- ขวา: diagnostics, diagnostics ของ workspace, ตำแหน่ง, จำนวนบรรทัดทั้งหมด, เปอร์เซ็นต์ตำแหน่ง, file encoding, รูปแบบ line ending, file type, register, จำนวนที่เลือก
- ตัวคั่น: ใช้อักขระ
│
- ทำให้ มองเห็นสถานะการทำงานได้ในพริบตา
คีย์ไบน์ดิงที่มีประโยชน์
- คีย์ไบน์ดิงแบบกำหนดเองช่วย เพิ่มประสิทธิภาพการทำงานได้มาก แต่ใช้เวลาพอสมควรกว่าจะค้นพบ
- ฟังก์ชันที่มีประโยชน์ที่สุดคือ reload file, toggle soft wrap, Git undo, Git blame, Git diff
- รายการ custom binding ทั้งหมด
space - e - w: บันทึกบัฟเฟอร์ปัจจุบันเป็นไฟล์
space - e - c: ปิดบัฟเฟอร์ปัจจุบัน
space - e - x: ปิดบัฟเฟอร์อื่นทั้งหมด (มีประโยชน์เมื่อเปิดหลายสิบบัฟเฟอร์)
space - e - l: สลับการแสดง inlay type hint (มีประโยชน์ แต่ถ้าแสดงตลอดจะรบกวนสายตา)
+ - f: format ไฟล์ปัจจุบัน
+ - w: เรนเดอร์อักขระช่องว่าง (ใช้ตรวจดูอักขระที่มองไม่เห็นในเอกสาร)
+ - W: ปิดการเรนเดอร์อักขระช่องว่าง
space - f - .: แสดง/ซ่อนไฟล์ที่ถูก Git ignore ใน file picker
space - f - r: reload ทุกไฟล์ (มีประโยชน์มากเพราะ Helix ยังไม่รองรับ auto reload ใช้สำหรับอัปเดตการเปลี่ยนแปลงจากภายนอกหรือ gutter หลัง commit)
space - f - x: undo การเปลี่ยนแปลง Git ที่ตำแหน่งเคอร์เซอร์ปัจจุบัน
space - f - w: แสดง Git blame ของบรรทัดปัจจุบัน
space - f - d: แสดง Git diff
การตั้งค่า editor
- หลังใช้งานมา 6 เดือน จึงพบว่ามีฟังก์ชัน auto-save เมื่อสลับแท็บเทอร์มินัล
- ฟีเจอร์ใหม่บางอย่างของ Helix ถูก ปิดไว้เป็นค่าเริ่มต้น เพื่อหลีกเลี่ยงไม่ให้ผู้ใช้เดิมเจอการเปลี่ยนแปลงที่ไม่คาดคิด
- จึงต้องตรวจดูแต่ละตัวเลือกเองถึงจะพบฟีเจอร์ใหม่
- ตัวเลือกการตั้งค่าหลัก
line-number = "relative": แสดงเลขบรรทัดแบบสัมพัทธ์
rulers = [120]: ตั้งค่า เส้นไกด์แนวตั้งแบบมองเห็นได้ (มีประโยชน์เมื่อจำกัดความยาวบรรทัดสูงสุดโดยไม่ใช้ auto format)
true-color = true: บังคับรองรับ true color
completion-replace = true: auto-complete จะแทนที่ทั้งคำ
trim-trailing-whitespace = true: ลบช่องว่างท้ายบรรทัด
color-modes = true: แยกการแสดงโหมดด้วยสี
rainbow-brackets = true: ใช้สีต่างกันกับวงเล็บซ้อนกัน (ฟีเจอร์ใหม่ ยังไม่ออกเป็น release อย่างเป็นทางการ)
editor.file-picker.hidden = false: แสดงไฟล์ซ่อน (dot files) ใน file picker
editor.indent-guides.render = true: เพิ่ม เส้นไกด์การย่อหน้าแบบมองเห็นได้
editor.inline-diagnostics.cursor-line = "warning": ปรับปรุงการแสดง diagnostics (ดูภาพหน้าจอประกอบ)
editor.auto-save.focus-lost = true: บันทึกอัตโนมัติเมื่อเสียโฟกัส (ต้องมีการรองรับจากเทอร์มินัล)
editor.auto-save.after-delay.enable = true: บันทึกอัตโนมัติหลังหน่วงเวลาที่กำหนด (ตั้งไว้ที่ 300 วินาที)
การปรับ LSP
- เพิ่ม harper-ls LSP ให้กับทุกภาษา เพื่อทำ highlight ข้อผิดพลาดทางไวยากรณ์ในคอมเมนต์
Tree-sitter injection แบบกำหนดเอง
- Helix อนุญาตให้กำหนด Tree-sitter injection แบบกำหนดเอง เพื่อทำ highlighting ภาษาหนึ่งภายในอีกภาษาหนึ่งได้
- กรณีการใช้งาน
- ทำ syntax highlighting ให้กับ SQL query ภายใน Python และ Go
- ทำ highlighting ให้กับ YAML front matter และ code block ใน Markdown
- ใช้กับการทำ highlighting ของ HTML snippet ได้เช่นกัน
- อัปโหลด ไฟล์ตั้งค่าไว้บน GitHub เพื่อแชร์ custom injection และการตั้งค่า
- Helix คือเทอร์มินัลเอดิเตอร์รุ่นใหม่ที่โดดเด่นด้าน การลดการใช้ปลั๊กอิน ความปลอดภัย และการปรับแต่งที่ตรงไปตรงมา
2 ความคิดเห็น
นักพัฒนาที่ใช้ Vim มา 20 ปี เล่าประสบการณ์ ย้ายจาก Vim ไปใช้ Helix
ความคิดเห็นจาก Hacker News
ช่วงนี้กำลังจัดเซ็ตอัปเอดิเตอร์ใหม่อีกครั้ง ใช้ Emacs มา 20 ปี และ Vim ควบคู่มา 15 ปีแล้ว แต่ก็ยังเลือกไม่ได้ว่าจะเอาตัวไหนดี เป้าหมายคืออยากดูว่าจะทำเซ็ตอัปที่พร้อมใช้กับงานซอฟต์แวร์ Python ระดับองค์กรได้เร็วแค่ไหน รอบนี้โดยเฉพาะกำลังลองลดการพึ่งพาส่วนขยายจากบุคคลที่สามให้มากที่สุด และเหลือไว้เฉพาะฟังก์ชันที่จำเป็น ตอนนี้คิดว่าเซ็ตอัป Neovim ของตัวเองดีที่สุดเท่าที่เคยใช้มา แต่ก็ลงเอยด้วยการใช้ปลั๊กอินมากกว่าที่คาดไว้ ส่วนฝั่ง Emacs ยังอยู่ช่วงต้น ๆ แต่ก็น่าสนใจที่ตั้งแต่เวอร์ชัน 30 ขึ้นไป มันพัฒนาไปมากจนความจำเป็นในการใช้ปลั๊กอินภายนอกลดลงเยอะ เมื่อก่อนเคยใช้ lsp-mode แต่ตอนนี้พอใจกับ Eglot แล้ว completion preview mode แม้จะยังแทน corfu ได้ไม่หมด แต่ก็ถือว่าดีพอสมควร รายชื่อปลั๊กอินจำเป็นของ Emacs สำหรับฉันคือ Magit, Expreg(teeesitter expand region), Multiple cursors, dape(ดีบักที่ทำงานร่วมกับ Eglot) และคงจะเพิ่ม Consult กับ orderless ด้วย เซ็ตอัป Neovim ของฉันดูได้ที่นี่
nvim รุ่นใหม่ ๆ ก็กำลังลดความจำเป็นของปลั๊กอินลงเรื่อย ๆ เช่นกัน มีทั้งตัวจัดการปลั๊กอิน, diff viewer และ lsp ในตัว
คุณดูแลปลั๊กอิน nvim อยู่เยอะพอสมควรเลย! อาทิตย์ก่อนผมเพิ่งเขียนเซ็ตอัป nvim ใหม่โดยใช้ปลั๊กอินแค่ 4 ตัวรวม mini.nvim ด้วย รู้สึกเลยว่าพอใส่ปลั๊กอินเยอะ ๆ แล้วความเสถียรและความน่าเชื่อถือของ nvim ลดลงชัดเจน อิจฉาที่ฝั่ง Emacs ต้องใช้แค่ 2 ตัว และก็ดูเหมือนว่าจะเสถียรกว่ามาก เซ็ตอัปของผมดูได้ที่นี่
อยากรู้ว่าหลังจากใช้ไปหลายเดือนแล้ว คุณยังคิดอยู่ไหมว่ามันได้ประสบการณ์ใกล้เคียงกับเซ็ตอัปที่มีมาให้ของ Pycharm+IdeaVIM แน่นอนว่าการได้ปรับแต่งเองก็สนุก แต่ถ้าโฟกัสแค่เรื่องใช้ IDE ให้มีประสิทธิภาพ การทุ่มเวลาให้กับการตั้งค่า Neovim เยอะ ๆ มันก็ดูไม่ค่อยคุ้มเท่าไรไม่ใช่หรือ
Expreg(teeesitter expand region) ทำให้นึกถึง combobulate (ยังไม่เคยใช้ แต่ดูน่าสนใจมาก) เพียงแต่ Expreg ดูเรียบง่ายและเบากว่ามาก
อยากฟังประสบการณ์จากผู้ใช้ Emacs รุ่นเก๋าจริง ๆ มาก ว่าเทียบกับ Helix/Vim แล้วเป็นยังไง คนที่เพิ่งลอง Helix/Vim มักจะบอกว่าดี แต่ดูเหมือนจะยังไม่รู้คุณค่าที่แท้จริงของการใช้ Emacs มานาน ๆ เอาจริง ๆ คีย์สไตล์ Vim กับระบบโหมดต่าง ๆ ก็ดูจะถูกรวมเข้ากับเอดิเตอร์สมัยใหม่ได้ดีกว่า แต่พอลองใช้จริง ผมกลับไม่มีความอดทนพอจะรอให้มือชิน อยากฟังเรื่องราวการย้ายค่ายจากผู้ใช้ Emacs สาย hardcore จริง ๆ
ฉันเป็นคนที่ย้ายจาก Emacs → VS Code → Helix จนถึงตอนนี้ก็พยายามเรียนรู้คีย์ไบน์ดิงเดิมให้มากที่สุด และใช้งานให้มีประสิทธิภาพโดยแทบไม่แตะการตั้งค่าเลย การจำทุกอย่างที่ Helix ทำได้มันยาก เลยลองทำ deskmat สำหรับวางบนโต๊ะโดยพิมพ์คีย์ต่าง ๆ ลงไป น่าจะต้องลองพิมพ์ใช้งานจริงก่อนถึงจะรู้ว่าช่วยได้แค่ไหน deskmat ของฉันดูได้ที่นี่
ผมใช้ Emacs เป็นตัวหลักมาตลอด 10 ปีที่ผ่านมา และก่อนหน้านั้นใช้ Sublime Text สำหรับการแก้ไฟล์ง่าย ๆ หรือบนเซิร์ฟเวอร์ระยะไกลก็มีใช้ Vim บ้างเป็นครั้งคราว แต่ไม่เคยรู้สึกว่าจำเป็นต้องใช้ Vim เพียงอย่างเดียวแบบเต็มตัว ผมสร้างโมดูลและฟังก์ชันของตัวเองใน Emacs เพื่อให้ได้สภาพแวดล้อมที่เข้ามือ พอเดือนก่อนลองใช้ Helix ก็รู้สึกว่าเริ่มต้นได้ง่ายอย่างน่าประหลาด แม้แต่การใช้งานพื้นฐาน—การย้ายตำแหน่ง, ค้นหา, วาง, สลับบัฟเฟอร์/หน้าต่าง—ก็ปรับตัวได้เร็ว ผมไม่ค่อยรู้ประวัติของ Helix เท่าไร แต่ดีไซน์มันยอดเยี่ยมมาก การค้นหาแบบ global ดีมาก การเชื่อมกับ lsp ก็ทำงานได้ลงตัว และยังเร็วมากจริง ๆ ความรู้สึกที่ว่าค่าเริ่มต้นต่าง ๆ ถูกกำหนดมาอย่างสม่ำเสมอและใช้งานได้จริงนั้นสบายมาก ผมตั้งใจจะใช้มันต่อไปเรื่อย ๆ เพื่อให้คุ้นเคยขึ้น แม้เอดิเตอร์หลักจะยังเป็น Emacs แต่ Helix เร็วมากจนคิดว่าน่าจะกลายเป็นเอดิเตอร์หลักสำหรับงานเขียนโค้ดได้
ผมเพิ่งเริ่มใช้ Helix และมีข้อเสียอยู่สองอย่างที่รู้สึกได้ชัด
ผมไม่ค่อยเข้าใจว่าทำไม LSP ถึงเป็นข้อเสีย ความรู้สึกคือ LSP รันเป็นโปรเซสแยก ซึ่งกลับดีต่อการ sandbox ปลั๊กอินด้วยซ้ำ จริง ๆ แล้วอาจทำงานได้ดีกว่าปลั๊กอินของเอดิเตอร์แบบดั้งเดิมเสียอีก ส่วนเรื่องไม่มี tmux integration ผมเองแม้จะใช้ Emacs เป็นหลัก แต่แทบไม่เคยใช้ terminal ภายในเลย จึงไม่รู้สึกอะไร ถ้าแค่ย้าย muscle memory แล้วได้เอดิเตอร์ที่เร็วและเขียนด้วย rust สำหรับผมก็ถือว่าน่าเลือกมากพอแล้ว
มีคนชอบบอกว่า motion ของ Vim ใช้เป็น muscle memory ได้ทุกที่ แต่ในความเป็นจริงแทบไม่มีนักพัฒนาคนไหนอยากใช้สภาพแวดล้อม Vim เปล่า ๆ แบบไม่มีปลั๊กอินหรือการตั้งค่าเลย คนส่วนใหญ่อยากได้เอดิเตอร์ที่ปรับสภาพแวดล้อมและฟีเจอร์ให้ตรงใจตัวเองอย่างละเอียด ข้อยกเว้นก็อาจมีแค่คนที่ ssh เข้าเครื่องหลายเครื่องจริง ๆ และจำเป็นต้องใช้สภาพแวดล้อมเอดิเตอร์พื้นฐานเท่านั้น เรื่องที่บอกว่า Helix เรียบง่ายและขยายด้วยปลั๊กอินได้น้อยนั้น เดิมที Helix ตั้งใจจะเป็นเอดิเตอร์แบบ all-in-one แต่ชุมชนไม่ต้องการแบบนั้น จึงกำลังพัฒนาระบบปลั๊กอินอยู่ แม้ยังไม่รวมในรีลีสหลัก แต่ใน branch แยกก็มีปลั๊กอินหลายตัวที่สร้างและใช้งานกันแล้ว ผมคิดว่าการเลื่อนรีลีสออกไปจนกว่าระบบปลั๊กอินจะเสถียรพอนั้นเป็นการตัดสินใจที่ถูกต้อง จุดแข็งที่สุดของ Helix คือมันแก้ UX ที่ยังอึดอัดใน vi/vim/neovim ได้ กล่าวคือมันสลับลำดับการทำงาน ทำให้ดูสิ่งที่เปลี่ยนไปก่อน commit ได้ง่าย ลดผลข้างเคียงที่ไม่ได้ตั้งใจ
ระดับการตั้งค่าแบบนี้ ผมว่ากลับไปใช้ vim ตรง ๆ น่าจะดีกว่า เหมือนกำลังพยายามจำลองฟังก์ชันของ vim ใน Helix และ Helix เองก็มี dependency ภายในเยอะเหมือนกัน (แค่ไม่เห็นบนผิวหน้าแบบ nvim) เซ็ตอัป vim8 ของผมคงความเรียบง่ายมาเกิน 8 ปีแล้ว เหตุผลที่ใช้ vim8 ก็เพราะมันเป็นเวอร์ชันที่มีอยู่ในดิสโทร LTS ปลั๊กอินที่โหลดอัตโนมัติมีแค่ตัวเดียว (
vim-tmux-navigatorเอาไว้ย้ายระหว่างหน้าต่างแยกของ vim กับ tmux ได้ง่าย) ผมตรวจโค้ดแล้วและก็ไม่อัปเดตมันด้วย ส่วนปลั๊กอินแบบ "เลือกใช้" อีกสองตัว จะเปิดเฉพาะเวลาจำเป็นผ่านตัวจัดการแพ็กเกจในตัวของ vim ด้วย:packadd!เท่านั้น ใช้แค่ ale(lsp, diagnostics, auto format ตอนบันทึก) กับ vim-fugitive(git integration) โดย ale ไม่มี dependency ส่วน vim-fugitive ก็แค่ติดตั้งครั้งเดียวแล้วใช้ได้เลย เหตุผลที่ไม่โหลดปลั๊กอินอัตโนมัติก็เพราะปกติ vim ใช้เพื่อแก้ไขอย่างรวดเร็วเป็นหลัก และจะเปิด git/lsp เฉพาะตอนทำโปรเจกต์ระยะยาวเท่านั้น ปลั๊กอินที่ไม่จำเป็นก็ไม่ต้องใช้ก็ได้ผมเองก็ชอบ modern Neovim เลยทำแพ็กเกจ Python ตัวหนึ่งขึ้นมาเพื่อแก้ปัญหานี้ (โดยเฉพาะสำหรับคนที่อยู่ใน ecosystem ของ python อยู่แล้ว หรือใช้ uv, pipx) ตอนนี้ติดตั้ง Neovim รุ่นล่าสุดได้ด้วย
uv tool install binwheels-neovimหรือpipx install binwheels-neovimและใช้งานได้ทันทีบน Windows, macOS, Linux แพ็กเกจนี้เป็น wrapper ของรีลีสทางการของ Neovim โดยใช้ uv หรือ pipx ดึงไบนารีให้ตรงกับระบบปฏิบัติการ/สถาปัตยกรรม สำหรับ Linux ต้องการรองรับ GLIBC ที่เก่ากว่ารีลีสทางการ ก็เลย build แยกและแจกให้ ดูข้อมูลเพิ่มได้ที่ PyPI, Github หลัก, บันทึกการ buildHelix มีพื้นที่เสี่ยงต่อ supply chain attack เล็กมากเมื่อเทียบกับ nvim+ปลั๊กอินต่าง ๆ เพราะ Helix ดูแลรวมอยู่ในตัวมันเอง ขณะที่ nvim มี vendor แยกตามปลั๊กอิน จึงปลอดภัยกว่ามาก อีกทั้ง Helix ยังออกรุ่นอย่างช้าและรอบคอบ ทำให้แม้มีช่องโหว่ก็มีโอกาสกลายเป็นปัญหาใหญ่ได้น้อย
โมเดลการแก้ไขข้อความของ Helix เหนือกว่ามาก
ถ้าต้องการ TUI ตอนใช้ Helix ก็สงสัยเหมือนกันว่าทำไมไม่ใช้ neovim ไปเลย ผมชอบค่าเริ่มต้นของ Helix นะ แต่พอถึงจุดหนึ่งที่ต้องเริ่มเปลี่ยนอะไรบางอย่าง ก็รู้สึกว่ามันเริ่มยุ่งขึ้นเรื่อย ๆ แล้วถ้าต้องการ 'ประสบการณ์แบบ IDE เต็มรูปแบบ' ใน Helix ก็ไม่ค่อยเข้าใจเหมือนกันว่าทำไมจะไม่ใช้ Zed, VSC หรือ JetBrains IDE ไปเลย ถ้าผมต้องการอะไรเรียบง่ายก็จะใช้ nvim แต่ถ้าต้องการฟังก์ชันมากขึ้นก็เปิด WebStorm หรือไม่ก็ใช้สิ่งนั้นร่วมกับเพื่อนร่วมงานเวลาต้องหาบางอย่าง
เวลาทำงานผ่าน ssh บนอุปกรณ์สเปกต่ำ helix เปิดแทบจะทันที ถ้าจะประกอบความสามารถใกล้เคียงกันใน nvim มันจะช้าลง และมีต้นทุนในการดูแลการตั้งค่ากับอัปเดตปลั๊กอินสูงขึ้น อีกอย่างผมรู้ rust เลยสามารถช่วยแก้บั๊กได้ด้วย ผมไม่รู้ภาษาในตระกูล c จึงชอบโปรเจกต์โอเพนซอร์สที่เขียนด้วยภาษาที่ตัวเองรู้ ผมเป็นคนเขียนโค้ดเป็นงานอดิเรกที่ใช้ n/vim มา 12 ปี แล้วเพิ่งย้ายมา helix ใน 2 ปีหลัง จริง ๆ ก็ยังมีหลายอย่างใน nvim ที่คิดถึงและบางอย่างก็ดูเป็นธรรมชาติกว่า แต่ helix มัน "เปิดแล้วใช้ได้เลย" จริง ๆ และความสบายแบบนั้นชนะทุกอย่าง
ตลอดไม่กี่ปีที่ผ่านมา ผมเคยลองใช้ neovim, helix, emacs, nano อย่างละช่วงหนึ่ง และประสบการณ์แบบ out-of-the-box ของ helix นั้นดีที่สุดแบบทิ้งห่าง ค่าเริ่มต้นตั้งมาได้ดีมาก และมีวิธีช่วยเหลือตามบริบทกับ hint ที่ยอดเยี่ยม ทำให้ไม่จำเป็นต้องจำคำสั่งที่ใช้บ่อยทั้งหมด และคำสั่งที่ใช้นาน ๆ ครั้งก็หาเจอได้ง่าย อีกอย่างหนึ่งคือในหัวของผม ลำดับการทำงานของคำสั่งใน helix มันดูเป็นธรรมชาติกว่า vim เอดิเตอร์ยุคนี้อย่าง nvim/spacemacs มีอุปสรรคเรื่องปลั๊กอิน/การตั้งค่าสูงเกินไป แม้ ecosystem ของปลั๊กอินจะทำให้ทำสิ่งที่ helix ยังทำไม่ได้ในตอนนี้ได้ (เช่น emacs สามารถใช้ภาษาในตระกูล lisp ไหนก็ได้แบบ IDE แต่ helix ยังโหลด repl ไม่ได้) แต่นั่นก็หมายความว่าไม่ใช่แค่ต้องเรียนรู้ตัวเอดิเตอร์เอง ยังต้องเรียนรู้ปลั๊กอินอีกมากมายด้วย และพอค้นหาข้อมูล คำตอบก็สับสนเพราะต่างกันไปตามเวอร์ชัน/ชุดการตั้งค่า สุดท้ายเวลาจะเริ่มใหม่ก็มักต้องเชื่อคำแนะนำของคนอื่น หรือไม่ก็เสียเวลาเพิ่มไปกับการลองเองและเรียนรู้เอง Helix เป็นโปรเจกต์ใหม่ จึงไม่มีภาระจากการตัดสินใจสมัยเก่า และสามารถเลือกการตัดสินใจรวมถึงค่าเริ่มต้นที่เข้ากับรูปแบบการพัฒนาสมัยใหม่ได้ ถึงจะไม่สมบูรณ์แบบ แต่ถ้าจะให้แนะนำอะไรสักตัวสำหรับคนเริ่มต้นกับ TUI ที่อยากได้ของที่ใช้ได้ทันทีและเริ่มได้ง่ายโดยไม่ต้องตั้งค่า ผมก็อยากแนะนำ helix
hx ทั้งเริ่มต้นและทำงานได้เร็ว แถมยังสวยอีกด้วย ค่าเริ่มต้นก็น่าพอใจมากจนผมแก้นิดหน่อยก็พอ และต่างจาก emacs/neovim ที่ผมมักจมอยู่กับ endless improvement loop, hx ให้ความรู้สึกว่ามันมีจุดจบให้ถึง TUI ก็ทำงานได้ดีบนเซิร์ฟเวอร์ระยะไกลด้วย ทำให้ผมใช้สภาพแวดล้อมเดียวกันได้ทั้งบน mac, linux และเซิร์ฟเวอร์ (เอดิเตอร์อื่นก็ทำได้เหมือนกัน แต่ hx ก็รองรับได้ดี) lsp ที่ต้องใช้ก็รองรับครบ แม้การตั้งค่า
languages.tomlจะยุ่งนิดหน่อย แต่เอดิเตอร์อื่น ๆ ก็ไม่ต่างกันผมชอบการตั้งค่าที่เรียบง่าย และชอบ selection-first editing model ด้วย มีเอกสารอ้างอิงเกี่ยวกับเรื่องนี้อยู่ที่นี่ พอคุยกับคนที่ปรับตัวกับ Vim ยาก ก็เลยรู้สึกว่าจริง ๆ แล้วผมน่าจะคุ้นกับโมเดลแบบ Helix ที่ "เลือกก่อน" มาตั้งแต่แรก การทำงานแบบ Vim ที่ไม่เห็นข้อความเป้าหมายก่อน (คือเห็นขอบเขตที่ได้รับผลหลังสั่งคำสั่งแล้ว) สำหรับผมนั้นปรับตัวยาก
การเลือกเอดิเตอร์ไม่ใช่การตัดสินใจที่มีเหตุผลล้วน ๆ มากนัก แต่มีปัจจัยทางจิตวิทยาอย่างรสนิยม ความสดใหม่ หรือความสนุก เข้ามาเกี่ยวมากกว่าเยอะ
เพิ่งรู้จักคำสั่ง
:reset-diff-changeเป็นครั้งแรก ปกติผมใช้แค่checkout -pใน git มาตลอด แต่ทำจากใน Helix ได้เลยสะดวกกว่ามากผมลองใช้ Helix และฝึกปรับตัวอย่างจริงจังจนตอนนี้ใช้ได้คล่องแล้ว แต่กลับค้นพบว่า "workflow แบบย้อนลำดับ" นี้ แม้จะเรียนรู้ง่ายและทำให้พัฒนาได้ง่าย ทว่าพอใช้จริงกลับช้าลง สุดท้ายเลยกลับไปใช้ Vim แล้วก็ Zed(Vim mode) อีกครั้ง
วันนี้เพิ่งลอง Helix ครั้งแรก มันเป็นเอดิเตอร์ที่ออกแบบมาดีมากจริง ๆ แต่ก็ยังเสียดายที่ไม่มีคีย์ลัดทำงานเร็วแบบ Vim อย่าง y2$, dw
ผมยังหาวิธีลบบรรทัดปัจจุบันใน Helix แบบรวมบรรทัดว่างด้วยไม่เจอเลย "xd" จะลบหนึ่งบรรทัดถ้าเป็นบรรทัดที่ไม่ว่าง แต่ถ้าเป็นบรรทัดว่างจะกลายเป็นลบสองบรรทัดพร้อมกัน
x คือเลือกบรรทัดปัจจุบัน และถ้าเลือกอยู่แล้วจะขยายไปยังบรรทัดถัดไป ส่วน X คือขยายการเลือกไปยังขอบเขตของบรรทัด (line-wise selection) ใช้ X ได้เลย
ถ้าเป็นบรรทัดว่าง ก็ใช้แค่ "d"
แอบน่ารำคาญอยู่เหมือนกัน ผมเองก็ใช้ trivial fork ที่เปลี่ยนพฤติกรรมของ x บนบรรทัดว่างให้ต่างออกไป รายละเอียดดูได้ในPR นี้