Come controllare in quale finestra viene visualizzato un buffer?


13

D: come posso controllare quale finestra org-deadlineutilizza per visualizzare il calendario?

org-deadlineapre temporaneamente il calendarbuffer in una finestra durante l'impostazione di una scadenza, quindi lo chiude di nuovo dopo il completamento. Quando c'è solo una finestra, si apre una nuova finestra nella parte inferiore del frame esistente. Quando ci sono più finestre, ne seleziona una - presumo con qualcosa di simile get-lru-window- delle finestre disponibili.

Quest'ultimo è problematico se assume una delle altre finestre che ha le informazioni di cui ho bisogno per impostare la scadenza (data, ora, ecc.) Questo è comunemente un problema in una configurazione della finestra come:

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

Quando si aggiunge una scadenza al file dell'agenda in (A), org-deadlineprenderà il posto di (B) o (C), che contiene e-mail con le informazioni di data / ora di cui ho bisogno. Preferirei di gran lunga che, se sto chiamando org-deadlineda (A), si aprirà una finestra temporanea (D) per contenere il calendarbuffer come di seguito:

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

Quindi: come si potrebbe forzare org-deadline(e funzioni analoghe) a far apparire una nuova finestra temporanea nella parte inferiore della finestra attiva piuttosto che prendere il controllo di una delle altre?

PS: sono a conoscenza delle finestre dedicate , ma non mi sembrano l'approccio migliore poiché non è così tanto che voglio dedicare i buffer alle finestre perché voglio evitare che una funzione prenda il controllo di una delle "brevi" quelli.


Spero davvero che qualcuno ritorni con una risposta che dia un ottimo controllo su nuove finestre temporanee. ( popwin.el ?? display-buffer-alist) Ma penso che ci sia un'ulteriore ruga qui perché gli org-deadlineusi calendarche si fanno in quattro per controllare quale finestra usare. vedi i commenti in calendar-basic-setup.
purple_arrows,

Risposte:


10

Di seguito dovrebbe fare quello che vuoi.

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

Calendario utilizza la funzione calendar-basic-setupper visualizzare il buffer del calendario, calendar-basic-setupa sua volta utilizza ciò pop-to-bufferche a sua volta utilizza display-bufferper visualizzare il buffer del calendario. Ora display-bufferè altamente personalizzabile e ci consente di fornire funzioni per visualizzare un buffer usando determinate variabili, qui usiamo una di queste variabili display-buffer-alist.

Fondamentalmente stiamo dicendo che emacs usa la funzione my-position-calendar-bufferper visualizzare un buffer corrispondente a regexp \*Calendar\*. La funzione my-position-calendar-buffercerca una finestra che mostra l'agenda dell'organizzazione, se non trova alcuna finestra di questo tipo, non fa nulla nel qual caso display-bufferproverà alcune altre funzioni per visualizzare il buffer. Nel caso in cui venga trovata una finestra che mostra l'agenda dell'organizzazione, la funzione divide quella finestra verticalmente e visualizza il buffer del calendario.

Non l'ho provato a fondo (ho appena provato ad avviare il calendario con la vista agenda e senza la vista agenda), sembra funzionare ma potrebbero esserci alcuni bug.


1
Sarebbe preferibile usare qualcosa come add-to-listsu display-buffer-alist. L'uso setqignora altre personalizzazioni.
Malabarba,

@Malabarba grazie per il suggerimento, risolto!
Iqbal Ansari,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.