changeset 40530:a0dc24114eee

(reindent-then-newline-and-indent): Insert the newline before indenting the first line. (undo-get-state, undo-revert-to-state): New funs. (shell-command): Don't kill the buffer even if empty. (transpose-subr-start1, transpose-subr-start2, transpose-subr-end1) (transpose-subr-end2): Remove. (transpose-subr): Add `special' arg and simplify. (transpose-subr-1): Rewrite. (do-auto-fill): Use fill-indent-according-to-mode and fill-nobreak-p. (rfc822-goto-eoh): Simplify.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Wed, 31 Oct 2001 00:57:04 +0000
parents ab6d4e4dd152
children 8f420a5cd591
files lisp/simple.el
diffstat 1 files changed, 113 insertions(+), 113 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/simple.el	Tue Oct 30 22:26:40 2001 +0000
+++ b/lisp/simple.el	Wed Oct 31 00:57:04 2001 +0000
@@ -263,11 +263,15 @@
 In some text modes, where TAB inserts a tab, this indents to the
 column specified by the function `current-left-margin'."
   (interactive "*")
-  (save-excursion
-    (delete-horizontal-space t)
-    (indent-according-to-mode))
-  (newline)
-  (indent-according-to-mode))
+  (delete-horizontal-space t)
+  (let ((pos (point)))
+    ;; Be careful to insert the newline before indenting the line.
+    ;; Otherwise, the indentation might be wrong.
+    (newline)
+    (save-excursion
+      (goto-char pos)
+      (indent-according-to-mode))
+    (indent-according-to-mode)))
 
 (defun quoted-insert (arg)
   "Read next input character and insert it.
@@ -771,8 +775,8 @@
       (delete-minibuffer-contents)
       (insert match-string)
       (goto-char (+ (minibuffer-prompt-end) match-offset))))
-  (if (or (eq (car (car command-history)) 'previous-matching-history-element)
-	  (eq (car (car command-history)) 'next-matching-history-element))
+  (if (memq (car (car command-history)) '(previous-matching-history-element
+					  next-matching-history-element))
       (setq command-history (cdr command-history))))
 
 (defun next-matching-history-element (regexp n)
@@ -817,8 +821,8 @@
 	      (error "End of history; no default available")))
 	(if (> narg (length (symbol-value minibuffer-history-variable)))
 	    (error "Beginning of history; no preceding item"))
-	(unless (or (eq last-command 'next-history-element)
-		    (eq last-command 'previous-history-element))
+	(unless (memq last-command '(next-history-element
+				     previous-history-element))
 	  (let ((prompt-end (minibuffer-prompt-end)))
 	    (set (make-local-variable 'minibuffer-temporary-goal-position)
 		 (cond ((<= (point) prompt-end) prompt-end)
@@ -1012,11 +1016,12 @@
 	      (let ((position (car delta))
 		    (offset (cdr delta)))
 
-		;; Loop down the earlier events adjusting their buffer positions
-		;; to reflect the fact that a change to the buffer isn't being
-		;; undone. We only need to process those element types which
-		;; undo-elt-in-region will return as being in the region since
-		;; only those types can ever get into the output
+		;; Loop down the earlier events adjusting their buffer
+		;; positions to reflect the fact that a change to the buffer
+		;; isn't being undone. We only need to process those element
+		;; types which undo-elt-in-region will return as being in
+		;; the region since only those types can ever get into the
+		;; output
 
 		(while temp-undo-list
 		  (setq undo-elt (car temp-undo-list))
@@ -1112,6 +1117,34 @@
 	     '(0 . 0)))
     '(0 . 0)))
 
+(defun undo-get-state ()
+  "Return a handler for the current state to which we might want to undo.
+The returned handler can then be passed to `undo-revert-to-handle'."
+  (unless (eq buffer-undo-list t)
+    buffer-undo-list))
+
+(defun undo-revert-to-state (handle)
+  "Revert to the state HANDLE earlier grabbed with `undo-get-handle'.
+This undoing is not itself undoable (aka redoable)."
+  (unless (eq buffer-undo-list t)
+    (let ((new-undo-list (cons (car handle) (cdr handle))))
+      ;; Truncate the undo log at `handle'.
+      (when handle
+	(setcar handle nil) (setcdr handle nil))
+      (unless (eq last-command 'undo) (undo-start))
+      ;; Make sure there's no confusion.
+      (when (and handle (not (eq handle (last pending-undo-list))))
+	(error "Undoing to some unrelated state"))
+      ;; Undo it all.
+      (while pending-undo-list (undo-more 1))
+      ;; Reset the modified cons cell to its original content.
+      (when handle
+	(setcar handle (car new-undo-list))
+	(setcdr handle (cdr new-undo-list)))
+      ;; Revert the undo info to what it was when we grabbed the state.
+      (setq buffer-undo-list handle))))
+  
+
 (defvar shell-command-history nil
   "History list for some commands that read shell commands.")
 
@@ -1137,9 +1170,7 @@
 display in the echo area (which is determined by the variables
 `resize-mini-windows' and `max-mini-window-height'), it is shown
 there, but it is nonetheless available in buffer `*Shell Command
-Output*' even though that buffer is not automatically displayed.  If
-there is no output, or if output is inserted in the current buffer,
-then `*Shell Command Output*' is deleted.
+Output*' even though that buffer is not automatically displayed.
 
 To specify a coding system for converting non-ASCII characters
 in the shell command output, use \\[universal-coding-system-argument]
@@ -1397,10 +1428,10 @@
 					 (list t error-file)
 				       t)
 				     nil shell-command-switch command))
-;;; It is rude to delete a buffer which the command is not using.
-;;;	  (let ((shell-buffer (get-buffer "*Shell Command Output*")))
-;;;	    (and shell-buffer (not (eq shell-buffer (current-buffer)))
-;;;		 (kill-buffer shell-buffer)))
+	  ;; It is rude to delete a buffer which the command is not using.
+	  ;; (let ((shell-buffer (get-buffer "*Shell Command Output*")))
+	  ;;   (and shell-buffer (not (eq shell-buffer (current-buffer)))
+	  ;; 	 (kill-buffer shell-buffer)))
 	  ;; Don't muck with mark unless REPLACE says we should.
 	  (and replace swap (exchange-point-and-mark)))
       ;; No prefix argument: put the output in a temp buffer,
@@ -1449,7 +1480,10 @@
 			      (< 0 (nth 7 (file-attributes error-file))))
 			 "(Shell command %sed with some error output)"
 		       "(Shell command %sed with no output)")
-		     (if (equal 0 exit-status) "succeed" "fail"))))))
+		     (if (equal 0 exit-status) "succeed" "fail"))
+	    ;; Don't kill: there might be useful info in the undo-log.
+	    ;; (kill-buffer buffer)
+	    ))))
 
     (when (and error-file (file-exists-p error-file))
       (if (< 0 (nth 7 (file-attributes error-file)))
@@ -2685,67 +2719,42 @@
 		       (forward-line arg))))
 		  arg))
 
-(defvar transpose-subr-start1)
-(defvar transpose-subr-start2)
-(defvar transpose-subr-end1)
-(defvar transpose-subr-end2)
-
-(defun transpose-subr (mover arg)
-  (let (transpose-subr-start1
-	transpose-subr-end1
-	transpose-subr-start2
-	transpose-subr-end2)
-    (if (= arg 0)
-	(progn
-	  (save-excursion
-	    (funcall mover 1)
-	    (setq transpose-subr-end2 (point))
-	    (funcall mover -1)
-	    (setq transpose-subr-start2 (point))
-	    (goto-char (mark))
-	    (funcall mover 1)
-	    (setq transpose-subr-end1 (point))
-	    (funcall mover -1)
-	    (setq transpose-subr-start1 (point))
-	    (transpose-subr-1))
-	  (exchange-point-and-mark))
-      (if (> arg 0)
-	  (progn
-	    (funcall mover -1)
-	    (setq transpose-subr-start1 (point))
-	    (funcall mover 1)
-	    (setq transpose-subr-end1 (point))
-	    (funcall mover arg)
-	    (setq transpose-subr-end2 (point))
-	    (funcall mover (- arg))
-	    (setq transpose-subr-start2 (point))
-	    (transpose-subr-1)
-	    (goto-char transpose-subr-end2))
-	(funcall mover -1)
-	(setq transpose-subr-start2 (point))
-	(funcall mover 1)
-	(setq transpose-subr-end2 (point))
-	(funcall mover (1- arg))
-	(setq transpose-subr-start1 (point))
-	(funcall mover (- arg))
-	(setq transpose-subr-end1 (point))
-	(transpose-subr-1)))))
-
-(defun transpose-subr-1 ()
-  (if (> (min transpose-subr-end1 transpose-subr-end2)
-	 (max transpose-subr-start1 transpose-subr-start2))
-      (error "Don't have two things to transpose"))
-  (let* ((word1 (buffer-substring transpose-subr-start1 transpose-subr-end1))
-	 (len1 (length word1))
-	 (word2 (buffer-substring transpose-subr-start2 transpose-subr-end2))
-	 (len2 (length word2)))
-    (delete-region transpose-subr-start2 transpose-subr-end2)
-    (goto-char transpose-subr-start2)
-    (insert word1)
-    (goto-char (if (< transpose-subr-start1 transpose-subr-start2)
-		   transpose-subr-start1
-		 (+ transpose-subr-start1 (- len1 len2))))
-    (delete-region (point) (+ (point) len1))
+(defun transpose-subr (mover arg &optional special)
+  (let ((aux (if special mover
+	       (lambda (x)
+		 (cons (progn (funcall mover x) (point))
+		       (progn (funcall mover (- x)) (point))))))
+	pos1 pos2)
+    (cond
+     ((= arg 0)
+      (save-excursion
+	(setq pos1 (funcall aux 1))
+	(goto-char (mark))
+	(setq pos2 (funcall aux 1))
+	(transpose-subr-1 pos1 pos2))
+      (exchange-point-and-mark))
+     ((> arg 0)
+      (setq pos1 (funcall aux -1))
+      (setq pos2 (funcall aux arg))
+      (transpose-subr-1 pos1 pos2)
+      (goto-char (car pos2)))
+     (t
+      (setq pos1 (funcall aux -1))
+      (goto-char (car pos1))
+      (setq pos2 (funcall aux arg))
+      (transpose-subr-1 pos1 pos2)))))
+
+(defun transpose-subr-1 (pos1 pos2)
+  (when (> (car pos1) (cdr pos1)) (setq pos1 (cons (cdr pos1) (car pos1))))
+  (when (> (car pos2) (cdr pos2)) (setq pos2 (cons (cdr pos2) (car pos2))))
+  (when (> (car pos1) (car pos2))
+    (let ((swap pos1))
+      (setq pos1 pos2 pos2 swap)))
+  (if (> (cdr pos1) (car pos2)) (error "Don't have two things to transpose"))
+  (let ((word2 (delete-and-extract-region (car pos2) (cdr pos2))))
+    (goto-char (car pos2))
+    (insert (delete-and-extract-region (car pos1) (cdr pos1)))
+    (goto-char (car pos1))
     (insert word2)))
 
 (defun backward-word (arg)
@@ -2809,8 +2818,7 @@
 	(buffer-substring-no-properties start end)))))
 
 (defcustom fill-prefix nil
-  "*String for filling to insert at front of new line, or nil for none.
-Setting this variable automatically makes it local to the current buffer."
+  "*String for filling to insert at front of new line, or nil for none."
   :type '(choice (const :tag "None" nil)
 		 string)
   :group 'fill)
@@ -2852,15 +2860,18 @@
 	  (save-excursion (unjustify-current-line)))
 
       ;; Choose a fill-prefix automatically.
-      (if (and adaptive-fill-mode
-	       (or (null fill-prefix) (string= fill-prefix "")))
-	  (let ((prefix
-		 (fill-context-prefix
-		  (save-excursion (backward-paragraph 1) (point))
-		  (save-excursion (forward-paragraph 1) (point)))))
-	    (and prefix (not (equal prefix ""))
-		 (setq fill-prefix prefix))))
-
+      (when (and adaptive-fill-mode
+		 (or (null fill-prefix) (string= fill-prefix "")))
+	(let ((prefix
+	       (fill-context-prefix
+		(save-excursion (backward-paragraph 1) (point))
+		(save-excursion (forward-paragraph 1) (point)))))
+	  (and prefix (not (equal prefix ""))
+	       ;; Use auto-indentation rather than a guessed empty prefix.
+	       (not (and fill-indent-according-to-mode
+			 (string-match "[ \t]*" prefix)))
+	       (setq fill-prefix prefix))))
+      
       (while (and (not give-up) (> (current-column) fc))
 	;; Determine where to split the line.
 	(let* (after-prefix
@@ -2882,20 +2893,9 @@
 		    ;; a character, or \c| following a character.  If
 		    ;; not found, place the point at beginning of line.
 		    (while (or first
-			       ;; If this is after period and a single space,
-			       ;; move back once more--we don't want to break
-			       ;; the line there and make it look like a
-			       ;; sentence end.
 			       (and (not (bobp))
 				    (not bounce)
-				    sentence-end-double-space
-				    (save-excursion (forward-char -1)
-						    (and (looking-at "\\. ")
-							 (not (looking-at "\\.  ")))))
-			       (and (not (bobp))
-				    (not bounce)
-				    fill-nobreak-predicate
-				    (funcall fill-nobreak-predicate)))
+				    (fill-nobreak-p)))
 		      (setq first nil)
 		      (re-search-backward "[ \t]\\|\\c|.\\|.\\c|\\|^")
 		      ;; If we find nowhere on the line to break it,
@@ -2958,8 +2958,8 @@
 		;; Now do justification, if required
 		(if (not (eq justify 'left))
 		    (save-excursion
-		      (end-of-line 0)
-		      (justify-current-line justify nil t)))
+		    (end-of-line 0)
+		    (justify-current-line justify nil t)))
 		;; If making the new line didn't reduce the hpos of
 		;; the end of the line, then give up now;
 		;; trying again will not help.
@@ -3371,9 +3371,9 @@
 (defun rfc822-goto-eoh ()
   ;; Go to header delimiter line in a mail message, following RFC822 rules
   (goto-char (point-min))
-  (while (looking-at "^[^: \n]+:\\|^[ \t]")
-    (forward-line 1))
-  (point))
+  (when (re-search-forward
+	 "^\\([:\n]\\|[^: \t\n]+[ \t\n]\\)" nil 'move)
+    (goto-char (match-beginning 0))))
 
 (defun sendmail-user-agent-compose (&optional to subject other-headers continue
 					      switch-function yank-action
@@ -3832,7 +3832,7 @@
 ;;; bindings.
 
 ;; Also tell read-char how to handle these keys.
-(mapcar
+(mapc
  (lambda (keypad-normal)
    (let ((keypad (nth 0 keypad-normal))
 	 (normal (nth 1 keypad-normal)))
@@ -4137,7 +4137,7 @@
        (stringp byte-compile-current-file)))
 
 
-;;; Minibuffer prompt stuff.
+;; Minibuffer prompt stuff.
 
 ;(defun minibuffer-prompt-modification (start end)
 ;  (error "You cannot modify the prompt"))