|
@@ -24590,29 +24590,34 @@ Move to the previous element at the same level, when possible."
|
|
|
(defun org-drag-element-backward ()
|
|
|
"Move backward element at point."
|
|
|
(interactive)
|
|
|
- (if (org-with-limited-levels (org-at-heading-p)) (org-move-subtree-up)
|
|
|
- (let* ((elem (or (org-element-at-point)
|
|
|
- (user-error "No element at point")))
|
|
|
- (prev-elem
|
|
|
- (save-excursion
|
|
|
- (goto-char (org-element-property :begin elem))
|
|
|
- (skip-chars-backward " \r\t\n")
|
|
|
- (unless (bobp)
|
|
|
- (let* ((beg (org-element-property :begin elem))
|
|
|
- (prev (org-element-at-point))
|
|
|
- (up prev))
|
|
|
- (while (and (setq up (org-element-property :parent up))
|
|
|
- (<= (org-element-property :end up) beg))
|
|
|
- (setq prev up))
|
|
|
- prev)))))
|
|
|
- ;; Error out if no previous element or previous element is
|
|
|
- ;; a parent of the current one.
|
|
|
- (if (or (not prev-elem) (org-element-nested-p elem prev-elem))
|
|
|
- (user-error "Cannot drag element backward")
|
|
|
- (let ((pos (point)))
|
|
|
- (org-element-swap-A-B prev-elem elem)
|
|
|
- (goto-char (+ (org-element-property :begin prev-elem)
|
|
|
- (- pos (org-element-property :begin elem)))))))))
|
|
|
+ (let ((elem (or (org-element-at-point)
|
|
|
+ (user-error "No element at point"))))
|
|
|
+ (if (eq (org-element-type elem) 'headline)
|
|
|
+ ;; Preserve point when moving a whole tree, even if point was
|
|
|
+ ;; on blank lines below the headline.
|
|
|
+ (let ((offset (skip-chars-backward " \t\n")))
|
|
|
+ (unwind-protect (org-move-subtree-up)
|
|
|
+ (forward-char (- offset))))
|
|
|
+ (let ((prev-elem
|
|
|
+ (save-excursion
|
|
|
+ (goto-char (org-element-property :begin elem))
|
|
|
+ (skip-chars-backward " \r\t\n")
|
|
|
+ (unless (bobp)
|
|
|
+ (let* ((beg (org-element-property :begin elem))
|
|
|
+ (prev (org-element-at-point))
|
|
|
+ (up prev))
|
|
|
+ (while (and (setq up (org-element-property :parent up))
|
|
|
+ (<= (org-element-property :end up) beg))
|
|
|
+ (setq prev up))
|
|
|
+ prev)))))
|
|
|
+ ;; Error out if no previous element or previous element is
|
|
|
+ ;; a parent of the current one.
|
|
|
+ (if (or (not prev-elem) (org-element-nested-p elem prev-elem))
|
|
|
+ (user-error "Cannot drag element backward")
|
|
|
+ (let ((pos (point)))
|
|
|
+ (org-element-swap-A-B prev-elem elem)
|
|
|
+ (goto-char (+ (org-element-property :begin prev-elem)
|
|
|
+ (- pos (org-element-property :begin elem))))))))))
|
|
|
|
|
|
(defun org-drag-element-forward ()
|
|
|
"Move forward element at point."
|