branch: externals/org
commit 303aa80220872aa2d812a81b1919610e3f8a9167
Author: Stefan Monnier <monn...@iro.umontreal.ca>
Commit: Kyle Meyer <k...@kyleam.com>

    Backport commit 6bcf41c31 from Emacs
    
    * lisp/org-compat.el (org-replace-buffer-contents): Delete function.
    (org-replace-region-contents): New function.
    * lisp/org-src.el (org-edit-src-save, org-edit-src-exit): Use it.
    
    Org: Use new `replace-region-contents`
    6bcf41c311b220e84f4eb423700f36ac1ddfffa7
    Stefan Monnier
    Sat Mar 29 17:49:49 2025 -0400
    
    [ km: This commit is applied here for bookkeeping/traceability
      purposes.  It introduces a regression for the issue fixed by
      2d9e70b80 and will be reverted when merged to main.  See
      <https://list.orgmode.org/87plgqi0y3.fsf@localhost>.]
---
 lisp/org-compat.el | 18 ++++++++++++++----
 lisp/org-src.el    | 21 ++++++---------------
 2 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/lisp/org-compat.el b/lisp/org-compat.el
index 59d34b661c..297e8f0604 100644
--- a/lisp/org-compat.el
+++ b/lisp/org-compat.el
@@ -292,10 +292,20 @@ older than 27.1"
       (if tree (push tree elems))
       (nreverse elems))))
 
-(if (version< emacs-version "27.1")
-    (defsubst org-replace-buffer-contents (source &optional _max-secs 
_max-costs)
-      (replace-buffer-contents source))
-  (defalias 'org-replace-buffer-contents #'replace-buffer-contents))
+(defalias 'org-replace-region-contents
+  (if (> emacs-major-version 30)
+      #'replace-region-contents
+    ;; The `replace-region-contents' in Emacs<31 does not accept a buffer
+    ;; as SOURCE argument and does not preserve the position well enough.
+    (lambda (beg end source &optional max-secs max-costs)
+      (save-restriction
+        (narrow-to-region beg end)
+        (let ((eobp (eobp)))
+          (with-no-warnings
+            (if (< emacs-major-version 27)
+                (replace-buffer-contents source)
+              (replace-buffer-contents source max-secs max-costs)))
+          (if eobp (goto-char (point-max))))))))
 
 (unless (fboundp 'proper-list-p)
   ;; `proper-list-p' was added in Emacs 27.1.  The function below is
diff --git a/lisp/org-src.el b/lisp/org-src.el
index 302c27ac86..d8a928b1f9 100644
--- a/lisp/org-src.el
+++ b/lisp/org-src.el
@@ -1414,13 +1414,9 @@ EVENT is passed to `mouse-set-point'."
       ;; insert new contents.
       (delete-overlay overlay)
       (let ((expecting-bol (bolp)))
-       (if (version< emacs-version "27.1")
-           (progn (delete-region beg end)
-                  (insert (with-current-buffer write-back-buf 
(buffer-string))))
-         (save-restriction
-           (narrow-to-region beg end)
-           (org-replace-buffer-contents write-back-buf 0.1 nil)
-           (goto-char (point-max))))
+        (goto-char end)
+        (org-replace-region-contents beg end write-back-buf 0.1 nil)
+        (cl-assert (= (point) (+ beg (buffer-size write-back-buf))))
        (when (and expecting-bol (not (bolp))) (insert "\n")))
       (kill-buffer write-back-buf)
       (save-buffer)
@@ -1461,14 +1457,9 @@ EVENT is passed to `mouse-set-point'."
        (undo-boundary)
        (goto-char beg)
        (let ((expecting-bol (bolp)))
-        (if (version< emacs-version "27.1")
-            (progn (delete-region beg end)
-                   (insert (with-current-buffer write-back-buf
-                              (buffer-string))))
-          (save-restriction
-            (narrow-to-region beg end)
-            (org-replace-buffer-contents write-back-buf 0.1 nil)
-            (goto-char (point-max))))
+         (goto-char end)
+         (org-replace-region-contents beg end write-back-buf 0.1 nil)
+         (cl-assert (= (point) (+ beg (buffer-size write-back-buf))))
         (when (and expecting-bol (not (bolp))) (insert "\n")))))
     (when write-back-buf (kill-buffer write-back-buf))
     ;; If we are to return to source buffer, put point at an

Reply via email to