changeset 8298:0ff871ea99d4

(ispell-command-loop, ispell-region, ispell-word): Only pop up the choices window if an error is found in the region. Don't change the size of the choices window except as needed. Don't (sit-for 0) at the start of ispell-region (i.e. don't force redisplay at the start of the region). (ispell-overlay-window): Small documentation fix.
author Richard M. Stallman <rms@gnu.org>
date Wed, 20 Jul 1994 18:26:57 +0000
parents 80d4bf018aec
children bc8c9c72e3bf
files lisp/textmodes/ispell.el
diffstat 1 files changed, 219 insertions(+), 237 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/textmodes/ispell.el	Wed Jul 20 14:02:48 1994 +0000
+++ b/lisp/textmodes/ispell.el	Wed Jul 20 18:26:57 1994 +0000
@@ -741,7 +741,6 @@
 	      quietly ispell-quietly))
     (ispell-buffer-local-dict)		; use the correct dictionary
     (let ((cursor-location (point))	; retain cursor location
-	  ispell-keep-choices-win	; override global to force creation
 	  (word (ispell-get-word following))
 	  start end poss replace)
       ;; destructure return word info list.
@@ -778,10 +777,11 @@
 		 (progn
 		   (if ispell-highlight-p ;highlight word
 		       (ispell-highlight-spelling-error start end t))
-		   (setq replace (ispell-command-loop
-				  (car (cdr (cdr poss)))
-				  (car (cdr (cdr (cdr poss))))
-				  (car poss))))
+		   (save-window-excursion
+		     (setq replace (ispell-command-loop
+				    (car (cdr (cdr poss)))
+				    (car (cdr (cdr (cdr poss))))
+				    (car poss)))))
 	       ;; protected
 	       (if ispell-highlight-p	; clear highlight
 		   (ispell-highlight-spelling-error start end)))
@@ -889,214 +889,206 @@
 Global `ispell-pdict-modified-p' becomes a list where the only value
 indicates whether the dictionary has been modified when option `a' or `i' is
 used."
-  (unwind-protect
-      (save-window-excursion
-	(let ((count ?0)
-	      (line 2)
-	      (max-lines (- (window-height) 4)) ; assure 4 context lines.
-	      (choices miss)
-	      (window-min-height (min window-min-height
-				      ispell-choices-win-default-height))
-	      (command-characters '( ?  ?i ?a ?A ?r ?R ?? ?x ?X ?q ?l ?u ?m ))
-	      (skipped 0)
-	      char num result)
-	  (save-excursion
-	    (if ispell-keep-choices-win
+  (let ((count ?0)
+	(line 2)
+	(max-lines (- (window-height) 4)) ; assure 4 context lines.
+	(choices miss)
+	(window-min-height (min window-min-height
+				ispell-choices-win-default-height))
+	(command-characters '( ?  ?i ?a ?A ?r ?R ?? ?x ?X ?q ?l ?u ?m ))
+	(skipped 0)
+	char num result)
+    (save-excursion
+      (set-buffer (get-buffer-create ispell-choices-buffer))
+      (setq mode-line-format "--  %b  --")
+      (erase-buffer)
+      (if guess
+	  (progn
+	    (insert "Affix rules generate and capitalize "
+		    "this word as shown below:\n\t")
+	    (while guess
+	      (if (> (+ 4 (current-column) (length (car guess)))
+		     (window-width))
+		  (progn
+		    (insert "\n\t")
+		    (setq line (1+ line))))
+	      (insert (car guess) "    ")
+	      (setq guess (cdr guess)))
+	    (insert "\nUse option `i' if this is a correct composition"
+		    " from the derivative root.\n")
+	    (setq line (+ line (if choices 3 2)))))
+      (while (and choices
+		  (< (if (> (+ 7 (current-column) (length (car choices))
+			       (if (> count ?~) 3 0))
+			    (window-width))
+			 (progn
+			   (insert "\n")
+			   (setq line (1+ line)))
+		       line)
+		     max-lines))
+	;; not so good if there are over 20 or 30 options, but then, if
+	;; there are that many you don't want to scan them all anyway...
+	(while (memq count command-characters) ; skip command characters.
+	  (setq count (1+ count)
+		skipped (1+ skipped)))
+	(insert "(" count ") " (car choices) "  ")
+	(setq choices (cdr choices)
+	      count (1+ count)))
+      (setq count (- count ?0 skipped)))
+
+    (let ((choices-window (get-buffer-window ispell-choices-buffer)))
+      (if choices-window
+	  (if (not (equal line (window-height choices-window)))
+	      (progn
+		(save-excursion
+		  (let ((cur-point (point)))
+		    (move-to-window-line (- line (window-height choices-window)))
+		    (if (<= (point) cur-point)
+			(set-window-start (selected-window) (point)))))
 		(select-window (previous-window))
-	      (set-buffer (get-buffer-create ispell-choices-buffer))
-	      (setq mode-line-format "--  %b  --"))
-	    (if (equal (get-buffer ispell-choices-buffer) (current-buffer))
-		(erase-buffer)
-	      (error (concat "Bogus, dude! I should be in the *Choices*"
-			     " buffer, but I'm not!")))
-	    (if guess
-		(progn
-		  (insert "Affix rules generate and capitalize "
-			  "this word as shown below:\n\t")
-		  (while guess
-		    (if (> (+ 4 (current-column) (length (car guess)))
-			   (window-width))
-			(progn
-			  (insert "\n\t")
-			  (setq line (1+ line))))
-		    (insert (car guess) "    ")
-		    (setq guess (cdr guess)))
-		  (insert "\nUse option `i' if this is a correct composition"
-			  " from the derivative root.\n")
-		  (setq line (+ line (if choices 3 2)))))
-	    (while (and choices
-			(< (if (> (+ 7 (current-column) (length (car choices))
-				     (if (> count ?~) 3 0))
-				  (window-width))
-			       (progn
-				 (insert "\n")
-				 (setq line (1+ line)))
-			     line)
-			   max-lines))
-	      ;; not so good if there are over 20 or 30 options, but then, if
-	      ;; there are that many you don't want to scan them all anyway...
-	      (while (memq count command-characters) ; skip command characters.
-		(setq count (1+ count)
-		      skipped (1+ skipped)))
-	      (insert "(" count ") " (car choices) "  ")
-	      (setq choices (cdr choices)
-		    count (1+ count)))
-	    (setq count (- count ?0 skipped)))
-
-	  (if ispell-keep-choices-win
-	      (if (> line ispell-keep-choices-win)
-		  (progn
-		    (switch-to-buffer ispell-choices-buffer)
-		    (select-window (next-window))
-		    (save-excursion
-		      (let ((cur-point (point)))
-			(move-to-window-line (- line ispell-keep-choices-win))
-			(if (<= (point) cur-point)
-			    (set-window-start (selected-window) (point)))))
-		    (select-window (previous-window))
-		    (enlarge-window (- line ispell-keep-choices-win))
-		    (goto-char (point-min))))
-	    (ispell-overlay-window (max line
-					ispell-choices-win-default-height)))
-	  (switch-to-buffer ispell-choices-buffer)
-	  (goto-char (point-min))
-	  (select-window (next-window))
-	  (while
-	      (eq
-	       t
-	       (setq
-		result
-		(progn
-		  (undo-boundary)
-		  (message (concat "C-h or ? for more options; SPC to leave "
-				   "unchanged, Character to replace word"))
-		  (let ((inhibit-quit t))
-		    (setq char (if (fboundp 'read-char-exclusive)
-				   (read-char-exclusive)
-				 (read-char))
-			  skipped 0)
-		    (if (or quit-flag (= char ?\C-g)) ; C-g is like typing X
-			(setq char ?X
-			      quit-flag nil)))
-		  ;; Adjust num to array offset skipping command characters.
-		  (let ((com-chars command-characters))
-		    (while com-chars
-		      (if (and (> (car com-chars) ?0) (< (car com-chars) char))
-			  (setq skipped (1+ skipped)))
-		      (setq com-chars (cdr com-chars)))
-		    (setq num (- char ?0 skipped)))
+		(enlarge-window (- line (window-height choices-window))))
+	    (select-window choices-window))
+	(ispell-overlay-window (max line
+				    ispell-choices-win-default-height))
+	(switch-to-buffer ispell-choices-buffer)))
+    (goto-char (point-min))
+    (select-window (next-window))
+    (while
+	(eq
+	 t
+	 (setq
+	  result
+	  (progn
+	    (undo-boundary)
+	    (message (concat "C-h or ? for more options; SPC to leave "
+			     "unchanged, Character to replace word"))
+	    (let ((inhibit-quit t))
+	      (setq char (if (fboundp 'read-char-exclusive)
+			     (read-char-exclusive)
+			   (read-char))
+		    skipped 0)
+	      (if (or quit-flag (= char ?\C-g)) ; C-g is like typing X
+		  (setq char ?X
+			quit-flag nil)))
+	    ;; Adjust num to array offset skipping command characters.
+	    (let ((com-chars command-characters))
+	      (while com-chars
+		(if (and (> (car com-chars) ?0) (< (car com-chars) char))
+		    (setq skipped (1+ skipped)))
+		(setq com-chars (cdr com-chars)))
+	      (setq num (- char ?0 skipped)))
 
-		  (cond
-		   ((= char ? ) nil)	; accept word this time only
-		   ((= char ?i)		; accept and insert word into pers dict
-		    (process-send-string ispell-process (concat "*" word "\n"))
-		    (setq ispell-pdict-modified-p '(t)) ; dictionary modified!
-		    nil)
-		   ((or (= char ?a) (= char ?A)) ; accept word without insert
-		    (process-send-string ispell-process (concat "@" word "\n"))
-		    (if (null ispell-pdict-modified-p)
-			(setq ispell-pdict-modified-p
-			      (list ispell-pdict-modified-p)))
-		    (if (= char ?A) 0))	; return 0 for ispell-add buffer-local
-		   ((or (= char ?r) (= char ?R)) ; type in replacement
-		    (if (or (= char ?R) ispell-query-replace-choices)
-			(list (read-string "Query-replacement for: " word) t)
-		      (cons (read-string "Replacement for: " word) nil)))
-		   ((or (= char ??) (= char help-char) (= char ?\C-h))
-		    (ispell-help)
-		    t)
-		   ;; Quit and move point back.
-		   ((= char ?x)
-		    (ispell-pdict-save ispell-silently-savep)
-		    (message "Exited spell-checking")
-		    (setq ispell-quit t)
-		    nil)
-		   ;; Quit and preserve point.
-		   ((= char ?X)
-		    (ispell-pdict-save ispell-silently-savep)
-		    (message
-		     (substitute-command-keys
-		      (concat "Spell-checking suspended;"
-			      " use C-u \\[ispell-word] to resume")))
-		    (setq ispell-quit (max (point-min)
-					   (- (point) (length word))))
-		    nil)
-		   ((= char ?q)
-		    (if (y-or-n-p "Really kill Ispell process? ")
-			(progn
-			  (ispell-kill-ispell t) ; terminate process.
-			  (setq ispell-quit (or (not ispell-checking-message)
-						(point))
-				ispell-pdict-modified-p nil))
-		      t))		; continue if they don't quit.
-		   ((= char ?l)
-		    (let ((new-word (read-string
-				     "Lookup string (`*' is wildcard): "
-				     word))
-			  (new-line 2))
-		      (if new-word
+	    (cond
+	     ((= char ? ) nil)		; accept word this time only
+	     ((= char ?i)		; accept and insert word into pers dict
+	      (process-send-string ispell-process (concat "*" word "\n"))
+	      (setq ispell-pdict-modified-p '(t)) ; dictionary modified!
+	      nil)
+	     ((or (= char ?a) (= char ?A)) ; accept word without insert
+	      (process-send-string ispell-process (concat "@" word "\n"))
+	      (if (null ispell-pdict-modified-p)
+		  (setq ispell-pdict-modified-p
+			(list ispell-pdict-modified-p)))
+	      (if (= char ?A) 0))	; return 0 for ispell-add buffer-local
+	     ((or (= char ?r) (= char ?R)) ; type in replacement
+	      (if (or (= char ?R) ispell-query-replace-choices)
+		  (list (read-string "Query-replacement for: " word) t)
+		(cons (read-string "Replacement for: " word) nil)))
+	     ((or (= char ??) (= char help-char) (= char ?\C-h))
+	      (ispell-help)
+	      t)
+	     ;; Quit and move point back.
+	     ((= char ?x)
+	      (ispell-pdict-save ispell-silently-savep)
+	      (message "Exited spell-checking")
+	      (setq ispell-quit t)
+	      nil)
+	     ;; Quit and preserve point.
+	     ((= char ?X)
+	      (ispell-pdict-save ispell-silently-savep)
+	      (message
+	       (substitute-command-keys
+		(concat "Spell-checking suspended;"
+			" use C-u \\[ispell-word] to resume")))
+	      (setq ispell-quit (max (point-min)
+				     (- (point) (length word))))
+	      nil)
+	     ((= char ?q)
+	      (if (y-or-n-p "Really kill Ispell process? ")
+		  (progn
+		    (ispell-kill-ispell t) ; terminate process.
+		    (setq ispell-quit (or (not ispell-checking-message)
+					  (point))
+			  ispell-pdict-modified-p nil))
+		t))			; continue if they don't quit.
+	     ((= char ?l)
+	      (let ((new-word (read-string
+			       "Lookup string (`*' is wildcard): "
+			       word))
+		    (new-line 2))
+		(if new-word
+		    (progn
+		      (save-excursion
+			(set-buffer (get-buffer-create
+				     ispell-choices-buffer))
+			(erase-buffer)
+			(setq count ?0
+			      skipped 0
+			      mode-line-format "--  %b  --"
+			      miss (lookup-words new-word)
+			      choices miss)
+			(while (and choices ; adjust choices window.
+				    (< (if (> (+ 7 (current-column)
+						 (length (car choices))
+						 (if (> count ?~) 3 0))
+					      (window-width))
+					   (progn
+					     (insert "\n")
+					     (setq new-line
+						   (1+ new-line)))
+					 new-line)
+				       max-lines))
+			  (while (memq count command-characters)
+			    (setq count (1+ count)
+				  skipped (1+ skipped)))
+			  (insert "(" count ") " (car choices) "  ")
+			  (setq choices (cdr choices)
+				count (1+ count)))
+			(setq count (- count ?0 skipped)))
+		      (select-window (previous-window))
+		      (if (/= new-line line)
 			  (progn
-			    (save-excursion
-			      (set-buffer (get-buffer-create
-					   ispell-choices-buffer))
-			      (erase-buffer)
-			      (setq count ?0
-				    skipped 0
-				    mode-line-format "--  %b  --"
-				    miss (lookup-words new-word)
-				    choices miss)
-			      (while (and choices ; adjust choices window.
-					  (< (if (> (+ 7 (current-column)
-						       (length (car choices))
-						       (if (> count ?~) 3 0))
-						    (window-width))
-						 (progn
-						   (insert "\n")
-						   (setq new-line
-							 (1+ new-line)))
-					       new-line)
-					     max-lines))
-				(while (memq count command-characters)
-				  (setq count (1+ count)
-					skipped (1+ skipped)))
-				(insert "(" count ") " (car choices) "  ")
-				(setq choices (cdr choices)
-				      count (1+ count)))
-			      (setq count (- count ?0 skipped)))
-			    (select-window (previous-window))
-			    (if (/= new-line line)
-				(progn
-				  (if (> new-line line)
-				      (enlarge-window (- new-line line))
-				    (shrink-window (- line new-line)))
-				  (setq line new-line)))
-			    (select-window (next-window)))))
-		    t)			; reselect from new choices
-		   ((= char ?u)
-		    (process-send-string ispell-process
-					 (concat "*" (downcase word) "\n"))
-		    (setq ispell-pdict-modified-p '(t)) ; dictionary modified!
-		    nil)
-		   ((= char ?m)		; type in what to insert
-		    (process-send-string
-		     ispell-process (concat "*" (read-string "Insert: " word)
-					    "\n"))
-		    (setq ispell-pdict-modified-p '(t))
-		    (cons word nil))
-		   ((and (>= num 0) (< num count))
-		    (if ispell-query-replace-choices ; Query replace flag
-			(list (nth num miss) 'query-replace)
-		      (nth num miss)))
-		   ((= char ?\C-l)
-		    (redraw-display) t)
-		   ((= char ?\C-r)
-		    (save-window-excursion (recursive-edit)) t)
-		   ((= char ?\C-z)
-		    (funcall (key-binding "\C-z"))
-		    t)
-		   (t (ding) t))))))
-	  result))
-    (if (not ispell-keep-choices-win) (bury-buffer ispell-choices-buffer))))
+			    (if (> new-line line)
+				(enlarge-window (- new-line line))
+			      (shrink-window (- line new-line)))
+			    (setq line new-line)))
+		      (select-window (next-window)))))
+	      t)			; reselect from new choices
+	     ((= char ?u)
+	      (process-send-string ispell-process
+				   (concat "*" (downcase word) "\n"))
+	      (setq ispell-pdict-modified-p '(t)) ; dictionary modified!
+	      nil)
+	     ((= char ?m)		; type in what to insert
+	      (process-send-string
+	       ispell-process (concat "*" (read-string "Insert: " word)
+				      "\n"))
+	      (setq ispell-pdict-modified-p '(t))
+	      (cons word nil))
+	     ((and (>= num 0) (< num count))
+	      (if ispell-query-replace-choices ; Query replace flag
+		  (list (nth num miss) 'query-replace)
+		(nth num miss)))
+	     ((= char ?\C-l)
+	      (redraw-display) t)
+	     ((= char ?\C-r)
+	      (save-window-excursion (recursive-edit)) t)
+	     ((= char ?\C-z)
+	      (funcall (key-binding "\C-z"))
+	      t)
+	     (t (ding) t))))))
+    result))
+
 
 
 ;;;###autoload
@@ -1313,7 +1305,7 @@
 (defun ispell-overlay-window (height)
   "Create a window covering the top HEIGHT lines of the current window.
 Ensure that the line above point is still visible but otherwise avoid
-scrolling the current window.  Leave the old window selected."
+scrolling the current window.  Leave the new window selected."
   (save-excursion
     (let ((oldot (save-excursion (forward-line -1) (point)))
 	  (top (save-excursion (move-to-window-line height) (point))))
@@ -1541,27 +1533,9 @@
 	(message "Spell checking %s..."
 		 (if (and (= reg-start (point-min)) (= reg-end (point-max)))
 		     (buffer-name) "region"))
-	(sit-for 0)
+;Eliminated to keep ispell-message displaying each piece: (sit-for 0)
 	;; must be top level, not in ispell-command-loop for keeping window.
 	(save-window-excursion
-	  (if ispell-keep-choices-win
-	      (let ((ocb (current-buffer))
-		    (window-min-height ispell-choices-win-default-height))
-		(or (eq ocb (window-buffer (selected-window)))
-		    (error
-		     "current buffer is not visible in selected window: %s"
-		     ocb))
-		;; This keeps the default window size when choices window saved
-		(setq ispell-keep-choices-win
-		      ispell-choices-win-default-height)
-		(ispell-overlay-window ispell-choices-win-default-height)
-		(switch-to-buffer (get-buffer-create ispell-choices-buffer))
-		(setq mode-line-format "--  %b  --")
-		(erase-buffer)
-		(select-window (next-window))
-		(or (eq (current-buffer) ocb)
-		    (error "ispell is confused about current buffer!"))
-		(sit-for 0)))
 	  (goto-char reg-start)
 	  (let ((transient-mark-mode nil))
 	    (while (and (not ispell-quit) (< (point) reg-end))
@@ -1672,10 +1646,18 @@
 					(ispell-highlight-spelling-error
 					 word-start word-end t))
 				    (sit-for 0)	; update screen display
-				    (setq replace (ispell-command-loop
-						   (car (cdr (cdr poss)))
-						   (car (cdr (cdr (cdr poss))))
-						   (car poss))))
+				    (if ispell-keep-choices-win
+					(setq replace
+					      (ispell-command-loop
+					       (car (cdr (cdr poss)))
+					       (car (cdr (cdr (cdr poss))))
+					       (car poss)))
+				      (save-window-excursion
+					(setq replace
+					      (ispell-command-loop
+					       (car (cdr (cdr poss)))
+					       (car (cdr (cdr (cdr poss))))
+					       (car poss))))))
 				;; protected
 				(if ispell-highlight-p
 				    (ispell-highlight-spelling-error
@@ -1815,7 +1797,6 @@
   (interactive "P")
   (let ((cursor-location (point))
 	case-fold-search
-	ispell-keep-choices-win
 	(word (ispell-get-word nil "\\*")) ; force "previous-word" processing.
 	start end possibilities replacement)
     (setq start (car (cdr word))
@@ -1841,8 +1822,9 @@
 	       (progn
 		 (if ispell-highlight-p	; highlight word
 		     (ispell-highlight-spelling-error start end t))
-		 (setq replacement
-		       (ispell-command-loop possibilities nil word)))
+		 (save-window-excursion
+		   (setq replacement
+			 (ispell-command-loop possibilities nil word))))
 	     ;; protected
 	     (if ispell-highlight-p
 		 (ispell-highlight-spelling-error start end))) ; un-highlight