Subject: Re: bug#13019: 24.2; ispell: use of local ispell-personal-dictionary

From: Agustin Martin <[email-masked]>
Date: Fri, 30 Nov 2012 18:59:47 +0100

On Fri, Nov 30, 2012 at 06:11:56PM +0100, Agustin Martin wrote:
> On Wed, Nov 28, 2012 at 04:16:53PM -0500, Glenn Morris wrote:
> > Akim Demaille wrote:
> > 
> > > I have recently upgraded my Emacs from 22.2.1 to 24.2.1, and there is
> > > a feature I lost: I could use ispell-personal-dictionary to specify a
> > > per-document *local* (i.e., relative to the directory of the file)
> > > dictionary.
> > 
> > Presumably due to 2010-09-02 changes to ispell-init-process for
> > http://debbugs.gnu.org/cgi/bugreport.cgi?bug=6143
> > 
> > Perhaps a file-name-absolute-p check for various variables could be
> > file-local could be added to that.
> > 
> > > | %%% ispell-dictionary: "american"
> > > | %%% ispell-personal-dictionary: "../en.dict"
> 
> Actual problem happens in `ispell-start-process' where the string to be
> passed to the spellchecker as personal dictionary is expanded,
> 
> (if ispell-current-personal-dictionary ; Use specified pers dict.
>     (list "-p" (expand-file-name ispell-current-personal-dictionary)))
> 
> and is indeed affected by the changes in `default-dictionary' coming from
> `ispell-init-process`.
> 
> I think the only reason for that `expand-file-name' is the tilde expansion
> in non-UNIX systems. In UNIX systems tilde can be explicitly passed. 
> Not sure if the directory {forward,back}slash is also related to this.
> 
> I am thinking about expanding `ispell-current-personal-dictionary' string
> only if it contains a tilde prefix.

I am now playing with something different, preserve original value of
`default-directory' in `current-ispell-directory' variable and expand 
personal dictionary after it if no absolute path or tilde is used. 

I think this is a better approach, see attached patch.

Let me test this a bit more before committing. Feel free to test it too.

-- 
Agustin
--- ispell.el.orig	2012-11-30 17:07:14.641701686 +0100
+++ ispell.el	2012-11-30 18:50:08.725283277 +0100
@@ -2669,7 +2669,8 @@
            orig-args
            (if ispell-current-personal-dictionary ; Use specified pers dict.
                (list "-p"
-                     (expand-file-name ispell-current-personal-dictionary)))
+                     (expand-file-name ispell-current-personal-dictionary
+				       current-ispell-directory)))
            ;; If we are using recent aspell or hunspell, make sure we use the
            ;; right encoding for communication. ispell or older aspell/hunspell
            ;; does not support this.
@@ -2706,18 +2707,21 @@
   (let* (;; Basename of dictionary used by the spell-checker
 	 (dict-bname (or (car (cdr (member "-d" (ispell-get-ispell-args))))
 			 ispell-current-dictionary))
+	 ;; The directory where process was started.
+	 (current-ispell-directory default-directory)
+	 ;; The default directory for the process.
 	 ;; Use "~/" as default-directory unless using Ispell with per-dir
 	 ;; personal dictionaries and not in a minibuffer under XEmacs
 	 (default-directory
 	   (if (or ispell-really-aspell
 		   ispell-really-hunspell
 		   ;; Protect against bad default-directory
-		   (not (and (file-directory-p default-directory)
-			     (file-readable-p default-directory)))
+                   (not (and (file-directory-p current-ispell-directory)
+                             (file-readable-p current-ispell-directory)))
 		   ;; Ispell and per-dir personal dicts available
-		   (not (or (file-readable-p (concat default-directory
+		   (not (or (file-readable-p (concat current-ispell-directory
 						     ".ispell_words"))
-			    (file-readable-p (concat default-directory
+			    (file-readable-p (concat current-ispell-directory
 						     ".ispell_"
 						     (or dict-bname
 							 "default")))))
@@ -2725,7 +2729,7 @@
 		   (and (window-minibuffer-p)
 			(not (fboundp 'minibuffer-selected-window))))
 	       (expand-file-name "~/")
-	     (expand-file-name default-directory))))
+	     (expand-file-name current-ispell-directory))))
     ;; Check if process needs restart
     (if (and ispell-process
 	     (eq (ispell-process-status) 'run)