Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

correction hook



Someone complained to me that when he mistyped "make" as "mak", zsh
would spell-correct it to "mawk" instead of "make".  I had asked him for
a proposed algorithm to solve this, but he had none.

The thought then occurred to me that a hook function might be a bit more
flexible.  With the following patch, one can now do something like

correctword() {
[[ "$1" == mak ]] && CORRECT_GUESS=make
}

or potentially something more sophisticated that couldn't be 
accomplished as effectively as by alias mak=make.

I'll refrain from committing the patch.  Does anyone have a better way
of solving this problem?

Index: Src/utils.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/utils.c,v
retrieving revision 1.39
diff -u -r1.39 utils.c
--- Src/utils.c	6 Jan 2002 01:07:23 -0000	1.39
+++ Src/utils.c	11 Feb 2002 07:54:28 -0000
@@ -1536,6 +1536,7 @@
     char ic = '\0';
     int ne;
     int preflen = 0;
+    Eprog prog;
 
     if ((histdone & HISTFLAG_NOEXEC) || **s == '-' || **s == '%')
 	return;
@@ -1632,6 +1633,27 @@
 	    guess = *s;
 	    *guess = *best = ztokens[ic - Pound];
 	}
+
+	if ((prog = getshfunc("correctword")) != &dummy_eprog) {
+		
+		char *correct_guess;
+		int osc = sfcontext;
+		LinkList args = NULL;
+		
+		args = newlinklist();
+		addlinknode(args, "correctword");
+		addlinknode(args, dupstring(guess));
+		addlinknode(args, dupstring(best));
+		
+		sfcontext = SFC_HOOK;
+		doshfunc("correctword", prog, args, 0, 1);
+		sfcontext = osc;
+		
+		correct_guess = ztrdup(getsparam("CORRECT_GUESS"));
+		if (correct_guess)
+			best = correct_guess;
+	}
+
 	if (ask) {
 	    if (noquery(0)) {
 		x = 'n';



Messages sorted by: Reverse Date, Date, Thread, Author