How can I set up a dynamic TOC with an org subtree on a new window? (TOC on the left, org heading and contents on the right.) The following functions by @blujay from
How can I get an org-mode outline in a 2nd buffer as a dynamic table of contents?
gets me most of the way there. Adding (org-narrow-to-element) or (org-narrow-to-subtree) to the second function (my/jump-to-point-and-show) opens the narrowed heading, but as I click through the headings in the TOC, subsequent headings don't open as expected. Also only the heading shows, but the contents stay collapsed unless I press TAB.
Here's the function from the StackExchange page linked above:
(defun my/open-tree-view ()
"Open a clone of the current buffer to the left, resize it to 30 columns, and bind <mouse-1> to jump to the same position in the base buffer."
(interactive)
(let ((new-buffer-name (concat "<tree>" (buffer-name))))
;; Create tree buffer
(split-window-right 30)
(if (get-buffer new-buffer-name)
(switch-to-buffer new-buffer-name) ; Use existing tree buffer
;; Make new tree buffer
(progn (clone-indirect-buffer new-buffer-name nil t)
(switch-to-buffer new-buffer-name)
(read-only-mode)
(hide-body)
(toggle-truncate-lines)
;; Do this twice in case the point is in a hidden line
(dotimes (_ 2 (forward-line 0)))
;; Map keys
(use-local-map (copy-keymap outline-mode-map))
(local-set-key (kbd "q") 'delete-window)
(mapc (lambda (key) (local-set-key (kbd key) 'my/jump-to-point-and-show))
'("<mouse-1>" "RET"))))))
(defun my/jump-to-point-and-show ()
"Switch to a cloned buffer's base buffer and move point to the cursor position in the clone."
(interactive)
(let ((buf (buffer-base-buffer)))
(unless buf
(error "You need to be in a cloned buffer!"))
(let ((pos (point))
(win (car (get-buffer-window-list buf))))
(if win
(select-window win)
(other-window 1)
(switch-to-buffer buf))
(goto-char pos)
(when (invisible-p (point))
(show-branches)))))
(I would also like to thank @blujay for the code snippets.)