emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/orgalist f13a1e3: Fix narrowed region before calling fi


From: Nicolas Goaziou
Subject: [elpa] externals/orgalist f13a1e3: Fix narrowed region before calling filling function
Date: Sun, 27 Sep 2020 06:11:31 -0400 (EDT)

branch: externals/orgalist
commit f13a1e35032a2648ddfb09d9d56e65e7c88483af
Author: Nicolas Goaziou <mail@nicolasgoaziou.fr>
Commit: Nicolas Goaziou <mail@nicolasgoaziou.fr>

    Fix narrowed region before calling filling function
    
    * orgalist.el (orgalist--call-in-item): Narrow buffer to a part of the
    item without any child.  Also handle text between two sub-lists, as in
    the following example:
    
    - item
      - sub-item 1
      Text in-between
      - sub-item 2
---
 orgalist.el | 38 +++++++++++++++++++++++++++++---------
 1 file changed, 29 insertions(+), 9 deletions(-)

diff --git a/orgalist.el b/orgalist.el
index 74cbfc1..ac66eda 100644
--- a/orgalist.el
+++ b/orgalist.el
@@ -251,16 +251,36 @@ group 4: description tag")
 
 (defun orgalist--call-in-item (fun pos &rest arguments)
   "Call function FUN with buffer narrowed to item starting at POS.
-Call function with ARGUMENTS.  Return the value FUN returns."
-  (let* ((struct (save-excursion (goto-char pos) (orgalist--struct)))
-         (next (org-list-get-item-end pos struct))
-         (fill-prefix
-          (make-string (+ (length (org-list-get-bullet pos struct))
-                          (org-list-get-ind pos struct))
-                       ?\s)))
+
+Call function with ARGUMENTS.  Return the value FUN returns.
+
+Buffer is narrowed to the surrounding part of the item which
+doesn't include any sub-item.  Wrap `fill-prefix', set to the
+indentation of the current item, before calling FUN."
+  (let* ((struct (org-with-point-at pos (orgalist--struct))))
     (save-restriction
-      (narrow-to-region pos next)
-      (apply fun arguments))))
+      ;; Narrow to the part before first child, if any, or between two
+      ;; consecutive items.
+      (let ((children (org-list-get-children
+                       pos struct (org-list-parents-alist struct)))
+            start end)
+        (catch :exit
+          (dolist (child children)
+            (cond
+             ((> (point) child)
+              (setq start (org-list-get-item-end child struct)))
+             ((< (point) child)
+              (setq end child)
+              (throw :exit t))
+             (t
+              (error "Point does not belong directly to item %s" pos)))))
+        (narrow-to-region (or start pos)
+                          (or end (org-list-get-item-end pos struct))))
+      (let ((fill-prefix
+             (make-string (+ (length (org-list-get-bullet pos struct))
+                             (org-list-get-ind pos struct))
+                          ?\s)))
+        (apply fun arguments)))))
 
 (defun orgalist--boundaries ()
   "Return buffer boundaries, as a cons cell, where lists are acceptable.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]