Kuruluş todo anahtar kelimeleri arabelleğinin nerede görüntüleneceği nasıl kontrol edilir?


9

S : orgYapılacaklar anahtar kelimeleri arabelleğinin nerede görüneceğini nasıl kontrol edebilirim ?

( ) İle bir todoanahtar kelime girildiğinde, anahtar kelime seçenekleriyle yeni bir arabellek açılır ve bir tane seçtikten sonra tekrar kapatılır. Çok uzak çok iyi. Ancak, bunu yapmak için başka bir pencereyi ele alır, bu da özellikle anahtar kelimelerle yalnızca bir veya iki satır görüntülemesi gerektiğinden daha az iyidir.C-c C-torg-todo

Böylece, aşağıdaki düzende, C-c C-tsol pencerede ( some-org-buffer) iken vurmak *Org todo*sağ pencerede açılır :

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

Bunun yerine, aşağıdaki gibi dikey bir bölme olarak açılır küçük bir pencere istiyorum:

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

Bu cevaptan cribbing, koymak için bir fonksiyon yazdım 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))

Ancak, bu işe yaramaz. İç çekmek. Ne ile yanlış yaptım display-buffer-alist? Daha da önemlisi, anahtar kelime arabelleğimin istediğim yerde açılmasını nasıl sağlayabilirim todo?


Sorunuzun cevabı değil, ancak istediğinizi yapmak için değiştirmeyi düşünebilirsiniz org-switch-to-buffer-other-window- istediğinizi yapan bir koşul oluşturabilirsiniz.
hukukçu

@lawlist: teşekkürler, kazdık ve hakkında org-switch-to-buffer-other-windowbir sürü diğer çirkin innards hakkında öğrendim org. Görkemli "çözüm" için cevaba bakınız.
Dan

Tüm bunları .emac'lerime dahil ederken, konumlandırma işlevinize yakından baktım ve tanımınızla ilgili bir şey eksik olduğumu hissediyorum win. (selected-window)Burada kullanamayacağın bir sebep var mı?
Aaron Harris

@AaronHarris: denemedim; Bu mekanizmayı kullanan farklı bir gönderinin cevabını (hafifçe) uyarlamıştım. Bir şans ver ve işe yarayıp yaramadığına bak.
Dan

@ Dan: Evet, işe yarıyor. Köşedeki bazı durumların patlamasına neden olacağından biraz endişeliydim. Ve bu işlev için teşekkürler, btw. Tam olarak yapmasını istediğim şeyi yapıyor ve bu soruyu görmeden önce istediğim şeyleri ifade edebileceğimi sanmıyorum.
Aaron Harris

Yanıtlar:


4

İç çekmek. Bir "çözüm" buldum, ancak mevcut bir orgfonksiyonun üzerine yazılmasını gerektiren çirkin bir çözüm . orgKaynak kodunu değiştirmeyi gerektirmeyen bir tanesini tercih ederim , ancak arkeolojik kazı sonuçlarımı başka birinin kullanabilmesi için buraya koyuyorum.

Geçmişte diğer orgişlevlerle fark ettiğim org-modegibi, pencereleri nasıl ele aldığı konusunda oldukça fikirli.

Kaynak kodunun derinliklerine gömülmüş org-todo, fonksiyona yapılan bir çağrıdır org-fast-todo-selection. Bu işlev, sırasıyla, org-switch-to-buffer-other-windowdoktrini okunan çağrıları kısmen:

Geçerli karede ikinci bir pencerede arabelleğe geçin. Özellikle, açılır karelere izin vermeyin .

Ah oh.

Tamam, ısırırım: bakalım org-switch-to-buffer-other-window. org-no-popups Makroyu kullanır . Onun öğretisi kısmen okuyor:

Açılır pencereleri bastırın. Bazı değişkenleri BODY'nin etrafında sıfırlayın.

-Bound display-buffer-alistdeğişkenlerinden biri olduğu ortaya çıktı .letnil

( Kafa patlar. )

Sonuçta, biz alabilirsiniz değil görmezden display-buffer-alistdüzenleyerek org-fast-todo-selectionve yerine org-switch-to-buffer-other-windowdüz eski çizgiyi switch-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)))))))

fletBurada yeniden isyan etmek için cl'yi kullanabilir misin org-switch-to-buffer-other-window? Üzerine org-fast-todo-selectionyazmak yerine öneride bulunup bulunamayacağını veya başka bir şekilde sarıp sarmalamayacağınızı merak ediyorum .
glucas

@glucas: iyi fikir. Yine de denedim ve işe yaramadı.
Dan

1
@ Dan, bunu org-switch-to-buffer-other-windowsadece yeniden tanımlayarak çalıştırabildim (switch-to-buffer-other-window args). Ayrıca &restişlev argümanlarından kaldırdım .
sk8ingdom

3

Yakın zamanda yeni bir çerçevede Org modu yakalamayı nasıl yapacağımı anladım . Bu kodu işlevinizi kullanacak şekilde değiştirmek oldukça basittir. İşte böyle yapardım:

(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)

Tamlık uğruna, my/with-advicediğer cevabın makrosunun tanımı şöyledir:

(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

Başka birinin yapılandırmasına baktığımda, arabelleklerin *Org Src.*ve *Org todo*arabelleklerin görünmesini kontrol etmenin bir yolunu buldum . Şimdi vurduğumda C-c C-tveya C-c 'bu arabellekler geçerli pencere düzenimin altındaki yeni bir pencerede görüntülendiğinde ve bir TODO durumu veya isabet C-c '( org-edit-src-exit) seçerek pencere yapılandırmamı orijinal düzenine geri döndürdüğümde.

Bu çözüm zincir ve bazı Elisp kullanmayı içerir :

Aşama 1

shackleMELPA'dan indirin . İşte use-packagebenim init dosyasında nasıl ayarlanmış :

(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))

Buradaki önemli ayarlar:

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

Kaynak

Özellikle en alt satırdaki "ve arasındaki boşluğa *Orgdikkat edin. :alignDiğer konumlara ayarlamayı test etmedim , ancak shackleoldukça esnek görünüyor, bu yüzden belgeleri okumaya ve denemeye değer.

Adım 2

Şimdi init dosyamızda biraz daha Elisp ile org-modedinliyoruz shackle. Almak için *Org Src.*takip etmek tampon shackle-rules:

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

Kaynak

Ne yazık ki tamponlar org-modeiçin benzer bir ayar sağlamaz *Org todo*. Bu hack bunu telafi ediyor (ve muhtemelen (setq org-src-window-setup 'other-window)gereksiz kılıyor , ancak daha bilgili biri uymak zorunda kalacak):

;; 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))

Kaynak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.