जिस विंडो में एक बफर प्रदर्शित किया जाता है उसे कैसे नियंत्रित किया जाए?


13

प्रश्न: मैं org-deadlineकैलेंडर को प्रदर्शित करने के लिए किस विंडो का उपयोग कर सकता हूं ?

org-deadlineअस्थायी रूप से calendarएक समय सीमा निर्धारित करते समय एक विंडो में बफर को पॉप अप करता है , और फिर इसे पूरा करने के बाद फिर से बंद कर देता है। जब केवल एक खिड़की होती है, तो यह मौजूदा फ्रेम के निचले भाग में एक नई विंडो पॉप करती है। जब कई खिड़कियां होती हैं, तो यह एक का चयन करता है - मैं कुछ ऐसी चीजों के साथ अनुमान लगाता हूं get-lru-window- जैसे उपलब्ध खिड़कियां।

उत्तरार्द्ध समस्याग्रस्त है अगर यह अन्य खिड़कियों में से एक पर ले जाता है जिसमें मुझे समय सीमा (तिथि, समय, आदि) निर्धारित करने के लिए आवश्यक जानकारी है जो यह है: यह आमतौर पर एक विंडो सेटअप में एक समस्या है जैसे:

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

जब (ए) में एजेंडा फ़ाइल में एक समय सीमा जोड़ते हैं, org-deadlineतो (बी) या (सी) पर ले जाएगा, जिसमें वे ईमेल होते हैं जिनकी मुझे दिनांक / समय की जानकारी होती है। मैं बहुत पसंद करूंगा, अगर मैं org-deadline(ए) से कॉल कर रहा हूं, तो calendarबफर को नीचे रखने के लिए यह एक अस्थायी विंडो (डी) पॉप करेगा :

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

तो: एक बल org-deadline(और अनुरूप कार्य) कैसे एक नई, अस्थायी खिड़की को अन्य लोगों में से एक लेने के बजाय सक्रिय खिड़की के नीचे पॉप करने के लिए होगा?

पुनश्च: मुझे समर्पित खिड़कियों के बारे में पता है , लेकिन वे मुझे सबसे अच्छे दृष्टिकोण के रूप में नहीं मारते हैं क्योंकि यह इतना नहीं है कि मैं बफ़र्स को खिड़कियों के लिए समर्पित करना चाहता हूं क्योंकि मैं "शॉर्ट" में से एक को लेने से बचना चाहता हूं। लोगों को।


मैं वास्तव में आशा करता हूं कि कोई व्यक्ति एक उत्तर के साथ वापस आता है जो नई, अस्थायी खिड़कियों पर ठीक नियंत्रण देता है। ( popwin.el ? display-buffer-alist) लेकिन मुझे लगता है कि यहां एक अतिरिक्त शिकन है क्योंकि org-deadlineउपयोग करता है calendarजो खुद ही अपने तरीके से बाहर जाता है कि किस विंडो का उपयोग करना है। टिप्पणी cf calendar-basic-setup
पर्पल_अर्स

जवाबों:


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

मूल रूप से हम rexxp से my-position-calendar-bufferमेल खाते बफर को प्रदर्शित करने के लिए फ़ंक्शन का उपयोग करने के लिए emacs कह रहे हैं \*Calendar\*। फ़ंक्शन my-position-calendar-bufferऑर्गन एजेंडे को प्रदर्शित करने वाली विंडो की खोज करता है, अगर उसे ऐसी कोई विंडो नहीं मिलती है, तो यह कुछ भी नहीं करता है कि किस मामले display-bufferमें बफर को प्रदर्शित करने के लिए कुछ अन्य फ़ंक्शन की कोशिश करेंगे। यदि ओआरजी-एजेंडा प्रदर्शित करने वाली विंडो मिल जाती है, तो फ़ंक्शन उस विंडो को लंबवत रूप से विभाजित करता है और कैलेंडर बफर प्रदर्शित करता है।

मैंने इसके माध्यम से परीक्षण नहीं किया है (बस एजेंडा दृश्य और बिना एजेंडे के दृश्य के साथ कैलेंडर शुरू करने की कोशिश की गई), यह काम करने लगता है लेकिन कुछ कीड़े हो सकते हैं।


1
add-to-listप्रदर्शन-बफर-एलिस्ट जैसे कुछ का उपयोग करना बेहतर होगा । setqअन्य अनुकूलन का उपयोग करते हुए ।
मालाबार

@ मलबारबा ने सुझाव के लिए धन्यवाद, तय किया!
इकबाल अंसारी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.