Làm thế nào để kiểm soát trong cửa sổ nào bộ đệm được hiển thị?


13

Q: làm thế nào tôi có thể kiểm soát cửa sổ nào org-deadlinesử dụng để hiển thị lịch?

org-deadlinetạm thời bật calendarbộ đệm trong cửa sổ khi đặt thời hạn, và sau đó đóng lại sau khi hoàn thành. Khi chỉ có một cửa sổ, nó sẽ bật một cửa sổ mới ở dưới cùng của khung hiện có. Khi có nhiều cửa sổ, nó sẽ chọn một cửa sổ - tôi đoán với một cái gì đó giống như get-lru-window- của các cửa sổ có sẵn.

Cái sau có vấn đề nếu nó chiếm một trong những cửa sổ khác có thông tin tôi cần để đặt thời hạn (ngày, giờ, v.v.) Đây thường là một vấn đề trong thiết lập cửa sổ, chẳng hạn như:

+--------------------+--------------------+
|                    |                    |
|                    |  (B: mu4e header)  |
|                    |                    |
|                    +--------------------+
|  (A: agenda file)  |                    |
|                    |                    |
|                    |                    |
|                    |  (C: mu4e view)    |
|                    |                    |
|                    |                    |
|                    |                    |
+--------------------+--------------------+

Khi thêm thời hạn vào tệp chương trình nghị sự trong (A), org-deadlinesẽ tiếp quản (B) hoặc (C), trong đó có các email có thông tin ngày / giờ tôi cần. Tôi rất thích rằng, nếu tôi gọi org-deadlinetừ (A), nó sẽ bật một cửa sổ tạm thời (D) để chứa calendarbộ đệm như dưới đây:

+--------------------+--------------------+
|                    |                    |
|                    |  (B: mu4e header)  |
|                    |                    |
|                    +--------------------+
|  (A: agenda file)  |                    |
|                    |                    |
|                    |                    |
+--------------------+  (C: mu4e view)    |
|                    |                    |
|   (D: calendar)    |                    |
|                    |                    |
+--------------------+--------------------+

Vậy: làm thế nào một lực lượng org-deadline(và các chức năng tương tự) sẽ bật một cửa sổ mới, tạm thời ở dưới cùng của cửa sổ đang hoạt động thay vì chiếm lấy một trong những cửa sổ khác?

Tái bút: Tôi biết về các cửa sổ chuyên dụng , nhưng chúng không tấn công tôi như là cách tiếp cận tốt nhất vì tôi không muốn dành bộ đệm cho các cửa sổ vì tôi muốn tránh việc một chức năng chiếm một trong những "ngắn" những cái.


Tôi thực sự hy vọng ai đó quay lại với một câu trả lời cho phép kiểm soát tốt các cửa sổ mới, tạm thời. ( Popwin.el ? display-buffer-alist?) Nhưng tôi nghĩ rằng có một nếp nhăn thêm ở đây vì org-deadlinemục đích sử dụng calendarmà tự nó đi cách ra khỏi con đường của mình để kiểm soát những gì cửa sổ để sử dụng. cf các ý kiến ​​trong calendar-basic-setup.
màu tím_

Câu trả lời:


10

Sau đây nên làm những gì bạn muốn.

(defun my-window-displaying-agenda-p (window)
    (equal (with-current-buffer (window-buffer window) major-mode)
        'org-agenda-mode)) 

(defun my-position-calendar-buffer (buffer alist)
  (let ((agenda-window (car (remove-if-not #'my-window-displaying-agenda-p (window-list)))))
    (when agenda-window
      (let ((desired-window (split-window agenda-window nil 'below)))
        (set-window-buffer desired-window  buffer)
        desired-window))))

(add-to-list 'display-buffer-alist (cons "\\*Calendar\\*" (cons #'my-position-calendar-buffer nil)))

Lịch sử dụng chức năng calendar-basic-setupđể hiển thị bộ đệm lịch, calendar-basic-setuplần lượt sử dụng pop-to-bufferlần lượt sử dụng display-bufferđể hiển thị bộ đệm lịch. Bây giờ display-buffercó khả năng tùy biến cao và cho phép chúng tôi cung cấp các hàm để hiển thị bộ đệm bằng các biến nhất định mà chúng tôi sử dụng một biến như vậy display-buffer-alistở đây.

Về cơ bản, chúng ta đang nói emacs sử dụng hàm my-position-calendar-bufferđể hiển thị bộ đệm khớp với biểu thức chính quy \*Calendar\*. Hàm my-position-calendar-buffertìm kiếm một cửa sổ hiển thị chương trình nghị sự, nếu nó không tìm thấy bất kỳ cửa sổ nào như vậy, thì trong trường hợp nào display-buffersẽ không thử một số chức năng khác để hiển thị bộ đệm. Trong trường hợp một cửa sổ hiển thị org-agenda được tìm thấy, hàm sẽ chia cửa sổ đó theo chiều dọc và hiển thị bộ đệm lịch.

Tôi chưa kiểm tra điều này một cách xuyên suốt (chỉ thử bắt đầu lịch với chế độ xem chương trình nghị sự và không có chế độ xem chương trình nghị sự), có vẻ như nó đang hoạt động nhưng có thể có một số lỗi.


1
Nó là tốt hơn để sử dụng một cái gì đó như add-to-listtrên màn hình-bộ đệm-alist. Sử dụng setqghi đè các tùy chỉnh khác.
Malabarba

@Malabarba cảm ơn bạn đã gợi ý, đã sửa!
Iqbal Ansari
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.