По-лесна навигация в контура в emacs

Намерих тази чудесна малка функция за Org-mode:

;;; Move to next heading with dedicated buffer preview
(defun ded/org-show-next-heading-tidily ()
  "Show next entry, keeping other entries closed."
  (if (save-excursion (end-of-line) (outline-invisible-p))
      (progn (org-show-entry) (show-children))
    (outline-next-heading)
    (unless (and (bolp) (org-on-heading-p))
      (org-up-heading-safe)
      (hide-subtree)
      (error "Boundary reached"))
    (org-overview)
    (org-reveal t)
    (org-show-entry)
    (show-children)))

Той се движи от заглавие към заглавие и показва директното съдържание и децата. Хареса ми идеята, но бих предпочел да се показва в специален буфер, използвайки (org-tree-to-indirect-buffer).

Опитах се да го направя така:

(defun ded/org-show-next-heading-test ()
  "Show next entry, keeping other entries closed."
  (if (save-excursion (end-of-line) (outline-invisible-p))
      (progn (org-show-entry) (org-tree-to-indirect-buffer))
    (outline-next-heading)
    (unless (and (bolp) (org-on-heading-p))
      (org-up-heading-safe)
      (hide-subtree)
      (error "Boundary reached"))
    (org-overview)
    (org-reveal t)
    (org-tree-to-indirect-buffer)
    (show-children)))

Но тогава трябва да натисна два пъти клавиша - веднъж показва записа в специален буфер и втори път все още показва записа. Опитах се да премахна функцията progn, но след това не проработи напълно.

Не съм програмист на lisp и се опитах да играя с него около час, но безуспешно, така че ще се радвам някой с опит да ми помогне да оправя това нещо :)

Много задължен.


person Devon Ville    schedule 16.10.2012    source източник


Отговори (2)


Не съм съвсем сигурен какво искаш, но доколкото разбирам, трябва да извикаш org-tree-to-indirect-buffer накрая:

;;; Move to next heading with dedicated buffer preview
(defun ded/org-show-next-heading-tidily ()
  "Show next entry, keeping other entries closed."
  (if (save-excursion (end-of-line) (outline-invisible-p))
      (progn (org-show-entry) (show-children))
    (outline-next-heading)
    (unless (and (bolp) (org-on-heading-p))
      (org-up-heading-safe)
      (hide-subtree)
      (error "Boundary reached"))
    (org-overview)
    (org-reveal t)
    (org-show-entry)
    (show-children)
    (org-tree-to-indirect-buffer)))

Ако не е това, което искате, моля, дайте повече подробности.

person Oleg Pavliv    schedule 16.10.2012
comment
Това е почти това, което искам. Сега не е нужно да натискам два пъти, за да премина към следващото заглавие. Единственото нещо, което ми липсва, е съдържанието на записа да не се показва в текущия буфер, а само в специалния буфер... (показва само заглавия и подзаглавия и имайте предвид чистото съдържание). Дано изясних. - person Devon Ville; 16.10.2012

В крайна сметка създадох свои собствени прости функции за по-лесно навигиране:

(defun forward-and-preview ()
    "Go to same level next heading and show preview in dedicated buffer"
    (hide-subtree)
    (org-speed-move-safe (quote outline-next-visible-heading))
    (show-children)
    (org-tree-to-indirect-buffer)
    )
(defun back-and-preview ()
    "Go to same level previous heading and show preview in dedicated buffer"
    (hide-subtree)
    (org-speed-move-safe (quote outline-previous-visible-heading))
    (show-children)
    (org-tree-to-indirect-buffer)
    )
(defun up-back-and-preview ()
    "Go to previous level heading and show preview in dedicated buffer"
    (org-speed-move-safe (quote outline-up-heading))
    (org-tree-to-indirect-buffer)
    (hide-subtree)
    )
(defun up-forward-and-preview ()
    "Go to previous level next heading and show preview in dedicated buffer"
    (org-speed-move-safe (quote outline-up-heading))
    (hide-subtree)
    (org-speed-move-safe (quote outline-next-visible-heading))
    (org-tree-to-indirect-buffer)
    )
(defun inside-and-preview ()
    "Go to next level heading and show preview in dedicated buffer"
    (org-speed-move-safe (quote outline-next-visible-heading))
    (show-children)
    (org-tree-to-indirect-buffer)
    )
(add-to-list 'org-speed-commands-user '("l" inside-and-preview))
(add-to-list 'org-speed-commands-user '("j" forward-and-preview))
(add-to-list 'org-speed-commands-user '("k" back-and-preview))
(add-to-list 'org-speed-commands-user '("J" up-forward-and-preview))
(add-to-list 'org-speed-commands-user '("K" up-back-and-preview))
person Devon Ville    schedule 16.10.2012