如何控制在哪个窗口中显示缓冲区?


13

问:如何控制org-deadline显示日历的窗口?

org-deadlinecalendar设置截止日期时,会暂时在窗口中弹出缓冲区,然后在完成后再次将其关闭。当只有一个窗口时,它将在现有框架的底部弹出一个新窗口。当有多个窗口时,它会get-lru-window从可用窗口中选择一个(我认为类似)。

如果它接管了具有我需要的信息以设置截止日期(日期,时间等)的其他窗口之一,则后者是有问题的。这在诸如以下的窗口设置中通常是一个问题:

+--------------------+--------------------+
|                    |                    |
|                    |  (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(和类似功能)在活动窗口的底部弹出一个新的临时窗口,而不是接管另一个窗口?

PS:我知道专用的窗口,但是它们并没有把我当作最好的方法,因为我并不想将缓冲区专用于窗口,因为我想避免让函数接管“短”窗口中的一个。那些。


我真的希望有人能给出一个答案,以便对新的临时窗口进行精确控制。(popw​​in.eldisplay-buffer-alist??)但是我认为这里还有一个额外的皱纹,因为org-deadline使用calendar它本身就无法控制要使用的窗口。参阅中的评论calendar-basic-setup
purple_arrows 2014年

Answers:


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在此我们使用一个此类变量。

基本上,我们是说emacs使用该功能my-position-calendar-buffer来显示与regexp匹配的缓冲区\*Calendar\*。该函数my-position-calendar-buffer搜索显示组织议程的窗口,如果找不到任何此类窗口,则不执行任何操作,在这种情况下,display-buffer它将尝试其他一些函数来显示缓冲区。如果找到一个显示组织议程的窗口,该函数将垂直拆分该窗口并显示日历缓冲区。

我尚未对此进行全面测试(只是尝试使用议程视图和无议程视图启动日历),它似乎可以正常工作,但可能存在一些错误。


1
最好add-to-list在display-buffer-alist上使用类似的东西。使用将setq覆盖其他自定义项。
马拉巴巴

@Malabarba感谢您的建议,已修复!
伊克巴尔·安萨里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.