Comment contrôler dans quelle fenêtre un tampon est affiché?

13

Q: comment contrôler la fenêtre org-deadlineutilisée pour afficher le calendrier?

org-deadlinefait apparaître temporairement le calendartampon dans une fenêtre lors de la définition d'un délai, puis le referme une fois terminé. Lorsqu'il n'y a qu'une seule fenêtre, une nouvelle fenêtre s'ouvre au bas du cadre existant. Lorsqu'il y a plusieurs fenêtres, il en sélectionne une - je suppose avec quelque chose comme get-lru-window- des fenêtres disponibles.

Ce dernier est problématique s'il prend en charge l'une des autres fenêtres contenant les informations dont j'ai besoin pour définir la date limite (date, heure, etc.). C'est généralement un problème dans une configuration de fenêtre telle que:

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

Lors de l'ajout d'une date limite au fichier de l'agenda en (A), org-deadlineprendra le relais (B) ou (C), qui contiennent des e-mails contenant les informations de date / heure dont j'ai besoin. Je préférerais de beaucoup que si j'appelle org-deadlinede (A), cela ouvrirait une fenêtre temporaire (D) pour contenir le calendartampon comme ci-dessous:

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

Alors: comment forcer org-deadline(et des fonctions similaires) à faire apparaître une nouvelle fenêtre temporaire au bas de la fenêtre active plutôt que de reprendre l'une des autres?

PS: je connais les fenêtres dédiées , mais elles ne me semblent pas être la meilleure approche car ce n'est pas tant que je veuille dédier des tampons aux fenêtres que je veux éviter qu'une fonction ne prenne le relais sur une des "courtes" ceux.

Dan
la source
J'espère vraiment que quelqu'un reviendra avec une réponse qui donne un contrôle précis sur les nouvelles fenêtres temporaires. ( popwin.el ?? display-buffer-alist) Mais je pense qu'il y a une ride supplémentaire ici parce que les org-deadlineutilisations calendarelles-mêmes vont très loin pour contrôler quelle fenêtre utiliser. cf les commentaires dans calendar-basic-setup.
purple_arrows

Réponses:

10

Ce qui suit devrait faire ce que vous voulez.

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

Calendrier utilise la fonction calendar-basic-setuppour afficher le tampon de calendrier, calendar-basic-setupà son tour utilise pop-to-bufferqui à son tour utilise display-bufferpour afficher le tampon de calendrier. Maintenant, il display-bufferest hautement personnalisable et nous permet de fournir des fonctions pour afficher un tampon en utilisant certaines variables, nous utilisons une telle variable display-buffer-alistici.

Fondamentalement, nous disons à emacs d'utiliser la fonction my-position-calendar-bufferpour afficher un tampon correspondant à l'expression rationnelle \*Calendar\*. La fonction my-position-calendar-bufferrecherche une fenêtre affichant l'agenda de l'organisation, si elle ne trouve pas une telle fenêtre, elle ne fait rien, auquel cas display-bufferelle essaiera d'autres fonctions pour afficher le tampon. Dans le cas où une fenêtre affichant org-agenda est trouvée, la fonction divise cette fenêtre verticalement et affiche le tampon de calendrier.

Je n'ai pas testé cela en profondeur (j'ai juste essayé de démarrer le calendrier avec la vue de l'agenda et sans la vue de l'agenda), cela semble fonctionner mais il pourrait y avoir quelques bugs.

Iqbal Ansari
la source
1
Il serait préférable d'utiliser quelque chose comme add-to-listsur display-buffer-alist. L'utilisation setqremplace d'autres personnalisations.
Malabarba
@Malabarba merci pour la suggestion, corrigé!
Iqbal Ansari