changeset 65147:c5c1bf7f3c59

(outline-promote): Try shortening the heading. As last resort, read the heading to use. (outline-demote): As last resort, read the heading to use.
author Richard M. Stallman <rms@gnu.org>
date Fri, 26 Aug 2005 11:52:08 +0000
parents b69416140806
children 489d81584dd7
files lisp/outline.el
diffstat 1 files changed, 30 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/outline.el	Fri Aug 26 11:25:56 2005 +0000
+++ b/lisp/outline.el	Fri Aug 26 11:52:08 2005 +0000
@@ -471,13 +471,28 @@
 			(save-excursion (outline-get-next-sibling) (point))))
    (t
     (outline-back-to-heading t)
-    (let* ((head (match-string 0))
+    (let* ((head (match-string-no-properties 0))
 	   (level (save-match-data (funcall outline-level)))
 	   (up-head (or (outline-head-from-level (1- level) head)
+			;; Use the parent heading, if it is really
+			;; one level less.
 			(save-excursion
 			  (save-match-data
 			    (outline-up-heading 1 t)
-			    (match-string 0))))))
+			    (and (= (1- level) (funcall outline-level))
+				 (match-string-no-properties 0))))
+			;; Bummer!! There is no lower level heading.
+			;; Let's try to invent one by deleting the last char.
+			(save-match-data
+			  (let ((new-head (substring head 0 -1)))
+			    (if (string-match (concat "\\`\\(?:" outline-regexp "\\)")
+					      new-head)
+				;; Why bother checking that it is indeed lower level ?
+				new-head
+			      ;; Didn't work, so ask what to do.
+			      (read-string (format "Parent heading for `%s': "
+						   head)
+					   head nil nil t)))))))
 
       (unless (rassoc level outline-heading-alist)
 	(push (cons head level) outline-heading-alist))
@@ -501,7 +516,7 @@
 			(point)
 			(save-excursion (outline-get-next-sibling) (point))))
    (t
-    (let* ((head (match-string 0))
+    (let* ((head (match-string-no-properties 0))
 	   (level (save-match-data (funcall outline-level)))
 	   (down-head
 	    (or (outline-head-from-level (1+ level) head)
@@ -516,21 +531,23 @@
 				  (<= (funcall outline-level) level))))
 		    (unless (eobp)
 		      (looking-at outline-regexp)
-		      (match-string 0))))
+		      (match-string-no-properties 0))))
 		(save-match-data
-		  ;; Bummer!! There is no lower heading in the buffer.
-		  ;; Let's try to invent one by repeating the first char.
-		  (let ((new-head (concat (substring head 0 1) head)))
+		  ;; Bummer!! There is no higher-level heading in the buffer.
+		  ;; Let's try to invent one by repeating the last char.
+		  (let ((new-head (concat head (substring head -1))))
 		    (if (string-match (concat "\\`\\(?:" outline-regexp "\\)")
 				      new-head)
-			;; Why bother checking that it is indeed lower level ?
+			;; Why bother checking that it is indeed higher level ?
 			new-head
-		      ;; Didn't work: keep it as is so it's still a heading.
-		      head))))))
+		      ;; Didn't work, so ask what to do.
+		      (read-string (format "Demoted heading for `%s': "
+					   head)
+				   head nil nil t)))))))
 
-    (unless (rassoc level outline-heading-alist)
-      (push (cons head level) outline-heading-alist))
-    (replace-match down-head nil t)))))
+      (unless (rassoc level outline-heading-alist)
+	(push (cons head level) outline-heading-alist))
+      (replace-match down-head nil t)))))
 
 (defun outline-head-from-level (level head &optional alist)
   "Get new heading with level LEVEL from ALIST.