* lisp/org.el: (org-get-indirect-buffer) Allow indirect base buffers

Previously, calling this function on an indirect buffer would fail,
preventing the user from making a new indirect buffer based on an
indirect buffer (e.g. imagine the user makes an indirect buffer for a
large subtree, then wants to make another one for a subtree of that).
Now, the base buffer of the buffer is used, when applicable.

Also, the function is partially rewritten to be clearer, and a
docstring is added.

Link: https://orgmode.org/list/8b2c1814-2c6f-fdca-8ba7-63c415bfca5e@alphapapa.net
This commit is contained in:
Adam Porter 2022-11-04 14:52:58 -05:00 committed by Ihor Radchenko
parent 5e0c5c186d
commit 155dc778e8
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
1 changed files with 16 additions and 19 deletions

View File

@ -6160,25 +6160,22 @@ frame is not changed."
(run-hook-with-args 'org-cycle-hook 'all)
(and (window-live-p cwin) (select-window cwin))))
(defun org-get-indirect-buffer (&optional buffer heading)
(setq buffer (or buffer (current-buffer)))
(let ((n 1) (base (buffer-name buffer)) bname)
(while (buffer-live-p
(get-buffer
(setq bname
(concat base "-"
(if heading (concat heading "-" (number-to-string n))
(number-to-string n))))))
(setq n (1+ n)))
(condition-case nil
(let ((indirect-buffer (make-indirect-buffer buffer bname 'clone)))
;; Decouple folding state. We need to do it manually since
;; `make-indirect-buffer' does not run
;; `clone-indirect-buffer-hook'.
(org-fold-core-decouple-indirect-buffer-folds)
;; Return the buffer.
indirect-buffer)
(error (make-indirect-buffer buffer bname)))))
(cl-defun org-get-indirect-buffer (&optional (buffer (current-buffer)) heading)
"Return an indirect buffer based on BUFFER.
If HEADING, append it to the name of the new buffer."
(let* ((base-buffer (or (buffer-base-buffer buffer) buffer))
(buffer-name (generate-new-buffer-name
(format "%s%s"
(buffer-name base-buffer)
(if heading
(concat "::" heading)
""))))
(indirect-buffer (make-indirect-buffer base-buffer buffer-name 'clone)))
;; Decouple folding state. We need to do it manually since
;; `make-indirect-buffer' does not run
;; `clone-indirect-buffer-hook'.
(org-fold-core-decouple-indirect-buffer-folds)
indirect-buffer))
(defun org-set-frame-title (title)
"Set the title of the current frame to the string TITLE."