จะควบคุมบัฟเฟอร์ที่หน้าต่างแสดงได้อย่างไร?


13

ถาม:ฉันจะควบคุมหน้าต่างที่org-deadlineใช้แสดงปฏิทินได้อย่างไร

org-deadlineป็อปอัพcalendarบัฟเฟอร์ในหน้าต่างชั่วคราวเมื่อตั้งค่ากำหนดเวลาแล้วปิดอีกครั้งหลังจากทำเสร็จ เมื่อมีเพียงหน้าต่างเดียวหน้าต่างจะปรากฏหน้าต่างใหม่ที่ด้านล่างของเฟรมที่มีอยู่ เมื่อมีหลายหน้าต่างมันจะเลือกหนึ่ง - ฉันเข้าใจสิ่งต่าง ๆ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:ฉันตระหนักถึงwindows เฉพาะแต่พวกเขาไม่ได้ตีฉันเป็นวิธีที่ดีที่สุดเพราะมันไม่มากที่ฉันต้องการอุทิศบัฟเฟอร์ให้ windows เพราะฉันต้องการหลีกเลี่ยงการใช้ฟังก์ชั่นหนึ่งใน "สั้น" คน


ฉันหวังว่าจะมีใครบางคนกลับมาพร้อมคำตอบที่ให้การควบคุมที่ดีกับหน้าต่างชั่วคราวใหม่ ( popwin.el ?? display-buffer-alist) แต่ฉันคิดว่ามันมีริ้วรอยเพิ่มเติมที่นี่เพราะการorg-deadlineใช้calendarที่ตัวเองออกไปเพื่อควบคุมหน้าต่างที่จะใช้ cf calendar-basic-setupความคิดเห็นใน
purple_arrows

คำตอบ:


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การแสดงบัฟเฟอร์ที่ตรงกับ \*Calendar\*regexp ฟังก์ชั่นmy-position-calendar-bufferค้นหาหน้าต่างที่แสดงวาระการประชุมองค์กรหากไม่พบหน้าต่างดังกล่าวจะไม่ทำอะไรเลยในกรณีนี้display-bufferจะลองใช้ฟังก์ชันอื่นเพื่อแสดงบัฟเฟอร์ ในกรณีที่พบหน้าต่างแสดงระเบียบวาระการประชุมฟังก์ชั่นจะแยกหน้าต่างดังกล่าวในแนวตั้งและแสดงบัฟเฟอร์ปฏิทิน

ฉันยังไม่ได้ทดสอบอย่างละเอียด (ลองเริ่มปฏิทินด้วยมุมมองกำหนดการและไม่มีมุมมองกำหนดการ) ดูเหมือนว่าจะใช้งานได้ แต่อาจมีข้อบกพร่องบางอย่าง


1
มันจะดีกว่าที่จะใช้สิ่งที่ต้องการadd-to-listใน display-buffer-alist ใช้setqแทนที่การปรับแต่งอื่น ๆ
Malabarba

@ Malabarba ขอบคุณสำหรับคำแนะนำคงที่!
อิกบาลอันซารี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.