ภาพรวมของการจัดการหน้าต่างใน Emacs
ชื่อเสียงและศักยภาพของการจัดการหน้าต่าง
- การจัดการหน้าต่างของ Emacs มีชื่อเสียงไม่ค่อยดีนัก
- ส่วนใหญ่เป็นผลมาจากการผสานระหว่างระบบเลย์เอาต์ที่ยืดหยุ่นและละเอียดมาก กับการควบคุมที่ค่อนข้างหยาบ
- แต่ก็ยังเปิดพื้นที่ให้สร้างและใช้เครื่องมือที่มอบอุปมาและ affordance ที่ดีกว่าสำหรับการจัดการหน้าต่างได้
ตัวเลือกพื้นฐานสำหรับการจัดการหน้าต่าง
other-window และ "หน้าต่างถัดไป"
other-window (C-x o) มอบประสบการณ์พื้นฐานสำหรับการสลับหน้าต่าง
- นี่คือสิ่งที่สอนในบทเรียน Emacs และทำงานได้ดีเมื่อมีหน้าต่างไม่มาก
- การเลือกหน้าต่างจะวนรอบทั้งเฟรมในทิศตามเข็มนาฬิกาโดยประมาณ
windmove
windmove เป็นไลบรารีในตัวของ Emacs สำหรับย้ายโฟกัสระหว่างหน้าต่างตามทิศทาง และย้ายบัฟเฟอร์ข้ามหน้าต่าง
- เป็นความสามารถที่ผู้ใช้ Vim มักคาดหวัง และผู้ใช้
evil-mode ก็ใช้งาน Windmove อยู่แล้ว
- ใช้งานโดย bind
windmove-left, -right, -up, -down เข้ากับคีย์ที่สัมพันธ์กับทิศทาง
frames-only-mode
frames-only-mode ทำให้ Emacs ปล่อยการจัดการหน้าต่างให้ระบบปฏิบัติการจัดการแทนได้
- หากเปิดทุกบัฟเฟอร์ในเฟรมใหม่ ก็จะกลายเป็นงานของตัวจัดการหน้าต่าง
- วิธีนี้ทำให้บัฟเฟอร์ของ Emacs เทียบเท่ากับหน้าต่างของ OS และจัดการด้วยคีย์เดียวกันได้
winum-mode
- Winum เป็นพัฒนาการตามธรรมชาติของความพยายามในการสลับระหว่างหน้าต่างจำนวน n บาน จาก O(n) (
other-window) เป็น O(√n) (windmove) และไปถึง O(1)
- มันเพิ่มหมายเลขหน้าต่างลงใน mode line เพื่อให้เลือกหน้าต่างด้วยหมายเลขได้
- เมื่อ minibuffer ถูกใช้งาน จะได้รับหมายเลข 0 เสมอ
ace-window
- ace-window คือที่สุดของการควบคุมหน้าต่างใน Emacs ด้วยคีย์บอร์ด
- มันแสดง "คำใบ้" ไว้ด้านบนของแต่ละหน้าต่าง และเมื่อกดคีย์ที่ตรงกัน โฟกัสจะย้ายไปยังหน้าต่างนั้น
- เป็นวิธีทั่วไปในการ "เลือก" หน้าต่าง แล้วให้ผู้ใช้ตัดสินใจว่าจะทำอะไรกับหน้าต่างนั้น
- นอกจากงานที่มีมาให้ เช่น ลบหน้าต่าง ย้ายหรือสลับหน้าต่าง แบ่งหน้าต่าง และแสดงบัฟเฟอร์แล้ว ยังสามารถเพิ่มงานแบบกำหนดเองได้อีกด้วย
การใช้เมาส์
- ข้อดีของการใช้เมาส์เพื่อจัดการหน้าต่างนั้นเห็นได้ทันทีและชัดเจน
- การเลือกหน้าต่างเป็นการต่อยอดตามธรรมชาติของการใช้เมาส์พื้นฐาน และการปรับขนาดหน้าต่างก็ทำได้ง่าย
- เมนูตามบริบทและการรองรับ drag-and-drop นั้นใช้งานได้อย่างเป็นธรรมชาติมาก
- เพื่อลดข้อเสีย หากคุณใช้เมาส์ทำงานอย่างอื่นอยู่แล้ว การควบคุม Emacs ด้วยเมาส์ก็อาจเป็นเส้นทางที่มีแรงต้านน้อยที่สุดจริง ๆ
transpose-frame (หมุน กลับด้าน และสลับซ้ายขวา)
- transpose-frame มีคำสั่งสำหรับหมุนหรือสะท้อนเลย์เอาต์หน้าต่างในเฟรม
- ผู้ใช้มัก bind
rotate-frame, flip-frame, flop-frame ไว้กับคีย์ที่เหมาะสมเพื่อใช้บ่อย ๆ
window-prefix-map
window-prefix-map ถูก bind ไว้ที่ C-x w โดยปริยาย และรวบรวมคำสั่งจัดการหน้าต่างที่มีประโยชน์หลายตัว
split-root-window-right และ split-root-window-below ใช้แบ่ง root window ของเฟรม
tab-detach และ tear-off-window เป็นคำสั่งสะดวกสำหรับย้ายหน้าต่างไปยังแท็บใหม่หรือเฟรมใหม่
other-window-prefix
other-window-prefix มอบวิธีแยกการเลือกหน้าต่างออกจากการแสดงบัฟเฟอร์ และแก้ปัญหาความไม่สะดวกเกี่ยวกับหน้าต่างได้ สามอย่าง
- คำสั่งจำนวนมากใน Emacs ผูกงานหลัก บัฟเฟอร์ และหน้าต่างเข้าด้วยกันอย่างแน่นหนา การใช้
other-window-prefix ทำให้สามารถแสดงบัฟเฟอร์ของคำสั่งในอีกหน้าต่างหนึ่งได้
- การใช้
other-window-prefix ทำให้เลือกหน้าต่างได้ตอนเปิดใช้งานวัตถุอย่างลิงก์
- การใช้
other-window-prefix ยังทำให้เปิดวัตถุประเภท "ลิงก์" ได้อย่างสม่ำเสมอ โดยไม่ต้องปรับตามวิธีทำงานของผู้เขียนแพ็กเกจแต่ละรายหรือทำการปรับแต่งเอง
การบันทึกและกู้คืนการจัดวางหน้าต่าง
window-configuration-to-register เป็นเครื่องมือที่ค่อนข้างทื่อ แต่เหมาะอย่างยิ่งในฐานะปุ่มรีเซ็ตสีแดงขนาดใหญ่
- คุณสามารถใช้คำสั่งนี้ได้ทุกเมื่อเพื่อบันทึกการจัดวางหน้าต่างปัจจุบันลงใน register แล้วกู้คืนด้วย
jump-to-register
- หากใช้
winner-mode ก็สามารถให้ Emacs เก็บสแตกของการจัดวางหน้าต่างก่อนหน้าไว้ได้
การสำรวจเชิงลึก
วิธีสลับไปมา
- ไม่ว่าจะมีหน้าต่างเปิดอยู่พร้อมกันกี่บาน ในกรณีส่วนใหญ่คุณแค่ต้องสลับระหว่างสองหน้าต่าง
- สามารถใช้คำสั่ง
other-window-mru เพื่อสลับระหว่างคู่หน้าต่างได้
การปรับปรุง other-window
- สามารถทำให้
other-window แบ่งเฟรมได้เมื่อมีหน้าต่างเดียว
- สามารถให้มันวนหน้าต่างตามลำดับการใช้งานล่าสุดแทนลำดับเชิงพื้นที่ได้ (
switchy-window package)
- สามารถสลับทิศทางการเปลี่ยนหน้าต่างทุกครั้งที่เรียกใช้ เพื่อให้สลับสองหน้าต่างแบบสลับไปมาได้อย่างเป็นธรรมชาติ
ใช้เวทมนตร์หน้าต่างด้วย ace-window dispatch
ace-window ทำกับหน้าต่างในแบบเดียวกับที่ completing-read ทำกับรายการสตริง
aw-select เหมาะอย่างยิ่งสำหรับสองขั้นตอนแรกจากสามขั้นตอนของการเรียกงาน ทุกชนิด บน ทุกหน้าต่าง ได้แก่ การกรองและการเลือก
ace-window-one-command ทำให้สามารถเลือกหน้าต่างด้วย ace-window แล้วรันคำสั่งง่าย ๆ ใดก็ได้ บนหน้าต่างนั้น
ace-window-prefix คล้ายกับ other-window-prefix แต่ให้เลือกหน้าต่างที่จะใช้แสดงบัฟเฟอร์ของคำสั่งถัดไปได้อย่างชัดเจน
จำเป็นต้องสลับหน้าต่างจริงหรือ?
- การเคลื่อนที่แบบไม่ยึดติดกับหน้าต่างโดยใช้ Avy เป็นกรณีพิเศษของแนวคิดที่กว้างกว่านั้น
- ในฐานะภาชนะของข้อความ หน้าต่างอาจเป็นนามธรรมที่ไม่จำเป็น
mark-ring และ global-mark-ring ติดตามตำแหน่งที่เคยย้ายไป ทำให้สามารถย้ายข้ามทั้งหน้าต่างได้เมื่อจำเป็น
- สามารถใช้
point-to-register และ jump-to-register เพื่อปักหมุดตำแหน่งสำหรับย้ายกลับมาในภายหลังด้วยตนเอง
- การสร้างและย้ายไปยัง bookmark มอบตัวเลือกมากมายในการนำทางข้ามหน้าต่างไปยังตำแหน่งที่มีความหมายซึ่ง Emacs หรือผู้ใช้ระบุไว้
จัดการหน้าต่างโดยไม่ต้องโต้ตอบกับหน้าต่าง
- สามารถแก้ปัญหาหน้าต่างเด้งไปมาคล้าย whack-a-mole ได้ด้วย
display-buffer-alist และพฤติกรรมหน้าต่างอัตโนมัติ
- หากกำหนดกฎสำหรับบัฟเฟอร์ทุกประเภทที่คุณเห็นใน Emacs เป็นประจำ การจัดการหน้าต่างส่วนใหญ่ก็จะถูกแก้ไปเอง
- ปัญหาของ
display-buffer-alist ไม่ใช่ว่ามันใช้ไม่ได้ แต่คือมันต้องทำงาน เยอะมาก
- แพ็กเกจ Shackle จะครอบทับความประหลาดของ
display-buffer-alist และมอบอินเทอร์เฟซ elisp ที่เรียบง่ายขึ้นสำหรับระบุกฎของหน้าต่าง
- ดิสทริบิวชันของ Emacs มักให้เครื่องมือที่ง่ายขึ้นสำหรับระบุการตั้งค่าเหล่านี้
Popper, Popwin, shell-pop และ vterm-toggle
- Popwin และ Popper ตั้งอยู่บนข้อสังเกตที่ว่าไม่ใช่ทุกบัฟเฟอร์จะถูกสร้างมาเท่าเทียมกัน
- แพ็กเกจเหล่านี้ช่วยให้กำหนดบัฟเฟอร์ป๊อปอัปที่ใช้หน้าต่างเสริม และเรียกหรือซ่อนหน้าต่างเหล่านั้นได้ตามต้องการ
ส่วนที่ยังขาดหาย
window-tree
- มีความต่างพื้นฐานระหว่างวิธีที่ Emacs ใช้แทนหน้าต่าง กับวิธีจัดการหน้าต่างผ่านแนวทางต่าง ๆ ที่กล่าวถึงข้างต้น
- หน้าต่างของเฟรมถูกจัดเป็นโครงสร้างต้นไม้ โดยโหนดใบคือหน้าต่าง "จริง" ส่วนที่เหลือคือหน้าต่าง "ภายใน"
- การเพิ่มคำสั่งสำหรับจัดการ window-tree จะเปิดความเป็นไปได้ใหม่ ๆ ได้มากมาย
ตัวประสานกับตัวจัดการหน้าต่างแบบ tiling
- โมเดล window-tree ของ Emacs แทบจะเหมือนกับโมเดลของตัวจัดการหน้าต่างแบบ tiling ที่ควบคุมด้วยมืออย่าง i3 หรือ bspwm
- จึงเกิดคำถามขึ้นโดยธรรมดาว่าทำไมต้องใช้ตัวจัดการหน้าต่างแบบ tiling อีกตัวหนึ่งอยู่ภายในตัวจัดการหน้าต่างแบบ tiling
- หาก Emacs มีอินเทอร์เฟซที่สะอาดและเป็นหนึ่งเดียวมากขึ้นสำหรับการผสานกับตัวจัดการหน้าต่างทุกชนิด เรื่องนี้ก็น่าจะง่ายขึ้นมาก
มุมมองในอนาคต
- มีวิธีมากมายในการสลับ ย้าย ข้าม สร้าง ลบ และจัดการหน้าต่าง รวมถึงหลายวิธีในการควบคุมการแสดงหน้าต่างแบบเฉพาะหน้าตอนเรียกคำสั่ง ตลอดจนวิธีทำงานกับหน้าต่างและวิธีที่ไม่ต้องคิดถึงหน้าต่างเลย
- การจัดการหน้าต่างไม่ได้ซับซ้อนเท่ากับมันเปิดกว้าง
- Emacs มอบวัตถุดิบและแนวทางบางส่วนให้ และวัตถุดิบเหล่านั้นก็พอใช้เป็นมื้อพื้นฐานได้ในตัวเอง
- แต่ด้วยการปรุงสักเล็กน้อย เราก็ทำสิ่งที่อร่อยได้
ความเห็นของ GN⁺
- การจัดการหน้าต่างเป็นหนึ่งในจุดอ่อนที่ใหญ่ที่สุดของ Emacs และไม่เป็นมิตรกับผู้ใช้ โดยเฉพาะสำหรับผู้เริ่มต้นอาจทำให้สับสนได้
- วิธีต่าง ๆ ที่นำเสนอสามารถช่วยบรรเทาปัญหาการจัดการหน้าต่างของ Emacs ได้ แต่ไม่ใช่วิธีแก้ที่ต้นเหตุ จำเป็นต้องมีระบบจัดการหน้าต่างที่ใช้งานง่ายและเป็นธรรมชาติมากกว่านี้
- การจัดการหน้าต่างของ Emacs มีความยืดหยุ่นสูงมาก
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ด้านล่างคือสรุปความคิดเห็นจาก Hacker News:
ace-window,ace-window-display-mode,frames-only-modeเป็นต้นwindmove-modeและใช้ `(windmove-default-keybindings 'control)`` เพื่อให้ย้ายหน้าต่างด้วย Ctrl+ปุ่มลูกศรได้zygosporeซึ่งหลังจากปิดหน้าต่างด้วยC-x 1แล้ว หากกดC-x 1อีกครั้ง ก็จะกู้เลย์เอาต์หน้าต่างก่อนหน้ากลับมาได้hledger-balance-sheetโดยให้ไฟล์ journal เปิดค้างไว้ทางซ้าย และแสดงผลลัพธ์ทางขวาแบบแบ่งพื้นที่ 30%