From: Christopher J. Madsen <cjm at pobox com>
Date: Fri, 20 Dec 2002 14:46:22 -0600 (CST)

The attached patch will notify aspell of the replacements you make so
it can improve the suggestion list in the future.

This patch has not undergone much testing; use at your own risk.

I wrote this patch for ispell.el version 3.5 (available from
<http://kdstevens.com/~stevens/ispell-page.html>), but it should also
apply against the ispell.el 3.4 that comes with Emacs 21.2 (in the
lisp/textmodes directory).

*** ispell.el$	Mon Dec 16 00:49:49 2002
--- ispell.el	Fri Dec 20 14:03:10 2002
***************
*** 729,734 ****
--- 729,736 ----
  
  (defconst ispell-version "ispell.el 3.5 - 07/11/01")
  
+ (defvar ispell-really-aspell nil) ;Non-nil if aspell extensions should be used
+ 
  
  ;;;###autoload
  (defun check-ispell-version (&optional interactivep)
***************
*** 795,801 ****
  		 (< (car (read-from-string (buffer-substring-no-properties
  					    (match-beginning 3)(match-end 3))))
  		    (car (cdr (cdr ispell-required-version)))))
! 	    (setq ispell-offset 0)))
        (kill-buffer (current-buffer)))
      result))
  
--- 797,808 ----
  		 (< (car (read-from-string (buffer-substring-no-properties
  					    (match-beginning 3)(match-end 3))))
  		    (car (cdr (cdr ispell-required-version)))))
! 	    (setq ispell-offset 0))
!         ;; check to see if it's really aspell.
!         (goto-char (point-min))
!         (let (case-fold-search)
!           (setq ispell-really-aspell
!                 (and (search-forward "(but really Aspell " nil t) t))))
        (kill-buffer (current-buffer)))
      result))
  
***************
*** 1352,1357 ****
--- 1359,1370 ----
  			      (delete-region start (point)))
  			  (setq more-lines (= 0 (forward-line))))))))))))))
  
+ (defun ispell-send-replacement (misspelled replacement)
+   "Notify aspell that MISSPELLED should be spelled REPLACEMENT.
+ This allows it to improve the suggestion list based on actual mispellings."
+   (and ispell-really-aspell
+        (ispell-send-string (concat "$$ra " misspelled "," replacement "\n"))))
+ 

  ;;;###autoload
***************
*** 2815,2824 ****
--- 2828,2839 ----
  	      (if (not (listp replace))
  		  (progn
  		    (insert replace)	; insert dictionary word
+ 		    (ispell-send-replacement (car poss) replace)
  		    (setq accept-list (cons replace accept-list)))
  		(let ((replace-word (car replace)))
  		  ;; Recheck hand entered replacement word
  		  (insert replace-word)
+ 		  (ispell-send-replacement (car poss) replace-word)
  		  (if (car (cdr replace))
  		      (save-window-excursion
  			(delete-other-windows) ; to correctly show help.