From: Adam Porter <adam@alphapapa.net>
To: emacs-orgmode@gnu.org
Subject: [PATCH] * lisp/org.el: (org-get-indirect-buffer) Allow indirect base buffers
Date: Fri, 4 Nov 2022 14:58:32 -0500 [thread overview]
Message-ID: <66cdbc7d-9720-d124-a9f1-2467ae07a4ef@alphapapa.net> (raw)
[-- Attachment #1: Type: text/plain, Size: 144 bytes --]
Hi,
The attached patch improves the function org-get-indirect-buffer, fixing
a bug, clarifying the code, and adding a docstring.
Thanks,
Adam
[-- Attachment #2: 0001-lisp-org.el-org-get-indirect-buffer-Allow-indirect-b.patch --]
[-- Type: text/x-patch, Size: 3127 bytes --]
From 8e70024cae3f4569d6a0c86a0e4d8079126fe9e5 Mon Sep 17 00:00:00 2001
From: Adam Porter <adam@alphapapa.net>
Date: Fri, 4 Nov 2022 14:52:58 -0500
Subject: [PATCH] * 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 and a FIXME are added.
---
lisp/org.el | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/lisp/org.el b/lisp/org.el
index d8708f8f2..3b67040f7 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -6160,25 +6160,32 @@ 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)))
+(cl-defun org-get-indirect-buffer (&optional (buffer (current-buffer)) heading)
+ "Return an indirect buffer based on BUFFER.
+If HEADING, prepend it to the name of the new buffer."
+ (let* ((base-buffer (or (buffer-base-buffer buffer) buffer))
+ (suffix-prefix (if heading
+ (concat heading "-")
+ ""))
+ (buffer-name (cl-loop for n from 1 to 100
+ for suffix = (format "%s%s" suffix-prefix n)
+ for name = (format "%s-%s"
+ (buffer-name base-buffer)
+ suffix)
+ while (buffer-live-p (get-buffer name))
+ finally return name)))
(condition-case nil
- (let ((indirect-buffer (make-indirect-buffer buffer bname 'clone)))
+ (let ((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)
;; Return the buffer.
indirect-buffer)
- (error (make-indirect-buffer buffer bname)))))
+ ;; FIXME: Explain why this `condition-case' is necessary. Why
+ ;; could an error be signaled with the CLONE argument non-nil,
+ ;; and why would trying again without CLONE solve the problem?
+ (error (make-indirect-buffer base-buffer buffer-name)))))
(defun org-set-frame-title (title)
"Set the title of the current frame to the string TITLE."
--
2.34.0
next reply other threads:[~2022-11-04 19:59 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-04 19:58 Adam Porter [this message]
2022-11-05 8:09 ` [PATCH] * lisp/org.el: (org-get-indirect-buffer) Allow indirect base buffers Ihor Radchenko
2022-11-06 21:40 ` Adam Porter
2022-11-07 3:17 ` Ihor Radchenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=66cdbc7d-9720-d124-a9f1-2467ae07a4ef@alphapapa.net \
--to=adam@alphapapa.net \
--cc=emacs-orgmode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).