เป็นเวลาหลายทศวรรษที่ผู้ใช้ Emacs ได้ถกเถียงกันถึงข้อดีของการใช้ตัวแก้ไขข้อความอันทรงพลังนี้ในโหมดเทอร์มินัลเทียบกับโหมดกราฟิก ในขณะที่บางคนเชื่อมั่นในเวอร์ชัน GUI ที่มีความสามารถในการแสดงภาพตัวอย่างและไฟล์ PDF แต่บางคนกลับชอบการแก้ไขผ่านเทอร์มินัลที่เบาและมีประสิทธิภาพ การอภิปรายต่อเนื่องนี้ได้รับพลังงานใหม่เมื่อผู้ใช้แบ่งปันวิธีแก้ปัญหาคีย์ลัดที่ยังคงมีอยู่และค้นพบเทคโนโลยีเทอร์มินัลเกิดใหม่ที่อาจปรับโฉมประสบการณ์การใช้ Emacs ใหม่
ความท้าทายของคีย์ลัดใน Terminal
การรัน Emacs ในโหมดเทอร์มินัลนำเสนอความท้าทายเฉพาะตัวที่ผู้ใช้ GUI ไม่เคยพบเจอ ปัญหาพื้นฐานเกิดจากวิธีที่เทอร์มินัลเอมูเลเตอร์จัดการกับการป้อนข้อมูลจากแป้นพิมพ์ก่อนที่ข้อมูลจะไปถึง Emacs เอง คีย์ผสมที่ซับซ้อนอย่างเช่น Ctrl+Backspace มักจะถูกแปลงหรือหายไประหว่างทางจากเทอร์มินัลไปยังแอปพลิเคชัน ปัญหานี้เห็นได้ชัดยิ่งขึ้นสำหรับผู้ใช้ที่มีเลย์เอาต์แป้นพิมพ์ที่ไม่ใช่ QWERTY หรือภาษาที่ต้องใช้ตัวอักษรที่มีเครื่องหมาย
ผู้ใช้หนึ่งคนได้สรุปความรู้สึกของชุมชนเกี่ยวกับข้อจำกัดของเทอร์มินัลได้อย่างสมบูรณ์แบบ: ฉันไม่เคยเข้าใจจริงๆ กับการรัน Emacs ในเทอร์มินัล แต่เลือกที่จะรันเทอร์มินัลภายใน GUI Emacs แทน มุมมองนี้เน้นย้ำว่าผู้ใช้จำนวนมากชอบการฝังฟังก์ชันการทำงานของเทอร์มินัลไว้ภายในสภาพแวดล้อม Emacs แบบกราฟิกมากกว่าวิธีการแบบตรงกันข้าม
โซลูชันเกิดใหม่และโปรโตคอล Terminal
ชุมชนได้รวมตัวกันรอบๆ โซลูชันทางเทคนิคหลายอย่างเพื่อปรับปรุงประสบการณ์ Emacs ในเทอร์มินัล Kitty Keyboard Protocol (KKP) ได้ปรากฏขึ้นเป็นแนวทางที่มีความหวัง โดยผู้ใช้รายงานความสำเร็จในการใช้มันกับเทอร์มินัลเอมูเลเตอร์อย่างเช่น Kitty และ Ghostty โปรโตคอลนี้เปิดใช้งานการตรวจจับคีย์ที่เชื่อถือได้มากขึ้นและแม้แต่การแมปคีย์ลัดซูเปอร์และสลับคีย์ปรับค่า - ฟังก์ชันการทำงานที่ก่อนหน้านี้ไม่น่าเชื่อถือในสภาพแวดล้อมเทอร์มินัล
อย่างไรก็ตาม การนำโซลูชันเทอร์มินัลเฉพาะบางตัวไปใช้ได้จุดประกายการโต้เถียงของตัวเอง ผู้ใช้บางคนแสดงความกังวลเกี่ยวกับการเก็บข้อมูลเทเลเมทรีในเทอร์มินัลเอมูเลเตอร์บางตัว โดยชี้ให้เห็นว่า Kitty โทรศัพท์กลับบ้าน โดยส่งข้อมูลไปยังเซิร์ฟเวอร์ด้วยการเลือกไม่ส่งข้อมูลเทเลเมทรี แทนที่จะเป็นการเลือกส่ง สิ่งนี้ทำให้สมาชิกในชุมชนบางส่วนหันไปสำรวจเทอร์มินัลทางเลือกที่เคารพความเป็นส่วนตัวในขณะที่ยังคงความเข้ากันได้กับโปรโตคอลแป้นพิมพ์
Terminal Emulators สำหรับ Emacs
- Kitty: รองรับโปรโตคอล KKP และข้อความขนาดผันแปรได้ แต่มีการเก็บข้อมูลการใช้งานแบบ opt-out
- Ghostty: เข้ากันได้กับ KKP เป็นทางเลือกที่เน้นความเป็นส่วนตัว
- iTerm2 (macOS): เข้ากันได้กับ KKP แต่อาจไม่รายงานปุ่ม Super
- ตัวเลือกในตัว: M-x shell (พื้นฐาน), vterm (ประสิทธิภาพสูง), eat (การจัดการปุ่มกดที่ดีกว่า)
สถาปัตยกรรม Client-Server และการบูรณาการกับระบบ
ผู้ใช้ Emacs ที่มีประสบการณ์หลายคนได้ก้าวข้ามการใช้งาน emacs -nw
แบบง่ายๆ ไปสู่การตั้งค่า client-server ที่ซับซ้อน แนวทางการบูรณาการกับ systemd ซึ่ง Emacs ทำงานเป็นเดมอนพื้นหลังและผู้ใช้เชื่อมต่อผ่าน emacsclient
ได้รับความนิยมเนื่องจากความเร็วและประสิทธิภาพ สถาปัตยกรรมนี้ขจัดความล่าช้าในการเริ่มต้นและเปิดใช้งานการสร้างเฟรมทันทีในขณะที่รักษาสถานะของเซสชัน
ชุมชนได้ปรับปรุงแนวทางนี้เพิ่มเติมโดยการรัน Emacs server แยกกันสำหรับอินเทอร์เฟซ GUI และเทอร์มินัล ซึ่งช่วยให้ผู้ใช้สามารถรักษาการกำหนดค่าที่แตกต่างกันสำหรับแต่ละสภาพแวดล้อม - รักษาธีมเทอร์มินัลให้เป็นสีเข้มอย่างสม่ำเสมอในขณะที่อนุญาตให้ธีม GUI เปลี่ยนแปลงได้ตลอดทั้งวัน ดังที่ผู้ใช้หนึ่งคนอธิบาย การแยกนี้ช่วยแก้ปัญหาความรำคาญที่การเปลี่ยนแปลง เช่น ธีม ถูกสะท้อนบนไคลเอ็นต์และทุกเฟรมที่เชื่อมต่อกับมัน
คำสั่ง Emacs ทั่วไปสำหรับ Terminal
emacs -nw
- เปิด Emacs ในโหมด terminal (ไม่มีหน้าต่าง)emacsclient -t
- เชื่อมต่อไปยัง Emacs server ที่มีอยู่แล้วใน terminalemacs-nox
- Emacs ที่คอมไพล์โดยไม่รองรับ GUIsystemctl --user start emacsd.service
- เริ่มต้น Emacs ในรูปแบบ user service
การจำลอง Terminal ภายใน Emacs
ที่น่าสนใจคือ ผู้ใช้ Emacs GUI จำนวนมากใช้วิธีการตรงกันข้าม - คือการรันเทอร์มินัลเอมูเลเตอร์ภายใน Emacs นั่นเอง แพ็คเกจอย่าง vterm
และ eat
(Emulate A Terminal) ได้พัฒนาจนสามารถให้การจำลองเทอร์มินัลประสิทธิภาพสูงโดยตรงภายในบัฟเฟอร์ของ Emacs ผู้ใช้รายงานว่า eat
โดยเฉพาะนั้นทำงานได้ดีเยี่ยมในสภาพแวดล้อมเทอร์มินัลด้วย การกะพริบน้อยลงมาก และดูเหมือนจะจัดการกับการส่งต่อคีย์ได้ดีกว่ามาก เมื่อเทียบกับทางเลือกอื่นๆ
การบูรณาการการจำลองเทอร์มินัลภายใน Emacs นำเสนอความท้าทายด้านความเข้ากันได้บางประการ โดยเฉพาะสำหรับผู้ใช้แพ็คเกจการแก้ไขแบบโมดอลอย่าง evil-mode
แพ็คเกจเทอร์มินัลบางตัวมีปัญหากับตำแหน่งเคอร์เซอร์และคำสั่งนำทางในโหมดปกติ ซึ่งจำเป็นต้องมีวิธีแก้ไขหรือการปรับการกำหนดค่าเพื่อให้ทำงานได้อย่างราบรื่นกับเวิร์กโฟลว์การแก้ไขยอดนิยม
โปรโตคอลทางเทคนิคที่สำคัญ
- KKP (Kitty Keyboard Protocol): ช่วยให้สามารถตรวจจับคีย์ได้อย่างน่าเชื่อถือในเทอร์มินัล
- OSC-52: โปรโตคอลเทอร์มินัลสำหรับการเข้าถึงคลิปบอร์ดใน nox builds
- Child Frames: ฟีเจอร์เทอร์มินัลที่กำลังจะมาถึงสำหรับองค์ประกอบ UI แบบลอยตัว
- Systemd Services: วิธีการสำหรับรัน Emacs เป็น daemon ในพื้นหลัง
การพัฒนาภายหน้าและความตื่นเต้นของชุมชน
ประสบการณ์ Emacs ในเทอร์มินัลยังคงพัฒนาต่อไปโดยมีฟีเจอร์ที่จะมาถึงสร้างความตื่นเต้นอย่างมีนัยสำคัญ แมสเตอร์บรานช์ของ Emacs ตอนนี้สนับสนุน child frames ในโหมดเทอร์มินัลแล้ว ซึ่งเป็นพัฒนาการที่สมาชิกชุมชนหนึ่งเน้นย้ำว่าทำให้ เปิดใช้งานเมนูเติมข้อความอัตโนมัติแบบลอยได้, กล่องแจ้งเตือน, ปฏิสัมพันธ์แบบกล่องข้อความ - ความเป็นไปได้ที่น่าสนใจทั้งหมดที่เรามีใน GUI มานานแล้ว
ความก้าวหน้านี้อาจลดช่องว่างของฟีเจอร์ระหว่าง Emacs เทอร์มินัลและกราฟิกลงอย่างมาก โดยนำองค์ประกอบ UI ที่ซับซ้อนมาสู่ผู้ใช้เทอร์มินัล นอกจากนี้ เทอร์มินัลอย่าง Kitty ได้แนะนำความสามารถข้อความขนาดแปรผัน ซึ่งในที่สุดอาจเปิดใช้งานการปรับขนาดฟอนต์ต่อเฟรมใน Emacs เทอร์มินัล - ซึ่งเป็นฟีเจอร์ที่ปัจจุบันมีเฉพาะในเวอร์ชัน GUI
การสำรวจการบูรณาการเทอร์มินัลอย่างต่อเนื่องของชุมชน Emacs สาธิตให้เห็นถึงความสามารถในการปรับตัวอันน่าทึ่งของตัวแก้ไขนี้ ไม่ว่าจะผ่านโปรโตคอลแป้นพิมพ์ที่พัฒนาขึ้น สถาปัตยกรรม client-server หรือการจำลองเทอร์มินัลแบบฝังตัว ผู้ใช้ยังคงหาวิธีที่สร้างสรรค์เพื่อปรับแต่งสภาพแวดล้อมการแก้ไขของพวกเขาให้เหมาะกับเวิร์กโฟลว์และความชอบเฉพาะ การสนทนาระหว่างผู้สนับสนุนเทอร์มินัลและ GUI ในท้ายที่สุดแล้วเป็นประโยชน์ต่อผู้ใช้ทั้งหมดโดยการขับเคลื่อนการปรับปรุงทั่วทั้งทั้งสองอินเทอร์เฟซ
อ้างอิง: Emacs in the terminal: keybindings, client and more