Wie kann man steuern, in welchem ​​Fenster ein Puffer angezeigt wird?

13

F: Wie kann ich steuern, in welchem ​​Fenster org-deadlineder Kalender angezeigt wird?

org-deadlineÖffnet den calendarPuffer vorübergehend in einem Fenster, wenn eine Frist festgelegt wird, und schließt ihn anschließend wieder. Wenn es nur ein Fenster gibt, wird am unteren Rand des vorhandenen Rahmens ein neues Fenster angezeigt. Wenn es mehrere Fenster gibt, wählt es eines get-lru-windowder verfügbaren Fenster aus.

Letzteres ist problematisch, wenn es eines der anderen Fenster übernimmt, das die Informationen enthält, die ich zum Festlegen der Frist (Datum, Uhrzeit usw.) benötige. Dies ist häufig ein Problem in einem Fenster-Setup wie:

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

Wenn Sie der Agenda-Datei in (A) eine Frist hinzufügen, org-deadlineübernehmen Sie (B) oder (C), die E-Mails mit den von mir benötigten Datums- / Uhrzeitinformationen enthalten. Ich würde es sehr bevorzugen, wenn ich org-deadlinevon (A) aus aufrufe, würde ein temporäres Fenster (D) eingeblendet, das den folgenden calendarPuffer enthält :

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

Also: Wie würde man org-deadline(und analoge Funktionen) dazu zwingen , ein neues, temporäres Fenster am unteren Rand des aktiven Fensters einzufügen, anstatt eines der anderen zu übernehmen?

PS: Ich kenne dedizierte Fenster , aber sie sind für mich nicht der beste Ansatz, da ich den Fenstern weniger Puffer zuweisen möchte, da ich vermeiden möchte, dass eine Funktion eine der "kurzen" Fenster übernimmt. Einsen.

Dan
quelle
Ich hoffe wirklich, dass jemand mit einer Antwort zurückkommt, die eine genaue Kontrolle über neue, temporäre Fenster ermöglicht. ( popwin.el ?? display-buffer-alist) Aber ich denke, dass es hier eine zusätzliche Falte gibt, weil org-deadlineVerwendungen, calendardie sich aus dem Weg räumen , um zu steuern, welches Fenster verwendet werden soll. Siehe die Kommentare in calendar-basic-setup.
purple_arrows

Antworten:

10

Folgendes sollte tun, was Sie wollen.

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

Kalender verwendet die Funktion calendar-basic-setupden Kalender - Puffer anzuzeigen, calendar-basic-setupverwendet wiederum pop-to-bufferdie verwendet wiederum display-bufferden Kalender - Puffer anzuzeigen. Now display-bufferist in hohem Maße anpassbar und ermöglicht es uns, Funktionen zum Anzeigen eines Puffers mit bestimmten Variablen bereitzustellen, die wir display-buffer-alisthier verwenden.

Grundsätzlich sagen wir, dass Emacs die Funktion verwenden soll my-position-calendar-buffer, um einen Puffer anzuzeigen, der mit dem regulären Ausdruck übereinstimmt \*Calendar\*. Die Funktion my-position-calendar-buffersucht nach einem Fenster, in dem die Organisationsagenda display-bufferangezeigt wird. Findet sie kein solches Fenster, unternimmt sie nichts. In diesem Fall werden einige andere Funktionen zum Anzeigen des Puffers ausgeführt. Wird ein Fenster gefunden, in dem die Organisationsagenda angezeigt wird, teilt die Funktion dieses Fenster vertikal und zeigt den Kalenderpuffer an.

Ich habe dies nicht gründlich getestet (habe gerade versucht, den Kalender mit der Agenda-Ansicht und ohne die Agenda-Ansicht zu starten), es scheint zu funktionieren, aber es kann einige Fehler geben.

Iqbal Ansari
quelle
1
Es wäre vorzuziehen, so etwas wie " add-to-listdisplay-buffer-alist" zu verwenden. Durch setqdas Verwenden werden andere Anpassungen überschrieben.
Malabarba
@Malabarba danke für den Vorschlag, behoben!
Iqbal Ansari