バッファが表示されるウィンドウを制御するにはどうすればよいですか?


13

Q:org-deadlineカレンダーの表示に使用するウィンドウを制御するにはどうすればよいですか?

org-deadlinecalendar期限を設定するときに一時的にウィンドウにバッファをポップアップし、完了後に再び閉じます。ウィンドウが1つしかない場合、既存のフレームの下部に新しいウィンドウがポップされます。複数のウィンドウがある場合get-lru-window、利用可能なウィンドウの1つを選択します。

期限(日付、時刻など)を設定するために必要な情報を持つ他のウィンドウのいずれかを引き継ぐ場合、後者は問題があります。これは一般に次のようなウィンドウ設定の問題です。

+--------------------+--------------------+
|                    |                    |
|                    |  (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、他のウィンドウの1つを引き継ぐのではなく、アクティブウィンドウの下部に新しい一時ウィンドウをポップするように(および類似の機能を)強制する方法を教えてください。

PS:私は専用のウィンドウを知っていますが、関数が「ショート」のいずれかを引き継ぐことを避けたいので、ウィンドウにバッファを専用にしたいほどではないので、彼らは最良のアプローチとして私を攻撃しませんもの。


誰かが新しい一時的なウィンドウを細かく制御できる答えを返してくれることを本当に期待しています。(popw​​in.eldisplay-buffer-alist?)しかし、私はので、ここでは、追加のシワがあると思うorg-deadlineの使用calendar自体がどのようなウィンドウを使用するコントロールへの道から抜け出す道を行きます。のコメントを参照してくださいcalendar-basic-setup
purple_arrows 14年

回答:


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ここでそのような変数を使用する特定の変数を使用してバッファーを表示する関数を提供できます。

基本的に、この関数my-position-calendar-bufferを使用してregexpに一致するバッファを表示することをemacsと言っています\*Calendar\*。この関数my-position-calendar-bufferは、組織のアジェンダを表示するウィンドウを検索します。そのようなウィンドウが見つからない場合は、何も行いません。その場合display-buffer、バッファを表示するために他の関数を試行します。org-agendaを表示するウィンドウが見つかった場合、関数はそのウィンドウを垂直に分割し、カレンダーバッファーを表示します。

私はこれを徹底的にテストしていません(アジェンダビューを使用して、アジェンダビューを使用せずにカレンダーを開始しようとしました)。機能しているようですが、いくつかのバグがある可能性があります。


1
add-to-listdisplay-buffer-alistのようなものを使用することが望ましいでしょう。を使用すると、setq他のカスタマイズが上書きされます。
マラバルバ14年

@Malabarba、提案をありがとう、修正!
イクバルアンサリ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.