Як керувати, у якому вікні відображається буфер?


13

Питання: як я можу контролювати, яке вікно org-deadlineвикористовується для відображення календаря?

org-deadlineтимчасово спливає calendarбуфер у вікні при встановленні терміну, а потім знову закриває його після завершення. Коли є лише одне вікно, воно вискакує нове вікно в нижній частині існуючого кадру. Коли є кілька вікон, він вибирає одне - я вважаю, щось подібне get-lru-window- з доступних вікон.

Останнє є проблематичним, якщо воно приймає одне з інших вікон, яке містить потрібну мені інформацію для встановлення граничного терміну (дата, час тощо). Це зазвичай проблема в налаштуванні вікна, наприклад:

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

Коли ви додасте кінцевий термін до файлу порядку денного в (A), org-deadlineперейме (B) або (C), які містять електронні листи, які мають потрібну мені інформацію про дату / час. Я б більше вважав за краще, якщо я дзвоню org-deadlineз (A), то з’явиться тимчасове вікно (D), яке містить calendarбуфер, як показано нижче:

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

Отже: як би однією силою org-deadline(і аналогічними функціями) з'явитись нове тимчасове вікно внизу активного вікна, а не перейняти одне з інших?

PS: Я знаю про спеціальні вікна , але вони не вважають мене найкращим підходом, оскільки це не стільки те, що я хочу присвятити буфери для Windows, скільки хочу, щоб уникнути того, щоб функція перейняла один із "коротких" ті.


Я дуже сподіваюся, що хтось повернеться з відповіддю, яка дає тонкий контроль над новими, тимчасовими вікнами. ( popwin.el ?? display-buffer-alist) Але я думаю, що тут є додаткова зморшка, оскільки org-deadlineвикористання, calendarяке саме по собі виходить з-за шляху управління тим, яке вікно використовувати. cf коментарі в calendar-basic-setup.
purple_arrows

Відповіді:


10

Слідом слід робити те, що ти хочеш.

(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)))

Календар використовує функцію calendar-basic-setupдля відображення буфера календаря, calendar-basic-setupв свою чергу використовує, pop-to-bufferщо в свою чергу використовує display-bufferдля відображення буфера календаря. Зараз display-bufferце налаштовується на високому рівні і дозволяє нам надавати функції для відображення буфера за допомогою певних змінних display-buffer-alist.

В основному ми кажемо Emacs використовувати функцію my-position-calendar-bufferдля відображення буфера, що відповідає регулярному вираженню \*Calendar\*. Функція здійснює my-position-calendar-bufferпошук у вікні, що відображає порядок денний org, якщо він не знайде жодного такого вікна, він нічого не робить, і в цьому випадку display-bufferбуде спробувати деякі інші функції для відображення буфера. У випадку, якщо знайдено вікно з відображенням порядку денного, функція розділяє це вікно вертикально і відображає буфер календаря.

Я не перевіряв це ретельно (просто спробував розпочати календар з переглядом порядку денного та без перегляду порядку денного), схоже, це працює, але можливі помилки.


1
Краще використовувати щось на зразок add-to-listдисплея-буфера. Використання setqзмін інших налаштувань.
Малабарба

@Malabarba дякую за пропозицію, виправлено!
Ікбал Ансарі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.