diff --git a/lisp/outline.el b/lisp/outline.el index c7cad31..bfed982 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -649,17 +649,27 @@ the match data is set appropriately." 'outline-get-last-sibling)) (ins-point (make-marker)) (cnt (abs arg)) + ;; Make sure we can move forward when needed (bug#19102). + (maybe-forward-char (lambda () + (when (and (eobp) (not (bolp))) + (newline)) + (unless (bolp) + (if (= (char-after) ?\n) + (forward-char 1))))) + (empty-last-line (save-excursion + (goto-char (point-max)) + (and (bolp) (eolp)))) beg end folded) - ;; Select the tree + ;; Select the tree. (outline-back-to-heading) (setq beg (point)) (save-match-data (save-excursion (outline-end-of-heading) (setq folded (outline-invisible-p))) (outline-end-of-subtree)) - (if (= (char-after) ?\n) (forward-char 1)) + (funcall maybe-forward-char) (setq end (point)) - ;; Find insertion point, with error handling + ;; Find insertion point, with error handling. (goto-char beg) (while (> cnt 0) (or (funcall movfunc) @@ -667,14 +677,19 @@ the match data is set appropriately." (error "Cannot move past superior level"))) (setq cnt (1- cnt))) (if (> arg 0) - ;; Moving forward - still need to move over subtree + ;; Moving forward - still need to move over subtree. (progn (outline-end-of-subtree) - (if (= (char-after) ?\n) (forward-char 1)))) + (funcall maybe-forward-char))) (move-marker ins-point (point)) (insert (delete-and-extract-region beg end)) (goto-char ins-point) (if folded (hide-subtree)) - (move-marker ins-point nil))) + (move-marker ins-point nil) + ;; Clean up if necessary. + (save-excursion + (goto-char (point-max)) + (when (and (bolp) (eolp) (not empty-last-line)) + (delete-char -1))))) (defun outline-end-of-heading () (if (re-search-forward outline-heading-end-regexp nil 'move)