Tổng quan về quản lý cửa sổ trong Emacs
Danh tiếng và tiềm năng của quản lý cửa sổ
- Quản lý cửa sổ của Emacs có tiếng là không tốt
- Điều này phần lớn là hệ quả của việc kết hợp một hệ thống bố cục cực kỳ linh hoạt, chi tiết với cơ chế điều khiển thô
- Điều đó để lại dư địa để tạo và sử dụng các công cụ cung cấp phép ẩn dụ và affordance tốt hơn cho việc xử lý cửa sổ
Các tùy chọn quản lý cửa sổ cơ bản
other-window và "cửa sổ kế tiếp"
other-window (C-x o) cung cấp trải nghiệm chuyển đổi cửa sổ cơ bản
- Đây là nội dung được dạy trong hướng dẫn Emacs và hoạt động tốt khi số lượng cửa sổ ít
- Việc chọn cửa sổ sẽ luân chuyển qua toàn bộ frame theo chiều kim đồng hồ (một cách tương đối)
windmove
windmove là thư viện Emacs tích hợp dùng để di chuyển focus giữa các cửa sổ theo hướng và di chuyển buffer giữa các cửa sổ
- Đây là tính năng mà người dùng Vim thường mong đợi, và người dùng
evil-mode có lẽ đã dùng Windmove rồi
- Dùng bằng cách gán
windmove-left, -right, -up, -down vào các phím tương ứng với hướng
frames-only-mode
frames-only-mode cho phép giao việc xử lý cửa sổ của Emacs cho hệ điều hành
- Nếu mọi buffer đều mở trong frame mới thì đó sẽ là việc của trình quản lý cửa sổ
- Cách này khiến buffer Emacs tương đương với cửa sổ OS, để có thể quản lý chúng bằng cùng một bộ phím
winum-mode
- Winum là bước tiến tự nhiên về công sức chuyển giữa n cửa sổ từ O(n) (
other-window) sang O(√n) (windmove), rồi đến O(1)
- Nó thêm số thứ tự cửa sổ vào mode line để bạn có thể chọn cửa sổ bằng số
- Khi minibuffer được kích hoạt, nó luôn được gán số 0
ace-window
ace-window là đỉnh cao của điều khiển cửa sổ Emacs bằng bàn phím
- Nó đặt các "gợi ý" ở đầu mỗi cửa sổ, và khi nhập phím tương ứng thì focus sẽ chuyển sang cửa sổ đó
- Nó cho phép bạn "chọn" cửa sổ theo cách tổng quát, rồi người dùng quyết định sẽ làm gì với cửa sổ đó
- Ngoài các thao tác có sẵn như xóa, di chuyển hoặc hoán đổi cửa sổ, chia tách, hiển thị buffer, bạn còn có thể thêm thao tác tùy biến
Dùng chuột
- Ưu điểm của việc dùng chuột để quản lý cửa sổ là tức thì và hiển nhiên
- Chọn cửa sổ là phần mở rộng tự nhiên của thao tác chuột cơ bản, còn đổi kích thước cửa sổ thì đơn giản
- Menu ngữ cảnh và hỗ trợ kéo thả rất trực quan
- Để giảm bớt nhược điểm, nếu bạn vốn đã dùng chuột cho việc khác thì điều khiển Emacs bằng chuột thực ra là con đường ít ma sát nhất
transpose-frame (xoay, lật và lật ngang)
transpose-frame cung cấp các lệnh để xoay hoặc phản chiếu bố cục cửa sổ trong frame
- Có thể gán
rotate-frame, flip-frame, flop-frame vào các phím phù hợp để dùng thường xuyên
window-prefix-map
window-prefix-map mặc định được gán vào C-x w và tập hợp một số lệnh quản lý cửa sổ hữu ích
split-root-window-right và split-root-window-below chia tách cửa sổ gốc của frame
tab-detach và tear-off-window là các lệnh tiện lợi để chuyển cửa sổ sang tab mới hoặc frame mới
other-window-prefix
other-window-prefix cung cấp cách tách việc chọn cửa sổ khỏi việc hiển thị buffer và giải quyết ba sự bất tiện liên quan đến cửa sổ
- Nhiều lệnh Emacs gắn chặt thao tác mặc định, buffer và cửa sổ với nhau. Với
other-window-prefix, bạn có thể hiển thị buffer của lệnh trong một cửa sổ khác
- Với
other-window-prefix, bạn có thể chọn cửa sổ khi kích hoạt các đối tượng như liên kết
- Với
other-window-prefix, bạn có thể mở các đối tượng "liên kết" một cách thống nhất mà không cần điều chỉnh hay tùy biến theo cách hoạt động của từng tác giả package
Lưu và khôi phục cấu hình cửa sổ
window-configuration-to-register là một công cụ hơi thô nhưng hoàn hảo như một nút đặt lại màu đỏ cỡ lớn
- Bạn có thể dùng lệnh này bất kỳ lúc nào để lưu cấu hình cửa sổ hiện tại vào register rồi khôi phục bằng
jump-to-register
- Với
winner-mode, bạn có thể yêu cầu Emacs duy trì một ngăn xếp các cách sắp xếp cửa sổ trước đây
Đào sâu hơn
Cách đi qua đi lại
- Dù có bao nhiêu cửa sổ mở cùng lúc, trong đa số trường hợp bạn chỉ cần chuyển qua lại giữa hai cửa sổ
- Có thể dùng lệnh
other-window-mru để chuyển giữa một cặp cửa sổ
Cải tiến other-window
- Có thể làm cho
other-window tự chia frame nếu chỉ có một cửa sổ
- Có thể làm cho nó luân chuyển cửa sổ theo thứ tự dùng gần nhất thay vì thứ tự không gian (
switchy-window package)
- Có thể đảo ngược hướng chuyển cửa sổ sau mỗi lần gọi để luân phiên tự nhiên giữa hai cửa sổ
Dùng ma thuật cửa sổ với dispatch của ace-window
ace-window làm với cửa sổ điều mà completing-read làm với danh sách chuỗi
- Dùng
aw-select là lý tưởng cho hai trong ba bước đầu tiên (lọc và chọn) để gọi mọi thao tác trên mọi cửa sổ
- Với
ace-window-one-command, bạn có thể chọn cửa sổ bằng ace-window rồi chạy bất kỳ lệnh đơn giản nào trong cửa sổ đó
ace-window-prefix tương tự other-window-prefix, nhưng cho phép chọn tường minh cửa sổ sẽ hiển thị buffer của lệnh tiếp theo
Có cần phải chuyển cửa sổ không?
- Di chuyển không phụ thuộc cửa sổ với Avy là một trường hợp đặc biệt của một ý tưởng tổng quát hơn
- Với vai trò là bộ chứa văn bản, cửa sổ có thể là một lớp trừu tượng không cần thiết
mark-ring và global-mark-ring theo dõi các vị trí bạn đã di chuyển tới để bạn có thể đi lại qua các cửa sổ khi cần
- Có thể dùng
point-to-register và jump-to-register để ghim thủ công những vị trí muốn quay lại sau này
- Tạo và nhảy bookmark đem lại nhiều lựa chọn để điều hướng qua các cửa sổ tới những vị trí có ý nghĩa mà Emacs hoặc người dùng đã xác nhận
Xử lý cửa sổ để không phải tương tác với cửa sổ
- Có thể dùng
display-buffer-alist và hành vi cửa sổ tự động để giải quyết vấn đề cửa sổ kiểu trò đập chuột chũi
- Nếu đặt quy tắc cho mọi loại buffer bạn gặp hằng ngày trong Emacs thì phần lớn việc quản lý cửa sổ sẽ được giải quyết
- Vấn đề của
display-buffer-alist không phải là nó không hoạt động mà là nó đòi hỏi rất nhiều công sức
- Package Shackle che phủ những điểm kỳ quặc của
display-buffer-alist và cung cấp giao diện elisp đơn giản hơn để chỉ định quy tắc cửa sổ
- Các bản phân phối Emacs thường cung cấp giao diện đơn giản để thiết lập các cấu hình này
Popper, Popwin, shell-pop và vterm-toggle
- Popwin và Popper dựa trên quan sát rằng không phải mọi buffer đều sinh ra như nhau
- Những package này cho phép chỉ định các buffer popup dùng cửa sổ phụ, rồi gọi ra hoặc ẩn chúng khi cần
Phần còn thiếu
window-tree
- Có một khác biệt mang tính nền tảng giữa cách Emacs biểu diễn cửa sổ và cách thao tác cửa sổ bằng các phương pháp đã bàn ở trên
- Các cửa sổ trong frame được sắp theo dạng cây; các nút lá là cửa sổ "thực", còn phần còn lại là cửa sổ "nội bộ"
- Nếu bổ sung các lệnh cho thao tác trên cây cửa sổ, rất nhiều khả năng mới sẽ mở ra
Bộ tích hợp với trình quản lý cửa sổ xếp ô
- Mô hình cây cửa sổ của Emacs gần như giống hệt mô hình của các trình quản lý cửa sổ xếp ô thủ công như i3 hay bspwm
- Điều này tự nhiên làm nảy sinh câu hỏi vì sao lại dùng một trình quản lý cửa sổ xếp ô khác bên trong một trình quản lý cửa sổ xếp ô
- Nếu Emacs cung cấp một giao diện sạch hơn và thống nhất hơn để tích hợp với mọi trình quản lý cửa sổ thì mọi thứ có thể dễ dàng hơn nhiều
Triển vọng
- Có nhiều cách để chuyển, di chuyển, bỏ qua, tạo, xóa và thao tác cửa sổ; nhiều cách kiểm soát việc hiển thị cửa sổ ngay tại thời điểm gọi lệnh; cùng các cách làm việc trong cửa sổ hoặc hoàn toàn không nghĩ về cửa sổ
- Quản lý cửa sổ không hẳn là phức tạp mà là quá mở
- Emacs cung cấp nguyên liệu và một chút chỉ dẫn, và bản thân nguyên liệu cũng có thể dùng như một bữa ăn cơ bản
- Nhưng với một chút nấu nướng, chúng ta có thể tạo ra thứ gì đó rất ngon
Ý kiến của GN⁺
- Quản lý cửa sổ là một trong những điểm yếu lớn nhất của Emacs và không thân thiện với người dùng. Đặc biệt với người mới bắt đầu, nó có thể gây bối rối.
- Các phương pháp được đưa ra có thể giúp giảm nhẹ vấn đề quản lý cửa sổ của Emacs, nhưng không phải là giải pháp gốc rễ. Cần một hệ thống quản lý cửa sổ trực quan và dễ dùng hơn.
- Quản lý cửa sổ của Emacs rất
1 bình luận
Ý kiến trên Hacker News
Dưới đây là phần tóm tắt các bình luận trên Hacker News:
ace-window,ace-window-display-mode,frames-only-mode.windmove-modevà dùng `(windmove-default-keybindings 'control)`` để có thể di chuyển giữa các cửa sổ bằng Ctrl + phím mũi tên.zygospore, sau khi đóng cửa sổ bằngC-x 1, nếu nhấnC-x 1lần nữa thì có thể khôi phục lại bố cục cửa sổ trước đó.hledger-balance-sheetthì giữ tệp journal mở ở bên trái, đồng thời chia phần kết quả ở bên phải với kích thước 30% để hiển thị.