Bagaimana cara mengontrol di jendela mana buffer ditampilkan?

13

T: bagaimana saya bisa mengontrol jendela yang org-deadlinedigunakan untuk menampilkan kalender?

org-deadlineuntuk sementara memunculkan calendarbuffer di jendela ketika mengatur tenggat waktu, dan kemudian menutupnya lagi setelah selesai. Ketika hanya ada satu jendela, muncul jendela baru di bagian bawah bingkai yang ada. Ketika ada beberapa jendela, itu memilih satu - saya kira dengan sesuatu seperti get-lru-window- dari jendela yang tersedia.

Yang terakhir bermasalah jika mengambil alih salah satu jendela lain yang memiliki informasi yang saya butuhkan untuk menetapkan tenggat waktu (tanggal, waktu, dll.) Ini biasanya merupakan masalah dalam pengaturan jendela seperti:

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

Ketika menambahkan tenggat waktu ke file agenda di (A), org-deadlineakan mengambil alih (B) atau (C), yang berisi email yang memiliki informasi tanggal / waktu yang saya butuhkan. Saya lebih suka itu, jika saya menelepon org-deadlinedari (A), itu akan memunculkan jendela sementara (D) untuk mengandung calendarbuffer seperti di bawah ini:

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

Jadi: bagaimana satu kekuatan org-deadline(dan fungsi analog) untuk memunculkan jendela sementara yang baru di bagian bawah jendela yang aktif daripada mengambil alih salah satu yang lain?

PS: Saya sadar akan jendela khusus , tetapi mereka tidak menganggap saya pendekatan terbaik karena tidak terlalu banyak sehingga saya ingin mendedikasikan buffer untuk windows karena saya ingin menghindari fungsi mengambil alih salah satu "pendek" yang

Dan
sumber
Saya benar-benar berharap seseorang kembali dengan jawaban yang memberikan kontrol baik atas jendela sementara yang baru. ( popwin.el ?? display-buffer-alist) Tapi saya pikir ada kerutan tambahan di sini karena org-deadlinepenggunaan calendaryang berjalan jauh dari cara untuk mengontrol jendela apa yang digunakan. lihat komentar di calendar-basic-setup.
purple_arrows

Jawaban:

10

Mengikuti harus melakukan apa yang Anda inginkan.

(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 menggunakan fungsi calendar-basic-setupuntuk menampilkan buffer kalender, calendar-basic-setuppada gilirannya menggunakan pop-to-bufferyang pada gilirannya digunakan display-bufferuntuk menampilkan buffer kalender. Sekarang display-buffersangat dapat dikustomisasi dan memungkinkan kami untuk menyediakan fungsi untuk menampilkan buffer menggunakan variabel tertentu, kami menggunakan satu variabel seperti itu di display-buffer-alistsini.

Pada dasarnya kami mengatakan emacs untuk menggunakan fungsi my-position-calendar-bufferuntuk menampilkan buffer yang cocok dengan regexp \*Calendar\*. Fungsi my-position-calendar-buffermencari jendela yang menampilkan agenda org, jika tidak menemukan jendela seperti itu, ia tidak melakukan apa-apa dalam hal ini display-bufferakan mencoba beberapa fungsi lain untuk menampilkan buffer. Dalam hal jendela menampilkan org-agenda ditemukan fungsi membagi jendela itu secara vertikal dan menampilkan buffer kalender.

Saya belum menguji ini secara menyeluruh (hanya mencoba memulai kalender dengan tampilan agenda dan tanpa tampilan agenda), tampaknya berfungsi tetapi mungkin ada beberapa bug.

Iqbal Ansari
sumber
1
Akan lebih baik menggunakan sesuatu seperti add-to-listpada display-buffer-alist. Menggunakan setqmengabaikan penyesuaian lainnya.
Malabarba
@Malabarba terima kasih atas sarannya, diperbaiki!
Iqbal Ansari