ऑर्गो टूडू बफ़र को प्रदर्शित करने के लिए कैसे नियंत्रित करें?


9

प्रश्न : मैं कैसे नियंत्रित कर सकता हूं जहां orgटूडू कीवर्ड बफर दिखाई देता है?

किसी todoकीवर्ड के साथ प्रवेश C-c C-t( org-todo) कीवर्ड विकल्पों के साथ एक नया बफर खोलता है और एक का चयन करने के बाद फिर से इसे बंद कर देता है। अब तक सब ठीक है। हालांकि, ऐसा करने के लिए एक और खिड़की पर ले जाता है, जो कम अच्छा है, खासकर क्योंकि यह वास्तव में केवल कीवर्ड के साथ एक पंक्ति या दो को प्रदर्शित करने की आवश्यकता है।

तो, निम्न लेआउट के साथ, C-c C-tबाईं विंडो में हिटिंग ( some-org-buffer) *Org todo*दाएं विंडो में खुलेगी:

+---------------------+---------------------+
|                     |                     |
|                     |                     |
|                     |                     |
|                     |                     |
|   some-org-buffer   |  some-other-buffer  |
|                     |                     |
|                     |                     |
|                     |                     |
|                     |                     |
+---------------------+---------------------+

इसके बजाय, मैं एक छोटी खिड़की को एक ऊर्ध्वाधर विभाजन के रूप में पॉप अप करना चाहूंगा, जैसा कि नीचे दिया गया है:

+---------------------+---------------------+
|                     |                     |
|                     |                     |
|   some-org-buffer   |  some-other-buffer  |
|                     |                     |
|                     |                     |
+---------------------+                     |
|                     |                     |
|     *Org todo*      |                     |
|                     |                     |
+---------------------+---------------------+

इस उत्तर से क्रिबिंग , मैंने इसमें लिखने के लिए एक फंक्शन लिखा display-buffer-alist:

(defun org-todo-position (buffer alist)
  (let ((win (car (cl-delete-if-not
                   (lambda (window)
                     (with-current-buffer (window-buffer window)
                       (memq major-mode
                             '(org-mode org-agenda-mode))))
                   (window-list)))))
    (when win
      (let ((new (split-window win -5 'below)))
        (set-window-buffer new buffer)
        new))))

(add-to-list 'display-buffer-alist
             (list " \\*Org todo\\*" #'dan-org-todo-position))

हालाँकि, यह काम करने में विफल रहता है। आह। मैंने क्या गलत किया है display-buffer-alist? इस बिंदु पर अधिक, मैं अपना todoकीवर्ड बफ़र कैसे प्राप्त करूं, जहां मैं चाहता हूं?


आपके प्रश्न का उत्तर नहीं है, लेकिन आप org-switch-to-buffer-other-windowजो करना चाहते हैं उसे संशोधित करने पर विचार कर सकते हैं - आप एक ऐसी स्थिति बना सकते हैं जो आप चाहते हैं।
कानून

@ सूची: धन्यवाद, मैंने चारों ओर खोदा और org-switch-to-buffer-other-windowअन्य बदसूरत सराय के बारे में पता लगाया org। अज्ञानपूर्ण "समाधान" के लिए उत्तर देखें।
दान

इस सब को अपने .emacs में सम्‍मिलित करते हुए, मैंने आपके पोजिशनिंग फंक्शन पर बारीकी से विचार किया, और मुझे ऐसा महसूस हुआ कि मुझे आपकी परिभाषा के बारे में कुछ याद आ रहा है win। क्या कोई कारण है जो आप (selected-window)यहाँ उपयोग नहीं कर सकते हैं?
एरोन हैरिस

@AaronHarris: यह कोशिश नहीं की है; मैंने (हल्के ढंग से) एक अलग पोस्ट से एक उत्तर को अनुकूलित किया जिसने इस तंत्र का उपयोग किया। इसे एक शॉट दें और देखें कि क्या यह काम करता है।
दान

@ दान: हाँ, यह काम करता है। मैं बस थोड़ा चिंतित था कि कुछ कोने-कोने की स्थिति इसे उड़ा देगी। और उस फ़ंक्शन के लिए धन्यवाद, btw। यह वही करता है जो मैं इसे करना चाहता हूं, और मुझे नहीं लगता कि मैं इस प्रश्न को देखने से पहले यह चाहता हूं कि मैं इसे स्पष्ट कर सकूं।
हारून हैरिस

जवाबों:


4

आह। मुझे एक "समाधान" मिला, लेकिन यह एक बदसूरत है जिसे मौजूदा orgफ़ंक्शन को अधिलेखित करने की आवश्यकता है। मैं उस एक को पसंद करूंगा जिसे orgस्रोत कोड को संशोधित करने की आवश्यकता नहीं है , लेकिन मैं अपने पुरातात्विक खुदाई के परिणामों को यहां डाल रहा हूं, अगर कोई और इसका उपयोग कर सकता है।

जैसा कि मैंने अन्य orgकार्यों के साथ अतीत में देखा है , org-modeबल्कि इस बारे में राय दी गई है कि यह विंडोज़ कैसे संभालता है।

के स्रोत कोड में गहरी दफन org-todoसमारोह के लिए एक कॉल है org-fast-todo-selection। यह फ़ंक्शन, बदले में, कॉल करता है org-switch-to-buffer-other-window, जिसका डॉकस्ट्रिंग भाग में पढ़ता है:

वर्तमान फ्रेम पर दूसरी विंडो में बफर पर स्विच करें। विशेष रूप से, पॉप-अप फ़्रेम की अनुमति न दें

उह ओह।

ठीक है, मैं काटूंगा: चलो देखते हैं org-switch-to-buffer-other-window। यह org-no-popups मैक्रो का उपयोग करता है । इसका डॉकस्ट्रिंग भाग में, पढ़ता है:

पॉपअप विंडो को दबाएं। BODY के आसपास शून्य करने के लिए कुछ चर बांधें ...

यह पता चला है कि display-buffer-alistचर-भीतर से एक letहै nil

( सिर फट गया। )

अंत में, हम इसे पुराने पुराने लाइन के संपादन और उसके स्थान पर नजरअंदाज नहीं कर सकते हैं :display-buffer-alistorg-fast-todo-selectionorg-switch-to-buffer-other-windowswitch-to-buffer-other-window

(defun org-fast-todo-selection ()
  "Fast TODO keyword selection with single keys.
Returns the new TODO keyword, or nil if no state change should occur."
  (let* ((fulltable org-todo-key-alist)
     (done-keywords org-done-keywords) ;; needed for the faces.
     (maxlen (apply 'max (mapcar
                  (lambda (x)
                (if (stringp (car x)) (string-width (car x)) 0))
                  fulltable)))
     (expert nil)
     (fwidth (+ maxlen 3 1 3))
     (ncol (/ (- (window-width) 4) fwidth))
     tg cnt e c tbl
     groups ingroup)
    (save-excursion
      (save-window-excursion
    (if expert
        (set-buffer (get-buffer-create " *Org todo*"))
      ;; (org-switch-to-buffer-other-window (get-buffer-create " *Org todo*")))
      (switch-to-buffer-other-window (get-buffer-create " *Org todo*")))
    (erase-buffer)
    (org-set-local 'org-done-keywords done-keywords)
    (setq tbl fulltable cnt 0)
    (while (setq e (pop tbl))
      (cond
       ((equal e '(:startgroup))
        (push '() groups) (setq ingroup t)
        (when (not (= cnt 0))
          (setq cnt 0)
          (insert "\n"))
        (insert "{ "))
       ((equal e '(:endgroup))
        (setq ingroup nil cnt 0)
        (insert "}\n"))
       ((equal e '(:newline))
        (when (not (= cnt 0))
          (setq cnt 0)
          (insert "\n")
          (setq e (car tbl))
          (while (equal (car tbl) '(:newline))
        (insert "\n")
        (setq tbl (cdr tbl)))))
       (t
        (setq tg (car e) c (cdr e))
        (if ingroup (push tg (car groups)))
        (setq tg (org-add-props tg nil 'face
                    (org-get-todo-face tg)))
        (if (and (= cnt 0) (not ingroup)) (insert "  "))
        (insert "[" c "] " tg (make-string
                   (- fwidth 4 (length tg)) ?\ ))
        (when (= (setq cnt (1+ cnt)) ncol)
          (insert "\n")
          (if ingroup (insert "  "))
          (setq cnt 0)))))
    (insert "\n")
    (goto-char (point-min))
    (if (not expert) (org-fit-window-to-buffer))
    (message "[a-z..]:Set [SPC]:clear")
    (setq c (let ((inhibit-quit t)) (read-char-exclusive)))
    (cond
     ((or (= c ?\C-g)
          (and (= c ?q) (not (rassoc c fulltable))))
      (setq quit-flag t))
     ((= c ?\ ) nil)
     ((setq e (rassoc c fulltable) tg (car e))
      tg)
     (t (setq quit-flag t)))))))

क्या आप fletयहां विद्रोह करने के लिए सीएल का इस्तेमाल कर सकते हैं org-switch-to-buffer-other-window? आश्चर्य है कि अगर आप सलाह दे सकते हैं या अन्यथा org-fast-todo-selectionइसे लिखने के बजाय लपेट सकते हैं ।
ग्लूकास १

@glucas: अच्छा विचार है। कोशिश की और यह काम करने के लिए नहीं मिल सकता है, यद्यपि।
दान

1
@, मैं इसे org-switch-to-buffer-other-windowसिर्फ पुनर्परिभाषित करने के लिए काम करने में सक्षम था (switch-to-buffer-other-window args)। मैंने &restफ़ंक्शन तर्कों से भी हटा दिया ।
sk8WOOD

3

मैंने हाल ही में यह पता लगाया कि ऑर्ग-मोड को एक नए फ्रेम में कैसे बनाया जाए । अपने फ़ंक्शन का उपयोग करने के लिए उस कोड को संशोधित करना बहुत सरल है। यहाँ है कि मैं यह कैसे करूँगा:

(defun my/org-todo-window-advice (orig-fn)
  "Advice to fix window placement in `org-fast-todo-selection'."
  (let  ((override '("\\*Org todo\\*" dan-org-todo-position)))
    (add-to-list 'display-buffer-alist override)
    (my/with-advice
        ((#'org-switch-to-buffer-other-window :override #'pop-to-buffer))
      (unwind-protect (funcall orig-fn)
        (setq display-buffer-alist
              (delete override display-buffer-alist))))))

(advice-add #'org-fast-todo-selection :around #'my/org-todo-window-advice)

पूर्णता के लिए, यहाँ my/with-adviceअन्य उत्तर से मैक्रो की परिभाषा है :

(defmacro my/with-advice (adlist &rest body)
  "Execute BODY with temporary advice in ADLIST.

Each element of ADLIST should be a list of the form
  (SYMBOL WHERE FUNCTION [PROPS])
suitable for passing to `advice-add'.  The BODY is wrapped in an
`unwind-protect' form, so the advice will be removed even in the
event of an error or nonlocal exit."
  (declare (debug ((&rest (&rest form)) body))
           (indent 1))
  `(progn
     ,@(mapcar (lambda (adform)
                 (cons 'advice-add adform))
               adlist)
     (unwind-protect (progn ,@body)
       ,@(mapcar (lambda (adform)
                   `(advice-remove ,(car adform) ,(nth 2 adform)))
                 adlist))))

2

किसी और के विन्यास को देखते हुए , मुझे यह नियंत्रित करने का एक तरीका मिला कि कहां *Org Src.*और *Org todo*बफ़र्स दिखाई दें। अब जब मैं हिट करता हूं C-c C-tया C-c 'ये बफ़र्स मेरे वर्तमान विंडो लेआउट के निचले भाग में एक नई विंडो में प्रदर्शित होते हैं, और TODO राज्य या हिटिंग C-c '( org-edit-src-exit) को चुनकर मेरे विंडो कॉन्फ़िगरेशन को उसके मूल लेआउट में लौटाता है।

इस समाधान में हथकड़ी और कुछ एलिस्प का उपयोग करना शामिल है :

चरण 1

shackleMELPA से डाउनलोड करें । यहां बताया गया है कि मैंने use-packageअपनी इनइट फ़ाइल में इसे कैसे सेट किया है :

(use-package shackle
    :ensure t
    :diminish shackle-mode  ; hide name in mode-line
    :config
    (setq shackle-rules
          '(("\\*Org Src.*" :regexp t :align below :select t)
            (" *Org todo*" :align below :select t)))
    (shackle-mode t))

यहाँ महत्वपूर्ण सेटिंग्स हैं:

(setq shackle-rules
              '(("\\*Org Src.*" :regexp t :align below :select t)
                (" *Org todo*" :align below :select t)))

स्रोत

नीचे पंक्ति के बीच "और विशेष रूप से स्थान पर ध्यान दें *Org। मैंने :alignअन्य स्थानों पर सेटिंग का परीक्षण नहीं किया है , लेकिन shackleयह बहुत लचीला लगता है, इसलिए यह प्रलेखन पढ़ने और इसके साथ प्रयोग करने के लायक है।

चरण 2

अब हम अपने इनिट फ़ाइल में कुछ और एलिस्प के साथ org-modeसुनते हैं shackle*Org Src.*पालन करने के लिए बफ़र प्राप्त करने के लिए shackle-rules:

(setq org-src-window-setup 'other-window)

स्रोत

दुर्भाग्य से बफ़र्स के org-modeलिए एक अनुरूप सेटिंग प्रदान नहीं करता है *Org todo*। यह हैक उस के लिए बनाता है (और शायद शानदार बनाता है (setq org-src-window-setup 'other-window), लेकिन किसी और जानकार को इसमें झंकार करना होगा):

;; Re-define org-switch-to-buffer-other-window to NOT use org-no-popups.
;; Primarily for compatibility with shackle.
(defun org-switch-to-buffer-other-window (args)
  "Switch to buffer in a second window on the current frame.
In particular, do not allow pop-up frames.
Returns the newly created buffer.
Redefined to allow pop-up windows."
  ;;  (org-no-popups
  ;;     (apply 'switch-to-buffer-other-window args)))
  (switch-to-buffer-other-window args))

स्रोत

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