যেখানে org টু কীওয়ার্ড বাফার প্রদর্শন হয় সেখানে কীভাবে নিয়ন্ত্রণ করবেন?


9

প্রশ্ন : আমি কীভাবে orgটুডো কীওয়ার্ড বাফার প্রদর্শিত হবে তা নিয়ন্ত্রণ করতে পারি ?

( ) todoদিয়ে একটি কীওয়ার্ড প্রবেশ করিয়ে কীওয়ার্ড বিকল্পগুলির সাহায্যে একটি নতুন বাফার খোলে এবং আমি এটি নির্বাচন করার পরে এটি আবার বন্ধ করে দেয়। এ পর্যন্ত সব ঠিকই. যাইহোক, এটি করার জন্য এটি অন্য উইন্ডোটির উপরে নেবে, যা কম ভাল, বিশেষত যেহেতু এটির জন্য কেবলমাত্র কীওয়ার্ড সহ একটি লাইন বা দুটি প্রদর্শিত দরকার।C-c C-torg-todo

সুতরাং, নীচের লেআউটটি সহ, C-c C-tবাম উইন্ডোতে থাকাকালীন ( some-org-buffer) *Org todo*ডানদিকের উইন্ডোতে খোলা হবে :

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

পরিবর্তে, আমি নীচের মতো একটি ছোট উইন্ডোটি উল্লম্ব বিভাজন হিসাবে পপ আপ করতে চাই:

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

থেকে Cribbing এই উত্তর , আমি লাগাতে একটি ফাংশন লিখেছেন 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)এখানে ব্যবহার করতে পারবেন না এমন কোনও কারণ আছে?
অ্যারন হ্যারিস

@ অ্যারোনহরিস: চেষ্টা করেননি; আমি (হালকাভাবে) এই প্রক্রিয়াটি ব্যবহার করে এমন একটি অন্য পোস্টের একটি উত্তর অভিযোজিত করেছি। এটিকে শট দিন এবং দেখুন এটি কার্যকর হয় কিনা।
ড্যান

@ ড্যান: হ্যাঁ, এটি কাজ করে। আমি কেবল কিছুটা চিন্তিত ছিলাম যে কোনও কোনও কোণার পরিস্থিতি এটিকে ফুটিয়ে তুলবে। এবং বিটিডব্লিউ যে ফাংশন জন্য ধন্যবাদ। এটি ঠিক আমি যা করতে চাই তা করে, এবং আমি মনে করি না যে আমি এই প্রশ্নটি দেখার আগে যা চেয়েছিলাম তা বলতে সক্ষম হয়েছি।
অ্যারন হ্যারিস

উত্তর:


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 ম্যাক্রো ব্যবহার করে । এর ডক্ট্রিং অংশটি পড়ে:

পপআপ উইন্ডো দমন করুন। শরীরের চারপাশে শূন্য করতে কিছু চলক বেঁধে রাখুন ...

দেখা যাচ্ছে যে 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এখানে পুনরায় পাঠাতে cl ব্যবহার করতে পারেন 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ফাংশন যুক্তি থেকে সরিয়েছি ।
sk8ingdom

3

নতুন ফ্রেমে অর্গ-মোড ক্যাপচার কীভাবে করা যায় তা আমি সম্প্রতি সন্ধান করেছি । আপনার ফাংশনটি ব্যবহার করার জন্য সেই কোডটি সংশোধন করা বেশ সোজা is আমি এটি কীভাবে করব তা এখানে:

(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 'এই বাফার আমার বর্তমান উইন্ডো বিন্যাস নীচে একটি নতুন উইন্ডোতে প্রদর্শন, এবং একটি করণীয় রাষ্ট্র নির্বাচন বা আঘাত C-c '( org-edit-src-exit) তার মূল লেআউটে আমার জানালা কনফিগারেশন ফেরৎ।

এই সলিউশন ব্যবহার জড়িত হাতকড়া এবং কিছু Elisp:

ধাপ 1

shackleমেলপা থেকে ডাউনলোড করুন । আমি এখানে use-packageআমার init ফাইলটিতে এটি কীভাবে সেট আপ করব:

(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এটি বেশ নমনীয় বলে মনে হচ্ছে, তাই এটি ডকুমেন্টেশন পড়ার এবং এটির সাথে পরীক্ষার জন্য মূল্যবান।

ধাপ ২

এখন আমরা করতে org-modeকথা শুনতে shackleআমাদের Init ফাইলে আরো কিছু Elisp সঙ্গে। *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))

উত্স

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.