forked from mirrors/org-mode
org-element: Preserve visibility when moving elements
* contrib/lisp/org-element.el (org-element-swap-A-B): Preserve visibility when moving elements. * testing/lisp/test-org-element.el: Add tests.
This commit is contained in:
parent
d71464c0d3
commit
5750f0869c
|
@ -3938,6 +3938,16 @@ end of ELEM-A."
|
||||||
(goto-char (org-element-property :end elem-B))
|
(goto-char (org-element-property :end elem-B))
|
||||||
(skip-chars-backward " \r\t\n")
|
(skip-chars-backward " \r\t\n")
|
||||||
(point-at-eol)))
|
(point-at-eol)))
|
||||||
|
;; Store overlays responsible for visibility status. We
|
||||||
|
;; also need to store their boundaries as they will be
|
||||||
|
;; removed from buffer.
|
||||||
|
(overlays
|
||||||
|
(cons
|
||||||
|
(mapcar (lambda (ov) (list ov (overlay-start ov) (overlay-end ov)))
|
||||||
|
(overlays-in beg-A end-A))
|
||||||
|
(mapcar (lambda (ov) (list ov (overlay-start ov) (overlay-end ov)))
|
||||||
|
(overlays-in beg-B end-B))))
|
||||||
|
;; Get contents.
|
||||||
(body-A (buffer-substring beg-A end-A))
|
(body-A (buffer-substring beg-A end-A))
|
||||||
(body-B (delete-and-extract-region beg-B end-B)))
|
(body-B (delete-and-extract-region beg-B end-B)))
|
||||||
(goto-char beg-B)
|
(goto-char beg-B)
|
||||||
|
@ -3945,9 +3955,22 @@ end of ELEM-A."
|
||||||
(setq body-B (replace-regexp-in-string "\\`[ \t]*" "" body-B))
|
(setq body-B (replace-regexp-in-string "\\`[ \t]*" "" body-B))
|
||||||
(org-indent-to-column ind-B))
|
(org-indent-to-column ind-B))
|
||||||
(insert body-A)
|
(insert body-A)
|
||||||
|
;; Restore ex ELEM-A overlays.
|
||||||
|
(mapc (lambda (ov)
|
||||||
|
(move-overlay
|
||||||
|
(car ov)
|
||||||
|
(+ (nth 1 ov) (- beg-B beg-A))
|
||||||
|
(+ (nth 2 ov) (- beg-B beg-A))))
|
||||||
|
(car overlays))
|
||||||
(goto-char beg-A)
|
(goto-char beg-A)
|
||||||
(delete-region beg-A end-A)
|
(delete-region beg-A end-A)
|
||||||
(insert body-B)
|
(insert body-B)
|
||||||
|
;; Restore ex ELEM-B overlays.
|
||||||
|
(mapc (lambda (ov)
|
||||||
|
(move-overlay (car ov)
|
||||||
|
(+ (nth 1 ov) (- beg-A beg-B))
|
||||||
|
(+ (nth 2 ov) (- beg-A beg-B))))
|
||||||
|
(cdr overlays))
|
||||||
(goto-char (org-element-property :end elem-B)))))
|
(goto-char (org-element-property :end elem-B)))))
|
||||||
|
|
||||||
(defun org-element-forward ()
|
(defun org-element-forward ()
|
||||||
|
|
|
@ -2292,7 +2292,24 @@ Outside."
|
||||||
(search-forward "graph")
|
(search-forward "graph")
|
||||||
(org-element-drag-backward)
|
(org-element-drag-backward)
|
||||||
(should (equal (buffer-string) "Paragraph 2\n\n\nPara1\n\nPara3"))
|
(should (equal (buffer-string) "Paragraph 2\n\n\nPara1\n\nPara3"))
|
||||||
(should (looking-at " 2"))))
|
(should (looking-at " 2")))
|
||||||
|
;; 5. Preserve visibility of elements and their contents.
|
||||||
|
(org-test-with-temp-text "
|
||||||
|
#+BEGIN_CENTER
|
||||||
|
Text.
|
||||||
|
#+END_CENTER
|
||||||
|
- item 1
|
||||||
|
#+BEGIN_QUOTE
|
||||||
|
Text.
|
||||||
|
#+END_QUOTE"
|
||||||
|
(while (search-forward "BEGIN_" nil t) (org-cycle))
|
||||||
|
(search-backward "- item 1")
|
||||||
|
(org-element-drag-backward)
|
||||||
|
(should
|
||||||
|
(equal
|
||||||
|
'((63 . 82) (26 . 48))
|
||||||
|
(mapcar (lambda (ov) (cons (overlay-start ov) (overlay-end ov)))
|
||||||
|
(overlays-in (point-min) (point-max)))))))
|
||||||
|
|
||||||
(ert-deftest test-org-element/drag-forward ()
|
(ert-deftest test-org-element/drag-forward ()
|
||||||
"Test `org-element-drag-forward' specifications."
|
"Test `org-element-drag-forward' specifications."
|
||||||
|
@ -2314,7 +2331,24 @@ Outside."
|
||||||
(search-forward "graph")
|
(search-forward "graph")
|
||||||
(org-element-drag-forward)
|
(org-element-drag-forward)
|
||||||
(should (equal (buffer-string) "Para2\n\n\nParagraph 1\n\nPara3"))
|
(should (equal (buffer-string) "Para2\n\n\nParagraph 1\n\nPara3"))
|
||||||
(should (looking-at " 1"))))
|
(should (looking-at " 1")))
|
||||||
|
;; 5. Preserve visibility of elements and their contents.
|
||||||
|
(org-test-with-temp-text "
|
||||||
|
#+BEGIN_CENTER
|
||||||
|
Text.
|
||||||
|
#+END_CENTER
|
||||||
|
- item 1
|
||||||
|
#+BEGIN_QUOTE
|
||||||
|
Text.
|
||||||
|
#+END_QUOTE"
|
||||||
|
(while (search-forward "BEGIN_" nil t) (org-cycle))
|
||||||
|
(search-backward "#+BEGIN_CENTER")
|
||||||
|
(org-element-drag-forward)
|
||||||
|
(should
|
||||||
|
(equal
|
||||||
|
'((63 . 82) (26 . 48))
|
||||||
|
(mapcar (lambda (ov) (cons (overlay-start ov) (overlay-end ov)))
|
||||||
|
(overlays-in (point-min) (point-max)))))))
|
||||||
|
|
||||||
(ert-deftest test-org-element/fill-paragraph ()
|
(ert-deftest test-org-element/fill-paragraph ()
|
||||||
"Test `org-element-fill-paragraph' specifications."
|
"Test `org-element-fill-paragraph' specifications."
|
||||||
|
|
Loading…
Reference in a new issue