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

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

[elpa] externals/org b8a0ddf52f 4/4: Use the full org-fold-core API when


From: ELPA Syncer
Subject: [elpa] externals/org b8a0ddf52f 4/4: Use the full org-fold-core API when `org-fold-core-style' is `overlays'
Date: Sat, 13 Aug 2022 03:57:52 -0400 (EDT)

branch: externals/org
commit b8a0ddf52f4d5b5a3293affb45d1e8fd0426a7f0
Author: Ihor Radchenko <yantar92@gmail.com>
Commit: Ihor Radchenko <yantar92@gmail.com>

    Use the full org-fold-core API when `org-fold-core-style' is `overlays'
    
    The old fallback folding mechanism was re-using old function versions
    to work with overlay folds directly.  Switch to using org-fold-core
    API instead.  This avoids code duplication.
    
    * lisp/ol.el (org-toggle-link-display--overlays): Merge overlay and
    text-property versions.
    (org-toggle-link-display--text-properties):
    (org-toggle-link-display):
    * lisp/org-cycle.el (org-cycle-overview--overlays):
    (org-cycle-overview--text-properties):
    (org-cycle-overview):
    (org-cycle-content--text-properties):
    (org-cycle-content):
    (org-cycle-content--overlays):
    * lisp/org-element.el (org-element-swap-A-B--overlays):
    (org-element-swap-A-B):
    (org-element-swap-A-B--text-properties):
    * lisp/org-fold.el (org-fold-save-outline-visibility--overlays):
    (org-fold-save-outline-visibility--text-properties):
    (org-fold-save-outline-visibility):
    (org-fold-region--overlays):
    (org-fold-region):
    (org-fold-show-all--text-properties):
    (org-fold-show-all--overlays):
    (org-fold-show-all):
    (org-fold-show-branches-buffer--text-properties):
    (org-fold-show-branches-buffer):
    (org-fold-show-branches-buffer--overlays):
    (org-fold--hide-drawers--overlays):
    (org-fold--hide-drawers--text-properties):
    (org-fold--hide-drawers):
    (org-fold-show-set-visibility--overlays):
    (org-fold-show-set-visibility--text-properties):
    (org-fold-show-set-visibility):
    (org-fold-check-before-invisible-edit--overlays):
    (org-fold-check-before-invisible-edit--text-properties):
    (org-fold-check-before-invisible-edit):
    (org-fold--hide-wrapper-toggle):
    * lisp/org-inlinetask.el 
(org-inlinetask-toggle-visibility--text-properties):
    (org-inlinetask-toggle-visibility):
    (org-inlinetask-toggle-visibility--overlays):
    * lisp/org-list.el (org-list-swap-items--text-properties):
    (org-list-swap-items):
    (org-list-swap-items--overlays):
    * lisp/org-macs.el (org-invisible-p--text-properties):
    (org-invisible-p):
    (org-invisible-p--overlays):
    (org-find-visible--overlays):
    (org-find-visible--text-properties):
    (org-find-visible):
    (org-find-invisible--overlays):
    (org-find-invisible--text-properties):
    (org-find-invisible):
    * lisp/org.el (org-next-visible-heading--overlays):
    (org-next-visible-heading--text-properties):
    (org-next-visible-heading):
    (org--forward-paragraph-once--overlays):
    (org--forward-paragraph-once--text-properties):
    (org--forward-paragraph-once):
    (org--backward-paragraph-once--overlays):
    (org--backward-paragraph-once--text-properties):
    (org--backward-paragraph-once):
    
    * testing/lisp/test-org.el (test-org/drag-element-backward):
    (test-org/drag-element-forward): Update tests.
---
 lisp/ol.el                    |  15 +-
 lisp/org-cycle.el             |  47 +-----
 lisp/org-element.el           | 103 +++----------
 lisp/org-fold.el              | 334 +++---------------------------------------
 lisp/org-inlinetask.el        |  22 +--
 lisp/org-list.el              | 115 ++-------------
 lisp/org-macs.el              |  45 +-----
 lisp/org.el                   | 227 +---------------------------
 testing/lisp/test-org-list.el |   4 +-
 testing/lisp/test-org.el      |   4 +-
 10 files changed, 71 insertions(+), 845 deletions(-)

diff --git a/lisp/ol.el b/lisp/ol.el
index b7d74d0bf2..a463e3621b 100644
--- a/lisp/ol.el
+++ b/lisp/ol.el
@@ -1491,24 +1491,11 @@ If the link is in hidden text, expose it."
     (org-fold-core-set-folding-spec-property (car org-link--link-folding-spec) 
:visible t)))
 
 ;;;###autoload
-(defun org-toggle-link-display--overlays ()
-  "Toggle the literal or descriptive display of links."
-  (interactive)
-  (if org-link-descriptive (remove-from-invisibility-spec '(org-link))
-    (add-to-invisibility-spec '(org-link)))
-  (org-restart-font-lock)
-  (setq org-link-descriptive (not org-link-descriptive)))
-(defun org-toggle-link-display--text-properties ()
+(defun org-toggle-link-display ()
   "Toggle the literal or descriptive display of links in current buffer."
   (interactive)
   (setq org-link-descriptive (not org-link-descriptive))
   (org-link-descriptive-ensure))
-(defsubst org-toggle-link-display ()
-  "Toggle the literal or descriptive display of links."
-  (interactive)
-  (if (eq org-fold-core-style 'text-properties)
-      (org-toggle-link-display--text-properties)
-    (org-toggle-link-display--overlays)))
 
 ;;;###autoload
 (defun org-store-link (arg &optional interactive?)
diff --git a/lisp/org-cycle.el b/lisp/org-cycle.el
index 41d878a149..8b47799518 100644
--- a/lisp/org-cycle.el
+++ b/lisp/org-cycle.el
@@ -644,23 +644,7 @@ With a numeric prefix, show all headlines up to that 
level."
                (_ nil)))
            (org-end-of-subtree)))))))
 
-(defun org-cycle-overview--overlays ()
-  "Switch to overview mode, showing only top-level headlines."
-  (interactive)
-  (org-fold-show-all '(headings drawers))
-  (save-excursion
-    (goto-char (point-min))
-    (when (re-search-forward org-outline-regexp-bol nil t)
-      (let* ((last (line-end-position))
-             (level (- (match-end 0) (match-beginning 0) 1))
-             (regexp (format "^\\*\\{1,%d\\} " level)))
-        (while (re-search-forward regexp nil :move)
-          (org-fold-region last (line-end-position 0) t 'outline)
-          (setq last (line-end-position))
-          (setq level (- (match-end 0) (match-beginning 0) 1))
-          (setq regexp (format "^\\*\\{1,%d\\} " level)))
-        (org-fold-region last (point) t 'outline)))))
-(defun org-cycle-overview--text-properties ()
+(defun org-cycle-overview ()
   "Switch to overview mode, showing only top-level headlines."
   (interactive)
   (save-excursion
@@ -680,14 +664,8 @@ With a numeric prefix, show all headlines up to that 
level."
           (setq level (- (match-end 0) (match-beginning 0) 1))
           (setq regexp (format "^\\*\\{1,%d\\} " level)))
         (org-fold-region last (point) t 'outline)))))
-(defun org-cycle-overview ()
-  "Switch to overview mode, showing only top-level headlines."
-  (interactive)
-  (if (eq org-fold-core-style 'text-properties)
-      (org-cycle-overview--text-properties)
-    (org-cycle-overview--overlays)))
 
-(defun org-cycle-content--text-properties (&optional arg)
+(defun org-cycle-content (&optional arg)
   "Show all headlines in the buffer, like a table of contents.
 With numerical argument N, show content up to level N."
   (interactive "p")
@@ -706,27 +684,6 @@ With numerical argument N, show content up to level N."
       (while (re-search-backward regexp nil t)
         (org-fold-region (line-end-position) last t 'outline)
         (setq last (line-end-position 0))))))
-(defun org-cycle-content--overlays (&optional arg)
-  "Show all headlines in the buffer, like a table of contents.
-With numerical argument N, show content up to level N."
-  (interactive "p")
-  (org-fold-show-all '(headings drawers))
-  (save-excursion
-    (goto-char (point-max))
-    (let ((regexp (if (and (wholenump arg) (> arg 0))
-                      (format "^\\*\\{1,%d\\} " arg)
-                    "^\\*+ "))
-          (last (point)))
-      (while (re-search-backward regexp nil t)
-        (org-fold-region (line-end-position) last t 'outline)
-        (setq last (line-end-position 0))))))
-(defun org-cycle-content (&optional arg)
-  "Show all headlines in the buffer, like a table of contents.
-With numerical argument N, show content up to level N."
-  (interactive "p")
-  (if (eq org-fold-core-style 'text-properties)
-      (org-cycle-content--text-properties arg)
-    (org-cycle-content--overlays arg)))
 
 (defvar org-cycle-scroll-position-to-restore nil
   "Temporarily store scroll position to restore.")
diff --git a/lisp/org-element.el b/lisp/org-element.el
index 9e9b7c5ece..243e6e9544 100644
--- a/lisp/org-element.el
+++ b/lisp/org-element.el
@@ -8024,7 +8024,7 @@ parse tree."
     (or (and (>= beg-A beg-B) (<= end-A end-B))
        (and (>= beg-B beg-A) (<= end-B end-A)))))
 
-(defun org-element-swap-A-B--overlays (elem-A elem-B)
+(defun org-element-swap-A-B (elem-A elem-B)
   "Swap elements ELEM-A and ELEM-B.
 Assume ELEM-B is after ELEM-A in the buffer.  Leave point at the
 end of ELEM-A."
@@ -8039,79 +8039,13 @@ end of ELEM-A."
     (when (and specialp
               (or (not (eq (org-element-type elem-B) 'paragraph))
                   (/= (org-element-property :begin elem-B)
-                      (org-element-property :contents-begin elem-B))))
+                     (org-element-property :contents-begin elem-B))))
       (error "Cannot swap elements"))
-    ;; In a special situation, ELEM-A will have no indentation.  We'll
-    ;; give it ELEM-B's (which will in, in turn, have no indentation).
-    (let* ((ind-B (when specialp
-                   (goto-char (org-element-property :begin elem-B))
-                   (current-indentation)))
-          (beg-A (org-element-property :begin elem-A))
-          (end-A (save-excursion
-                   (goto-char (org-element-property :end elem-A))
-                   (skip-chars-backward " \r\t\n")
-                   (point-at-eol)))
-          (beg-B (org-element-property :begin elem-B))
-          (end-B (save-excursion
-                   (goto-char (org-element-property :end elem-B))
-                   (skip-chars-backward " \r\t\n")
-                   (point-at-eol)))
-          ;; Store inner overlays responsible for visibility status.
-          ;; We also need to store their boundaries as they will be
-          ;; removed from buffer.
-          (overlays
-           (cons
-            (delq nil
-                  (mapcar (lambda (o)
-                            (and (>= (overlay-start o) beg-A)
-                                 (<= (overlay-end o) end-A)
-                                 (list o (overlay-start o) (overlay-end o))))
-                          (overlays-in beg-A end-A)))
-            (delq nil
-                  (mapcar (lambda (o)
-                            (and (>= (overlay-start o) beg-B)
-                                 (<= (overlay-end o) end-B)
-                                 (list o (overlay-start o) (overlay-end o))))
-                          (overlays-in beg-B end-B)))))
-          ;; Get contents.
-          (body-A (buffer-substring beg-A end-A))
-          (body-B (delete-and-extract-region beg-B end-B)))
-      (goto-char beg-B)
-      (when specialp
-       (setq body-B (replace-regexp-in-string "\\`[ \t]*" "" body-B))
-       (indent-to-column ind-B))
-      (insert body-A)
-      ;; Restore ex ELEM-A overlays.
-      (let ((offset (- beg-B beg-A)))
-       (dolist (o (car overlays))
-         (move-overlay (car o) (+ (nth 1 o) offset) (+ (nth 2 o) offset)))
-       (goto-char beg-A)
-       (delete-region beg-A end-A)
-       (insert body-B)
-       ;; Restore ex ELEM-B overlays.
-       (dolist (o (cdr overlays))
-         (move-overlay (car o) (- (nth 1 o) offset) (- (nth 2 o) offset))))
-      (goto-char (org-element-property :end elem-B)))))
-(defun org-element-swap-A-B--text-properties (elem-A elem-B)
-  "Swap elements ELEM-A and ELEM-B.
-Assume ELEM-B is after ELEM-A in the buffer.  Leave point at the
-end of ELEM-A."
-  (goto-char (org-element-property :begin elem-A))
-  ;; There are two special cases when an element doesn't start at bol:
-  ;; the first paragraph in an item or in a footnote definition.
-  (let ((specialp (not (bolp))))
-    ;; Only a paragraph without any affiliated keyword can be moved at
-    ;; ELEM-A position in such a situation.  Note that the case of
-    ;; a footnote definition is impossible: it cannot contain two
-    ;; paragraphs in a row because it cannot contain a blank line.
-    (when (and specialp
-              (or (not (eq (org-element-type elem-B) 'paragraph))
-                  (/= (org-element-property :begin elem-B)
-                     (org-element-property :contents-begin elem-B))))
-      (error "Cannot swap elements"))
-    ;; In a special situation, ELEM-A will have no indentation.  We'll
-    ;; give it ELEM-B's (which will in, in turn, have no indentation).
-    (org-fold-core-ignore-modifications ;; Preserve folding state
+    ;; Preserve folding state when `org-fold-core-style' is set to
+    ;; `text-properties'.
+    (org-fold-core-ignore-modifications
+      ;; In a special situation, ELEM-A will have no indentation.  We'll
+      ;; give it ELEM-B's (which will in, in turn, have no indentation).
       (let* ((ind-B (when specialp
                      (goto-char (org-element-property :begin elem-B))
                      (current-indentation)))
@@ -8125,26 +8059,31 @@ end of ELEM-A."
                      (goto-char (org-element-property :end elem-B))
                      (skip-chars-backward " \r\t\n")
                      (point-at-eol)))
+            ;; Store inner folds responsible for visibility status.
+            (folds
+             (cons
+               (org-fold-core-get-regions :from beg-A :to end-A :relative t)
+               (org-fold-core-get-regions :from beg-B :to end-B :relative t)))
             ;; Get contents.
             (body-A (buffer-substring beg-A end-A))
-            (body-B (delete-and-extract-region beg-B end-B)))
+            (body-B (buffer-substring beg-B end-B)))
+        ;; Clear up the folds.
+        (org-fold-region beg-A end-A nil)
+        (org-fold-region beg-B end-B nil)
+        (delete-region beg-B end-B)
         (goto-char beg-B)
         (when specialp
          (setq body-B (replace-regexp-in-string "\\`[ \t]*" "" body-B))
          (indent-to-column ind-B))
         (insert body-A)
+        ;; Restore ex ELEM-A folds.
+        (org-fold-core-regions (car folds) :relative beg-B)
        (goto-char beg-A)
        (delete-region beg-A end-A)
        (insert body-B)
+        ;; Restore ex ELEM-A folds.
+        (org-fold-core-regions (cdr folds) :relative beg-A)
         (goto-char (org-element-property :end elem-B))))))
-(defsubst org-element-swap-A-B (elem-A elem-B)
-  "Swap elements ELEM-A and ELEM-B.
-Assume ELEM-B is after ELEM-A in the buffer.  Leave point at the
-end of ELEM-A."
-  (if (eq org-fold-core-style 'text-properties)
-      (org-element-swap-A-B--text-properties elem-A elem-B)
-    (org-element-swap-A-B--overlays elem-A elem-B)))
-
 
 (provide 'org-element)
 
diff --git a/lisp/org-fold.el b/lisp/org-fold.el
index 4507369237..680d0b7a59 100644
--- a/lisp/org-fold.el
+++ b/lisp/org-fold.el
@@ -254,6 +254,7 @@ smart            Make point visible, and do 
insertion/deletion if it is
 (defalias 'org-fold-get-folding-spec #'org-fold-core-get-folding-spec)
 (defalias 'org-fold-get-folding-specs-in-region 
#'org-fold-core-get-folding-specs-in-region)
 (defalias 'org-fold-get-region-at-point #'org-fold-core-get-region-at-point)
+(defalias 'org-fold-get-regions #'org-fold-core-get-regions)
 (defalias 'org-fold-next-visibility-change 
#'org-fold-core-next-visibility-change)
 (defalias 'org-fold-previous-visibility-change 
#'org-fold-core-previous-visibility-change)
 (defalias 'org-fold-next-folding-state-change 
#'org-fold-core-next-folding-state-change)
@@ -262,110 +263,16 @@ smart            Make point visible, and do 
insertion/deletion if it is
 
 ;;;;; Macros
 
-(defmacro org-fold-save-outline-visibility--overlays (use-markers &rest body)
-  "Save and restore outline visibility around BODY.
-If USE-MARKERS is non-nil, use markers for the positions.  This
-means that the buffer may change while running BODY, but it also
-means that the buffer should stay alive during the operation,
-because otherwise all these markers will point to nowhere."
-  (declare (debug (form body)) (indent 1))
-  (org-with-gensyms (data invisible-types markers?)
-    `(let* ((,invisible-types '(org-hide-block outline))
-           (,markers? ,use-markers)
-           (,data
-            (mapcar (lambda (o)
-                      (let ((beg (overlay-start o))
-                            (end (overlay-end o))
-                            (type (overlay-get o 'invisible)))
-                        (and beg end
-                             (> end beg)
-                             (memq type ,invisible-types)
-                             (list (if ,markers? (copy-marker beg) beg)
-                                   (if ,markers? (copy-marker end t) end)
-                                   type))))
-                    (org-with-wide-buffer
-                     (overlays-in (point-min) (point-max))))))
-       (unwind-protect (progn ,@body)
-        (org-with-wide-buffer
-         (dolist (type ,invisible-types)
-           (remove-overlays (point-min) (point-max) 'invisible type))
-         (pcase-dolist (`(,beg ,end ,type) (delq nil ,data))
-           (org-fold-region beg end t type)
-           (when ,markers?
-             (set-marker beg nil)
-             (set-marker end nil))))))))
-(defmacro org-fold-save-outline-visibility--text-properties (use-markers &rest 
body)
-  "Save and restore outline visibility around BODY.
-If USE-MARKERS is non-nil, use markers for the positions.  This
-means that the buffer may change while running BODY, but it also
-means that the buffer should stay alive during the operation,
-because otherwise all these markers will point to nowhere."
-  (declare (debug (form body)) (indent 1))
-  (org-with-gensyms (data specs markers?)
-    `(let* ((,specs (org-fold-core-folding-spec-list))
-           (,markers? ,use-markers)
-           (,data
-             (org-with-wide-buffer
-              (let (data-val)
-                (dolist (spec ,specs)
-                  (let ((pos (point-min)))
-                   (while (< pos (point-max))
-                      (when (org-fold-get-folding-spec spec pos)
-                        (let ((region (org-fold-get-region-at-point spec pos)))
-                         (if ,markers?
-                             (push (list (copy-marker (car region))
-                                         (copy-marker (cdr region) t)
-                                          spec)
-                                    data-val)
-                            (push (list (car region) (cdr region) spec)
-                                 data-val))))
-                      (setq pos (org-fold-next-folding-state-change spec 
pos)))))
-                data-val))))
-       (unwind-protect (progn ,@body)
-        (org-with-wide-buffer
-         (org-fold-region (point-min) (point-max) nil)
-         (pcase-dolist (`(,beg ,end ,spec) (delq nil ,data))
-           (org-fold-region beg end t spec)
-           (when ,markers?
-             (set-marker beg nil)
-             (set-marker end nil))))))))
-(defmacro org-fold-save-outline-visibility (use-markers &rest body)
-  "Save and restore outline visibility around BODY.
-If USE-MARKERS is non-nil, use markers for the positions.  This
-means that the buffer may change while running BODY, but it also
-means that the buffer should stay alive during the operation,
-because otherwise all these markers will point to nowhere."
-  (declare (debug (form body)) (indent 1))
-  `(if (eq org-fold-core-style 'text-properties)
-       (org-fold-save-outline-visibility--text-properties ,use-markers ,@body)
-     (org-fold-save-outline-visibility--overlays ,use-markers ,@body)))
+(defalias 'org-fold-save-outline-visibility #'org-fold-core-save-visibility)
 
 ;;;; Changing visibility (regions, blocks, drawers, headlines)
 
 ;;;;; Region visibility
 
-;; (defalias 'org-fold-region #'org-fold-core-region)
-(defun org-fold-region--overlays (from to flag spec)
-  "Hide or show lines from FROM to TO, according to FLAG.
-SPEC is the invisibility spec, as a symbol."
-  (remove-overlays from to 'invisible spec)
-  ;; Use `front-advance' since text right before to the beginning of
-  ;; the overlay belongs to the visible line than to the contents.
-  (when flag
-    (let ((o (make-overlay from to nil 'front-advance)))
-      (overlay-put o 'evaporate t)
-      (overlay-put o 'invisible spec)
-      (overlay-put o
-                   'isearch-open-invisible
-                   (lambda (&rest _) (org-fold-show-context 'isearch))))))
-(defsubst org-fold-region (from to flag &optional spec)
-  "Hide or show lines from FROM to TO, according to FLAG.
-SPEC is the invisibility spec, as a symbol."
-  (if (eq org-fold-core-style 'text-properties)
-      (org-fold-core-region from to flag spec)
-    (org-fold-region--overlays from to flag spec)))
-
-(defun org-fold-show-all--text-properties (&optional types)
+(defalias 'org-fold-region #'org-fold-core-region)
+(defalias 'org-fold-regions #'org-fold-core-regions)
+
+(defun org-fold-show-all (&optional types)
   "Show all contents in the visible part of the buffer.
 By default, the function expands headings, blocks and drawers.
 When optional argument TYPES is a list of symbols among `blocks',
@@ -373,51 +280,11 @@ When optional argument TYPES is a list of symbols among 
`blocks',
   (interactive)
   (dolist (type (or types '(blocks drawers headings)))
     (org-fold-region (point-min) (point-max) nil
-                    (pcase type
-                      (`blocks 'block)
-                      (`drawers 'drawer)
-                      (`headings 'headline)
-                      (_ (error "Invalid type: %S" type))))))
-(defun org-fold-show-all--overlays (&optional types)
-  "Show all contents in the visible part of the buffer.
-By default, the function expands headings, blocks and drawers.
-When optional argument TYPE is a list of symbols among `blocks',
-`drawers' and `headings', to only expand one specific type."
-  (interactive)
-  (let ((types (or types '(blocks drawers headings))))
-    (when (memq 'blocks types)
-      (org-fold-region (point-min) (point-max) nil 'org-hide-block))
-    (cond
-     ;; Fast path.  Since headings and drawers share the same
-     ;; invisible spec, clear everything in one go.
-     ((and (memq 'headings types)
-           (memq 'drawers types))
-      (org-fold-region (point-min) (point-max) nil 'outline))
-     ((memq 'headings types)
-      (org-fold-region (point-min) (point-max) nil 'outline)
-      (org-cycle-hide-drawers 'all))
-     ((memq 'drawers types)
-      (save-excursion
-        (goto-char (point-min))
-        (while (re-search-forward org-drawer-regexp nil t)
-          (let* ((pair (get-char-property-and-overlay (line-beginning-position)
-                                                      'invisible))
-                 (o (cdr-safe pair)))
-            (if (overlayp o) (goto-char (overlay-end o))
-              (pcase (get-char-property-and-overlay (point) 'invisible)
-                (`(outline . ,o)
-                 (goto-char (overlay-end o))
-                 (delete-overlay o))
-                (_ nil))))))))))
-(defsubst org-fold-show-all (&optional types)
-  "Show all contents in the visible part of the buffer.
-By default, the function expands headings, blocks and drawers.
-When optional argument TYPES is a list of symbols among `blocks',
-`drawers' and `headings', to only expand one specific type."
-  (interactive)
-  (if (eq org-fold-core-style 'text-properties)
-      (org-fold-show-all--text-properties types)
-    (org-fold-show-all--overlays types)))
+            (pcase type
+              (`blocks 'block)
+              (`drawers 'drawer)
+              (`headings 'headline)
+              (_ (error "Invalid type: %S" type))))))
 
 (defun org-fold-flag-above-first-heading (&optional arg)
   "Hide from bob up to the first heading.
@@ -596,7 +463,7 @@ heading to appear."
   (interactive)
   (org-fold-show-children 1000))
 
-(defun org-fold-show-branches-buffer--text-properties ()
+(defun org-fold-show-branches-buffer ()
   "Show all branches in the buffer."
   (org-fold-flag-above-first-heading)
   (org-fold-hide-sublevels 1)
@@ -605,20 +472,6 @@ heading to appear."
     (while (outline-get-next-sibling)
       (org-fold-show-branches)))
   (goto-char (point-min)))
-(defun org-fold-show-branches-buffer--overlays ()
-  "Show all branches in the buffer."
-  (org-fold-flag-above-first-heading)
-  (outline-hide-sublevels 1)
-  (unless (eobp)
-    (outline-show-branches)
-    (while (outline-get-next-sibling)
-      (outline-show-branches)))
-  (goto-char (point-min)))
-(defsubst org-fold-show-branches-buffer ()
-  "Show all branches in the buffer."
-  (if (eq org-fold-core-style 'text-properties)
-      (org-fold-show-branches-buffer--text-properties)
-    (org-fold-show-branches-buffer--overlays)))
 
 ;;;;; Blocks and drawers visibility
 
@@ -652,18 +505,12 @@ Return a non-nil value when toggling is successful."
         ;; at the block closing line.
         (unless (let ((eol (line-end-position)))
                   (and (> eol start) (/= eol end)))
-          (let* ((spec (if (eq org-fold-core-style 'text-properties)
-                           category
-                         (if (eq category 'block) 'org-hide-block 'outline)))
-                 (flag
-                  (cond ((eq force 'off) nil)
-                        (force t)
-                        ((if (eq org-fold-core-style 'text-properties)
-                             (org-fold-folded-p start spec)
-                           (eq spec (get-char-property start 'invisible)))
-                         nil)
-                        (t t))))
-            (org-fold-region start end flag spec))
+          (org-fold-region start end
+                   (cond ((eq force 'off) nil)
+                         (force t)
+                         ((org-fold-folded-p start category) nil)
+                         (t t))
+                   category)
           ;; When the block is hidden away, make sure point is left in
           ;; a visible part of the buffer.
           (when (invisible-p (max (1- (point)) (point-min)))
@@ -716,27 +563,7 @@ Return a non-nil value when toggling is successful."
         (end (point-max)))
     (org-fold--hide-drawers begin end)))
 
-(defun org-fold--hide-drawers--overlays (begin end)
-  "Hide all drawers between BEGIN and END."
-  (save-excursion
-    (goto-char begin)
-    (while (and (< (point) end) (re-search-forward org-drawer-regexp end t))
-      (let* ((pair (get-char-property-and-overlay (line-beginning-position)
-                                                  'invisible))
-             (o (cdr-safe pair)))
-        (if (overlayp o) (goto-char (overlay-end o)) ;invisible drawer
-          (pcase (get-char-property-and-overlay (point) 'invisible)
-            (`(outline . ,o) (goto-char (overlay-end o))) ;already folded
-            (_
-             (let* ((drawer (org-element-at-point))
-                    (type (org-element-type drawer)))
-               (when (memq type '(drawer property-drawer))
-                 (org-fold-hide-drawer-toggle t nil drawer)
-                 ;; Make sure to skip drawer entirely or we might flag it
-                 ;; another time when matching its ending line with
-                 ;; `org-drawer-regexp'.
-                 (goto-char (org-element-property :end drawer)))))))))))
-(defun org-fold--hide-drawers--text-properties (begin end)
+(defun org-fold--hide-drawers (begin end)
   "Hide all drawers between BEGIN and END."
   (save-excursion
     (goto-char begin)
@@ -753,11 +580,6 @@ Return a non-nil value when toggling is successful."
             ;; another time when matching its ending line with
             ;; `org-drawer-regexp'.
             (goto-char (org-element-property :end drawer))))))))
-(defun org-fold--hide-drawers (begin end)
-  "Hide all drawers between BEGIN and END."
-  (if (eq org-fold-core-style 'text-properties)
-      (org-fold--hide-drawers--text-properties begin end)
-    (org-fold--hide-drawers--overlays begin end)))
 
 (defun org-fold-hide-archived-subtrees (beg end)
   "Re-hide all archived subtrees after a visibility state change."
@@ -784,43 +606,10 @@ be shown."
         ((cdr (assq key org-fold-show-context-detail)))
         (t (cdr (assq 'default org-fold-show-context-detail))))))
 
-(defun org-fold-show-set-visibility--overlays (detail)
-  "Set visibility around point according to DETAIL.
-DETAIL is either nil, `minimal', `local', `ancestors',
-`ancestors-full', `lineage', `tree', `canonical' or t.  See
-`org-show-context-detail' for more information."
-  ;; Show current heading and possibly its entry, following headline
-  ;; or all children.
-  (if (and (org-at-heading-p) (not (eq detail 'local)))
-      (org-fold-heading nil)
-    (org-fold-show-entry)
-    ;; If point is hidden within a drawer or a block, make sure to
-    ;; expose it.
-    (dolist (o (overlays-at (point)))
-      (when (memq (overlay-get o 'invisible) '(org-hide-block outline))
-        (delete-overlay o)))
-    (unless (org-before-first-heading-p)
-      (org-with-limited-levels
-       (cl-case detail
-         ((tree canonical t) (org-fold-show-children))
-         ((nil minimal ancestors ancestors-full))
-         (t (save-excursion
-              (outline-next-heading)
-              (org-fold-heading nil)))))))
-  ;; Show whole subtree.
-  (when (eq detail 'ancestors-full) (org-fold-show-subtree))
-  ;; Show all siblings.
-  (when (eq detail 'lineage) (org-fold-show-siblings))
-  ;; Show ancestors, possibly with their children.
-  (when (memq detail '(ancestors ancestors-full lineage tree canonical t))
-    (save-excursion
-      (while (org-up-heading-safe)
-        (org-fold-heading nil)
-        (when (memq detail '(canonical t)) (org-fold-show-entry))
-        (when (memq detail '(tree canonical t)) (org-fold-show-children))))))
+
 (defvar org-hide-emphasis-markers); Defined in org.el
 (defvar org-pretty-entities); Defined in org.el
-(defun org-fold-show-set-visibility--text-properties (detail)
+(defun org-fold-show-set-visibility (detail)
   "Set visibility around point according to DETAIL.
 DETAIL is either nil, `minimal', `local', `ancestors',
 `ancestors-full', `lineage', `tree', `canonical' or t.  See
@@ -880,14 +669,6 @@ DETAIL is either nil, `minimal', `local', `ancestors',
        (org-fold-heading nil)
        (when (memq detail '(canonical t)) (org-fold-show-entry))
        (when (memq detail '(tree canonical t)) (org-fold-show-children))))))
-(defun org-fold-show-set-visibility (detail)
-  "Set visibility around point according to DETAIL.
-DETAIL is either nil, `minimal', `local', `ancestors', `lineage',
-`tree', `canonical' or t.  See `org-fold-show-context-detail' for more
-information."
-  (if (eq org-fold-core-style 'text-properties)
-      (org-fold-show-set-visibility--text-properties detail)
-    (org-fold-show-set-visibility--overlays detail)))
 
 (defun org-fold-reveal (&optional siblings)
   "Show current entry, hierarchy above it, and the following headline.
@@ -1065,70 +846,7 @@ This function is intended to be used as :fragile property 
of
           unfold?)))))
 
 ;; Catching user edits inside invisible text
-(defun org-fold-check-before-invisible-edit--overlays (kind)
-  "Check if editing KIND is dangerous with invisible text around.
-The detailed reaction depends on the user option
-`org-fold-catch-invisible-edits'."
-  ;; First, try to get out of here as quickly as possible, to reduce overhead
-  (when (and org-fold-catch-invisible-edits
-             (or (not (boundp 'visible-mode)) (not visible-mode))
-             (or (get-char-property (point) 'invisible)
-                 (get-char-property (max (point-min) (1- (point))) 
'invisible)))
-    ;; OK, we need to take a closer look.  Do not consider
-    ;; invisibility obtained through text properties (e.g., link
-    ;; fontification), as it cannot be toggled.
-    (let* ((invisible-at-point
-            (pcase (get-char-property-and-overlay (point) 'invisible)
-              (`(,_ . ,(and (pred overlayp) o)) o)))
-           (invisible-before-point
-            (and (not (bobp))
-                 (pcase (get-char-property-and-overlay (1- (point)) 'invisible)
-                   (`(,_ . ,(and (pred overlayp) o)) o))))
-           (border-and-ok-direction
-            (or
-             ;; Check if we are acting predictably before invisible
-             ;; text.
-             (and invisible-at-point (not invisible-before-point)
-                 (memq kind '(insert delete-backward)))
-             ;; Check if we are acting predictably after invisible text
-             ;; This works not well, and I have turned it off.  It seems
-             ;; better to always show and stop after invisible text.
-             ;; (and (not invisible-at-point) invisible-before-point
-             ;;  (memq kind '(insert delete)))
-             )))
-      (when (or invisible-at-point invisible-before-point)
-        (when (eq org-fold-catch-invisible-edits 'error)
-          (user-error "Editing in invisible areas is prohibited, make them 
visible first"))
-        (if (and org-custom-properties-overlays
-                 (y-or-n-p "Display invisible properties in this buffer? "))
-            (org-toggle-custom-properties-visibility)
-          ;; Make the area visible
-          (save-excursion
-            (when (and (not invisible-at-point) invisible-before-point)
-              (goto-char
-               (previous-single-char-property-change (point) 'invisible)))
-            ;; Remove whatever overlay is currently making yet-to-be
-            ;; edited text invisible.  Also remove nested invisibility
-            ;; related overlays.
-            (delete-overlay (or invisible-at-point invisible-before-point))
-            (let ((origin (if invisible-at-point (point) (1- (point)))))
-              (while (pcase (get-char-property-and-overlay origin 'invisible)
-                       (`(,_ . ,(and (pred overlayp) o))
-                        (delete-overlay o)
-                        t)))))
-          (cond
-           ((eq org-fold-catch-invisible-edits 'show)
-            ;; That's it, we do the edit after showing
-            (message
-             "Unfolding invisible region around point before editing")
-            (sit-for 1))
-           ((and (eq org-fold-catch-invisible-edits 'smart)
-                 border-and-ok-direction)
-            (message "Unfolding invisible region around point before editing"))
-           (t
-            ;; Don't do the edit, make the user repeat it in full visibility
-            (user-error "Edit in invisible region aborted, repeat to confirm 
with text visible"))))))))
-(defun org-fold-check-before-invisible-edit--text-properties (kind)
+(defun org-fold-check-before-invisible-edit (kind)
   "Check if editing KIND is dangerous with invisible text around.
 The detailed reaction depends on the user option
 `org-fold-catch-invisible-edits'."
@@ -1179,14 +897,6 @@ The detailed reaction depends on the user option
           (t
            ;; Don't do the edit, make the user repeat it in full visibility
            (user-error "Edit in invisible region aborted, repeat to confirm 
with text visible"))))))))
-(defsubst org-fold-check-before-invisible-edit (kind)
-  "Check if editing KIND is dangerous with invisible text around.
-The detailed reaction depends on the user option
-`org-fold-catch-invisible-edits'."
-  ;; First, try to get out of here as quickly as possible, to reduce overhead
-  (if (eq org-fold-core-style 'text-properties)
-      (org-fold-check-before-invisible-edit--text-properties kind)
-    (org-fold-check-before-invisible-edit--overlays kind)))
 
 (provide 'org-fold)
 
diff --git a/lisp/org-inlinetask.el b/lisp/org-inlinetask.el
index 563b8594fc..07aa94f324 100644
--- a/lisp/org-inlinetask.el
+++ b/lisp/org-inlinetask.el
@@ -305,7 +305,7 @@ If the task has an end part, also demote it."
       (add-text-properties (match-beginning 3) (match-end 3)
                           '(face org-inlinetask font-lock-fontified t)))))
 
-(defun org-inlinetask-toggle-visibility--text-properties ()
+(defun org-inlinetask-toggle-visibility ()
   "Toggle visibility of inline task at point."
   (let ((end (save-excursion
               (org-inlinetask-goto-end)
@@ -320,26 +320,6 @@ If the task has an end part, also demote it."
      ((org-fold-get-folding-spec 'headline (1+ start))
       (org-fold-region start end nil 'headline))
      (t (org-fold-region start end t 'headline)))))
-(defun org-inlinetask-toggle-visibility--overlays ()
-  "Toggle visibility of inline task at point."
-  (let ((end (save-excursion
-              (org-inlinetask-goto-end)
-              (if (bolp) (1- (point)) (point))))
-       (start (save-excursion
-                (org-inlinetask-goto-beginning)
-                (point-at-eol))))
-    (cond
-     ;; Nothing to show/hide.
-     ((= end start))
-     ;; Inlinetask was folded: expand it.
-     ((eq (get-char-property (1+ start) 'invisible) 'outline)
-      (org-fold-region start end nil 'outline))
-     (t (org-fold-region start end t 'outline)))))
-(defsubst org-inlinetask-toggle-visibility ()
-  "Toggle visibility of inline task at point."
-  (if (eq org-fold-core-style 'text-properties)
-      (org-inlinetask-toggle-visibility--text-properties)
-    (org-inlinetask-toggle-visibility--overlays)))
 
 (defun org-inlinetask-hide-tasks (state)
   "Hide inline tasks in buffer when STATE is `contents' or `children'.
diff --git a/lisp/org-list.el b/lisp/org-list.el
index 0f0aaefdc3..ff4a5c5407 100644
--- a/lisp/org-list.el
+++ b/lisp/org-list.el
@@ -1079,7 +1079,7 @@ It determines the number of whitespaces to append by 
looking at
          (replace-match spaces nil nil bullet 1)
        bullet))))
 
-(defun org-list-swap-items--text-properties (beg-A beg-B struct)
+(defun org-list-swap-items (beg-A beg-B struct)
   "Swap item starting at BEG-A with item starting at BEG-B in STRUCT.
 
 Blank lines at the end of items are left in place.  Item
@@ -1102,11 +1102,23 @@ This function modifies STRUCT."
             (body-B (buffer-substring beg-B end-B-no-blank))
             (between-A-no-blank-and-B (buffer-substring end-A-no-blank beg-B))
             (sub-A (cons beg-A (org-list-get-subtree beg-A struct)))
-            (sub-B (cons beg-B (org-list-get-subtree beg-B struct))))
+            (sub-B (cons beg-B (org-list-get-subtree beg-B struct)))
+            ;; Store inner folds responsible for visibility status.
+            (folds
+             (cons
+               (org-fold-core-get-regions :from beg-A :to end-A :relative t)
+               (org-fold-core-get-regions :from beg-B :to end-B :relative t))))
+        ;; Clear up the folds.
+        (org-fold-region beg-A end-B-no-blank nil)
         ;; 1. Move effectively items in buffer.
         (goto-char beg-A)
         (delete-region beg-A end-B-no-blank)
         (insert (concat body-B between-A-no-blank-and-B body-A))
+        ;; Restore visibility status.
+        (org-fold-core-regions (cdr folds) :relative beg-A)
+        (org-fold-core-regions
+         (car folds)
+         :relative (+ beg-B (- size-B size-A (length 
between-A-no-blank-and-B))))
         ;; 2. Now modify struct.  No need to re-read the list, the
         ;;    transformation is just a shift of positions.  Some special
         ;;    attention is required for items ending at END-A and END-B
@@ -1137,105 +1149,6 @@ This function modifies STRUCT."
         (setq struct (sort struct #'car-less-than-car))
         ;; Return structure.
         struct))))
-(defun org-list-swap-items--overlays (beg-A beg-B struct)
-  "Swap item starting at BEG-A with item starting at BEG-B in STRUCT.
-
-Blank lines at the end of items are left in place.  Item
-visibility is preserved.  Return the new structure after the
-changes.
-
-Assume BEG-A is lesser than BEG-B and that BEG-A and BEG-B belong
-to the same sub-list.
-
-This function modifies STRUCT."
-  (save-excursion
-    (let* ((end-A-no-blank (org-list-get-item-end-before-blank beg-A struct))
-          (end-B-no-blank (org-list-get-item-end-before-blank beg-B struct))
-          (end-A (org-list-get-item-end beg-A struct))
-          (end-B (org-list-get-item-end beg-B struct))
-          (size-A (- end-A-no-blank beg-A))
-          (size-B (- end-B-no-blank beg-B))
-          (body-A (buffer-substring beg-A end-A-no-blank))
-          (body-B (buffer-substring beg-B end-B-no-blank))
-          (between-A-no-blank-and-B (buffer-substring end-A-no-blank beg-B))
-          (sub-A (cons beg-A (org-list-get-subtree beg-A struct)))
-          (sub-B (cons beg-B (org-list-get-subtree beg-B struct)))
-          ;; Store overlays responsible for visibility status.  We
-          ;; also need to store their boundaries as they will be
-          ;; removed from buffer.
-          (overlays
-           (cons
-            (delq nil
-                  (mapcar (lambda (o)
-                            (and (>= (overlay-start o) beg-A)
-                                 (<= (overlay-end o) end-A)
-                                 (list o (overlay-start o) (overlay-end o))))
-                          (overlays-in beg-A end-A)))
-            (delq nil
-                  (mapcar (lambda (o)
-                            (and (>= (overlay-start o) beg-B)
-                                 (<= (overlay-end o) end-B)
-                                 (list o (overlay-start o) (overlay-end o))))
-                          (overlays-in beg-B end-B))))))
-      ;; 1. Move effectively items in buffer.
-      (goto-char beg-A)
-      (delete-region beg-A end-B-no-blank)
-      (insert (concat body-B between-A-no-blank-and-B body-A))
-      ;; 2. Now modify struct.  No need to re-read the list, the
-      ;;    transformation is just a shift of positions.  Some special
-      ;;    attention is required for items ending at END-A and END-B
-      ;;    as empty spaces are not moved there.  In others words,
-      ;;    item BEG-A will end with whitespaces that were at the end
-      ;;    of BEG-B and the same applies to BEG-B.
-      (dolist (e struct)
-       (let ((pos (car e)))
-         (cond
-          ((< pos beg-A))
-          ((memq pos sub-A)
-           (let ((end-e (nth 6 e)))
-             (setcar e (+ pos (- end-B-no-blank end-A-no-blank)))
-             (setcar (nthcdr 6 e)
-                     (+ end-e (- end-B-no-blank end-A-no-blank)))
-             (when (= end-e end-A) (setcar (nthcdr 6 e) end-B))))
-          ((memq pos sub-B)
-           (let ((end-e (nth 6 e)))
-             (setcar e (- (+ pos beg-A) beg-B))
-             (setcar (nthcdr 6 e) (+ end-e (- beg-A beg-B)))
-             (when (= end-e end-B)
-               (setcar (nthcdr 6 e)
-                       (+ beg-A size-B (- end-A end-A-no-blank))))))
-          ((< pos beg-B)
-           (let ((end-e (nth 6 e)))
-             (setcar e (+ pos (- size-B size-A)))
-             (setcar (nthcdr 6 e) (+ end-e (- size-B size-A))))))))
-      (setq struct (sort struct #'car-less-than-car))
-      ;; Restore visibility status, by moving overlays to their new
-      ;; position.
-      (dolist (ov (car overlays))
-       (move-overlay
-        (car ov)
-        (+ (nth 1 ov) (- (+ beg-B (- size-B size-A)) beg-A))
-        (+ (nth 2 ov) (- (+ beg-B (- size-B size-A)) beg-A))))
-      (dolist (ov (cdr overlays))
-       (move-overlay (car ov)
-                     (+ (nth 1 ov) (- beg-A beg-B))
-                     (+ (nth 2 ov) (- beg-A beg-B))))
-      ;; Return structure.
-      struct)))
-(defsubst org-list-swap-items (beg-A beg-B struct)
-  "Swap item starting at BEG-A with item starting at BEG-B in STRUCT.
-
-Blank lines at the end of items are left in place.  Item
-visibility is preserved.  Return the new structure after the
-changes.
-
-Assume BEG-A is lesser than BEG-B and that BEG-A and BEG-B belong
-to the same sub-list.
-
-This function modifies STRUCT."
-  (if (eq org-fold-core-style 'text-properties)
-      (org-list-swap-items--text-properties beg-A beg-B struct)
-    (org-list-swap-items--overlays beg-A beg-B struct)))
 
 (defun org-list-separating-blank-lines-number (pos struct prevs)
   "Return number of blank lines that should separate items in list.
diff --git a/lisp/org-macs.el b/lisp/org-macs.el
index 82e1555129..9af783e0df 100644
--- a/lisp/org-macs.el
+++ b/lisp/org-macs.el
@@ -1272,7 +1272,7 @@ the value in cadr."
                         prop s)))
 
 ;; FIXME: move to org-fold?
-(defun org-invisible-p--text-properties (&optional pos folding-only)
+(defun org-invisible-p (&optional pos folding-only)
   "Non-nil if the character after POS is invisible.
 If POS is nil, use `point' instead.  When optional argument
 FOLDING-ONLY is non-nil, only consider invisible parts due to
@@ -1282,25 +1282,6 @@ fontification."
     (cond ((not value) nil)
          (folding-only (org-fold-folded-p (or pos (point))))
          (t value))))
-(defun org-invisible-p--overlays (&optional pos folding-only)
-  "Non-nil if the character after POS is invisible.
-If POS is nil, use `point' instead.  When optional argument
-FOLDING-ONLY is non-nil, only consider invisible parts due to
-folding of a headline, a block or a drawer, i.e., not because of
-fontification."
-  (let ((value (get-char-property (or pos (point)) 'invisible)))
-    (cond ((not value) nil)
-         (folding-only (memq value '(org-hide-block outline)))
-         (t (and (invisible-p (or pos (point))) value)))))
-(defsubst org-invisible-p (&optional pos folding-only)
-  "Non-nil if the character after POS is invisible.
-If POS is nil, use `point' instead.  When optional argument
-FOLDING-ONLY is non-nil, only consider invisible parts due to
-folding of a headline, a block or a drawer, i.e., not because of
-fontification."
-  (if (eq org-fold-core-style 'text-properties)
-      (org-invisible-p--text-properties pos folding-only)
-    (org-invisible-p--overlays pos folding-only)))
 
 (defun org-truly-invisible-p ()
   "Check if point is at a character currently not visible.
@@ -1324,37 +1305,17 @@ move it back by one char before doing this check."
    (and (org-invisible-p beg)
         (org-invisible-p (org-fold-next-visibility-change beg end)))))
 
-(defun org-find-visible--overlays ()
-  "Return closest visible buffer position, or `point-max'."
-  (if (org-invisible-p)
-      (next-single-char-property-change (point) 'invisible)
-    (point)))
-(defun org-find-visible--text-properties ()
+(defun org-find-visible ()
   "Return closest visible buffer position, or `point-max'."
   (if (org-invisible-p)
       (org-fold-next-visibility-change (point))
     (point)))
-(defsubst org-find-visible ()
-  "Return closest visible buffer position, or `point-max'."
-  (if (eq org-fold-core-style 'text-properties)
-      (org-find-visible--text-properties)
-    (org-find-visible--overlays)))
 
-(defun org-find-invisible--overlays ()
-  "Return closest invisible buffer position, or `point-max'."
-  (if (org-invisible-p)
-      (point)
-    (next-single-char-property-change (point) 'invisible)))
-(defun org-find-invisible--text-properties ()
+(defun org-find-invisible ()
   "Return closest invisible buffer position, or `point-max'."
   (if (org-invisible-p)
       (point)
     (org-fold-next-visibility-change (point))))
-(defsubst org-find-invisible ()
-  "Return closest invisible buffer position, or `point-max'."
-  (if (eq org-fold-core-style 'text-properties)
-      (org-find-invisible--text-properties)
-    (org-find-invisible--overlays)))
 
 
 ;;; Time
diff --git a/lisp/org.el b/lisp/org.el
index 4eef56f455..d1a3a8540b 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -20357,33 +20357,7 @@ Stop at the first and last subheadings of a superior 
heading."
   (interactive "p")
   (org-forward-heading-same-level (if arg (- arg) -1) invisible-ok))
 
-(defun org-next-visible-heading--overlays (arg)
-  "Move to the next visible heading line.
-With ARG, repeats or can move backward if negative."
-  (interactive "p")
-  (let ((regexp (concat "^" (org-get-limited-outline-regexp))))
-    (if (< arg 0)
-       (beginning-of-line)
-      (end-of-line))
-    (while (and (< arg 0) (re-search-backward regexp nil :move))
-      (unless (bobp)
-       (while (pcase (get-char-property-and-overlay (point) 'invisible)
-                (`(outline . ,o)
-                 (goto-char (overlay-start o))
-                 (re-search-backward regexp nil :move))
-                (_ nil))))
-      (cl-incf arg))
-    (while (and (> arg 0) (re-search-forward regexp nil t))
-      (while (pcase (get-char-property-and-overlay (point) 'invisible)
-              (`(outline . ,o)
-               (goto-char (overlay-end o))
-               (re-search-forward regexp nil :move))
-              (_
-               (end-of-line)
-               nil)))                  ;leave the loop
-      (cl-decf arg))
-    (if (> arg 0) (goto-char (point-max)) (beginning-of-line))))
-(defun org-next-visible-heading--text-properties (arg)
+(defun org-next-visible-heading (arg)
   "Move to the next visible heading line.
 With ARG, repeats or can move backward if negative."
   (interactive "p")
@@ -20405,13 +20379,6 @@ With ARG, repeats or can move backward if negative."
        (end-of-line))
       (cl-decf arg))
     (if (> arg 0) (goto-char (point-max)) (beginning-of-line))))
-(defun org-next-visible-heading (arg)
-  "Move to the next visible heading line.
-With ARG, repeats or can move backward if negative."
-  (interactive "p")
-  (if (eq org-fold-core-style 'text-properties)
-      (org-next-visible-heading--text-properties arg)
-    (org-next-visible-heading--overlays arg)))
 
 (defun org-previous-visible-heading (arg)
   "Move to the previous visible heading.
@@ -20547,79 +20514,7 @@ Function may return a real element, or a 
pseudo-element with type
        (list :begin b :end e :parent p :post-blank 0 :post-affiliated b)))
       (_ e))))
 
-(defun org--forward-paragraph-once--overlays ()
-  "Move forward to end of paragraph or equivalent, once.
-See `org-forward-paragraph'."
-  (interactive)
-  (save-restriction
-    (widen)
-    (skip-chars-forward " \t\n")
-    (cond
-     ((eobp) nil)
-     ;; When inside a folded part, move out of it.
-     ((pcase (get-char-property-and-overlay (point) 'invisible)
-       (`(,(or `outline `org-hide-block) . ,o)
-        (goto-char (overlay-end o))
-        (forward-line)
-        t)
-       (_ nil)))
-     (t
-      (let* ((element (org--paragraph-at-point))
-            (type (org-element-type element))
-            (contents-begin (org-element-property :contents-begin element))
-            (end (org-element-property :end element))
-            (post-affiliated (org-element-property :post-affiliated element)))
-       (cond
-        ((eq type 'plain-list)
-         (forward-char)
-         (org--forward-paragraph-once))
-        ;; If the element is folded, skip it altogether.
-        ((pcase (org-with-point-at post-affiliated
-                  (get-char-property-and-overlay (line-end-position)
-                                                 'invisible))
-           (`(,(or `outline `org-hide-block) . ,o)
-            (goto-char (overlay-end o))
-            (forward-line)
-            t)
-           (_ nil)))
-        ;; At a greater element, move inside.
-        ((and contents-begin
-              (> contents-begin (point))
-              (not (eq type 'paragraph)))
-         (goto-char contents-begin)
-         ;; Items and footnote definitions contents may not start at
-         ;; the beginning of the line.  In this case, skip until the
-         ;; next paragraph.
-         (cond
-          ((not (bolp)) (org--forward-paragraph-once))
-          ((org-previous-line-empty-p) (forward-line -1))
-          (t nil)))
-        ;; Move between empty lines in some blocks.
-        ((memq type '(comment-block example-block export-block src-block
-                                    verse-block))
-         (let ((contents-start
-                (org-with-point-at post-affiliated
-                  (line-beginning-position 2))))
-           (if (< (point) contents-start)
-               (goto-char contents-start)
-             (let ((contents-end
-                    (org-with-point-at end
-                      (skip-chars-backward " \t\n")
-                      (line-beginning-position))))
-               (cond
-                ((>= (point) contents-end)
-                 (goto-char end)
-                 (skip-chars-backward " \t\n")
-                 (forward-line))
-                ((re-search-forward "^[ \t]*\n" contents-end :move)
-                 (forward-line -1))
-                (t nil))))))
-        (t
-         ;; Move to element's end.
-         (goto-char end)
-         (skip-chars-backward " \t\n")
-         (forward-line))))))))
-(defun org--forward-paragraph-once--text-properties ()
+(defun org--forward-paragraph-once ()
   "Move forward to end of paragraph or equivalent, once.
 See `org-forward-paragraph'."
   (interactive)
@@ -20688,117 +20583,8 @@ See `org-forward-paragraph'."
          (goto-char end)
          (skip-chars-backward " \t\n")
          (forward-line))))))))
-(defun org--forward-paragraph-once ()
-  "Move forward to end of paragraph or equivalent, once.
-See `org-forward-paragraph'."
-  (interactive)
-  (if (eq org-fold-core-style 'text-properties)
-      (org--forward-paragraph-once--text-properties)
-    (org--forward-paragraph-once--overlays)))
 
-(defun org--backward-paragraph-once--overlays ()
-  "Move backward to start of paragraph or equivalent, once.
-See `org-backward-paragraph'."
-  (interactive)
-  (save-restriction
-    (widen)
-    (cond
-     ((bobp) nil)
-     ;; Blank lines at the beginning of the buffer.
-     ((and (org-match-line "^[ \t]*$")
-          (save-excursion (skip-chars-backward " \t\n") (bobp)))
-      (goto-char (point-min)))
-     ;; When inside a folded part, move out of it.
-     ((pcase (get-char-property-and-overlay (1- (point)) 'invisible)
-       (`(,(or `outline `org-hide-block) . ,o)
-        (goto-char (1- (overlay-start o)))
-        (org--backward-paragraph-once)
-        t)
-       (_ nil)))
-     (t
-      (let* ((element (org--paragraph-at-point))
-            (type (org-element-type element))
-            (begin (org-element-property :begin element))
-            (post-affiliated (org-element-property :post-affiliated element))
-            (contents-end (org-element-property :contents-end element))
-            (end (org-element-property :end element))
-            (parent (org-element-property :parent element))
-            (reach
-             ;; Move to the visible empty line above position P, or
-             ;; to position P.  Return t.
-             (lambda (p)
-               (goto-char p)
-               (when (and (org-previous-line-empty-p)
-                          (let ((end (line-end-position 0)))
-                            (or (= end (point-min))
-                                (not (org-invisible-p (1- end))))))
-                 (forward-line -1))
-               t)))
-       (cond
-        ;; Already at the beginning of an element.
-        ((= begin (point))
-         (cond
-          ;; There is a blank line above.  Move there.
-          ((and (org-previous-line-empty-p)
-                 (let ((lep (line-end-position 0)))
-                   ;; When the first headline start at point 2, don't choke 
while
-                   ;; checking with `org-invisible-p'.
-                   (or (= lep 1)
-                      (not (org-invisible-p (1- (line-end-position 0)))))))
-           (forward-line -1))
-          ;; At the beginning of the first element within a greater
-          ;; element.  Move to the beginning of the greater element.
-          ((and parent
-                 (not (eq 'section (org-element-type parent)))
-                 (= begin (org-element-property :contents-begin parent)))
-           (funcall reach (org-element-property :begin parent)))
-          ;; Since we have to move anyway, find the beginning
-          ;; position of the element above.
-          (t
-           (forward-char -1)
-           (org--backward-paragraph-once))))
-        ;; Skip paragraphs at the very beginning of footnote
-        ;; definitions or items.
-        ((and (eq type 'paragraph)
-              (org-with-point-at begin (not (bolp))))
-         (funcall reach (progn (goto-char begin) (line-beginning-position))))
-        ;; If the element is folded, skip it altogether.
-        ((org-with-point-at post-affiliated
-           (org-invisible-p (line-end-position) t))
-         (funcall reach begin))
-        ;; At the end of a greater element, move inside.
-        ((and contents-end
-              (<= contents-end (point))
-              (not (eq type 'paragraph)))
-         (cond
-          ((memq type '(footnote-definition plain-list))
-           (skip-chars-backward " \t\n")
-           (org--backward-paragraph-once))
-          ((= contents-end (point))
-           (forward-char -1)
-           (org--backward-paragraph-once))
-          (t
-           (goto-char contents-end))))
-        ;; Move between empty lines in some blocks.
-        ((and (memq type '(comment-block example-block export-block src-block
-                                         verse-block))
-              (let ((contents-start
-                     (org-with-point-at post-affiliated
-                       (line-beginning-position 2))))
-                (when (> (point) contents-start)
-                  (let ((contents-end
-                         (org-with-point-at end
-                           (skip-chars-backward " \t\n")
-                           (line-beginning-position))))
-                    (if (> (point) contents-end)
-                        (progn (goto-char contents-end) t)
-                      (skip-chars-backward " \t\n" begin)
-                      (re-search-backward "^[ \t]*\n" contents-start :move)
-                      t))))))
-        ;; Move to element's start.
-        (t
-         (funcall reach begin))))))))
-(defun org--backward-paragraph-once--text-properties ()
+(defun org--backward-paragraph-once ()
   "Move backward to start of paragraph or equivalent, once.
 See `org-backward-paragraph'."
   (interactive)
@@ -20893,13 +20679,6 @@ See `org-backward-paragraph'."
         ;; Move to element's start.
         (t
          (funcall reach begin))))))))
-(defun org--backward-paragraph-once ()
-  "Move backward to start of paragraph or equivalent, once.
-See `org-backward-paragraph'."
-  (interactive)
-  (if (eq org-fold-core-style 'text-properties)
-      (org--backward-paragraph-once--text-properties)
-    (org--backward-paragraph-once--overlays)))
 
 (defun org-forward-element ()
   "Move forward by one element.
diff --git a/testing/lisp/test-org-list.el b/testing/lisp/test-org-list.el
index cab2937126..ab6bc54523 100644
--- a/testing/lisp/test-org-list.el
+++ b/testing/lisp/test-org-list.el
@@ -682,10 +682,10 @@ b. Item 2<point>"
        (search-backward "- item 1")
        (org-move-item-down)
        (forward-line)
-       (list (org-invisible-p2)
+       (list (org-fold-get-folding-spec)
             (progn
               (search-backward " body 2")
-              (org-invisible-p2)))))))
+              (org-fold-get-folding-spec)))))))
   ;; Preserve children visibility.
   (org-test-with-temp-text "* Headline
 - item 1
diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el
index cc9aba3a1a..b14cbeb262 100644
--- a/testing/lisp/test-org.el
+++ b/testing/lisp/test-org.el
@@ -4655,7 +4655,7 @@ Text.
                      (push region regions))))
                regions)))))
   (should
-   (equal '((63 . 82) (26 . 48))
+   (equal '((26 . 48) (63 . 82))
           (let ((org-fold-core-style 'overlays))
            (org-test-with-temp-text
              "
@@ -4747,7 +4747,7 @@ Text.
      (org-drag-element-forward)
      (should
       (equal
-       '((63 . 82) (26 . 48))
+       '((26 . 48) (63 . 82))
        (mapcar (lambda (ov) (cons (overlay-start ov) (overlay-end ov)))
               (overlays-in (point-min) (point-max))))))))
 



reply via email to

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