1 คะแนน โดย GN⁺ 2024-05-13 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ภาพรวมของการจัดการหน้าต่างใน 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 ความคิดเห็น

 
GN⁺ 2024-05-13
ความคิดเห็นจาก Hacker News

ด้านล่างคือสรุปความคิดเห็นจาก Hacker News:

  • แนะนำวิธีปรับขนาดหน้าต่างสองบานให้เป็นสัดส่วน 70% ต่อ 30% ด้วยฟังก์ชัน Elisp แบบกำหนดเอง พร้อมมีโค้ด Lisp ให้ด้วย
  • เสนอให้ลองใช้แพ็กเกจอย่าง ace-window, ace-window-display-mode, frames-only-mode เป็นต้น
  • มีความเห็นว่าควรใช้ Emacs ในโหมดหน้าต่างเดียว และแม้ว่าจะเลี่ยงไม่ได้จนเกิดหลายหน้าต่างขึ้นมา ก็ให้ปิดโดยอัตโนมัติ
  • มีทิปให้เปิดใช้ windmove-mode และใช้ `(windmove-default-keybindings 'control)`` เพื่อให้ย้ายหน้าต่างด้วย Ctrl+ปุ่มลูกศรได้
  • แนะนำแพ็กเกจ zygospore ซึ่งหลังจากปิดหน้าต่างด้วย C-x 1 แล้ว หากกด C-x 1 อีกครั้ง ก็จะกู้เลย์เอาต์หน้าต่างก่อนหน้ากลับมาได้
  • มีคอมเมนต์ที่ชื่นชมการกล่าวถึงเอดิเตอร์ Acme ด้วย
  • มีคำถามเกี่ยวกับวิธีรันฟังก์ชัน hledger-balance-sheet โดยให้ไฟล์ journal เปิดค้างไว้ทางซ้าย และแสดงผลลัพธ์ทางขวาแบบแบ่งพื้นที่ 30%