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

Re: down-line-or-search doesn't go to last entry



On Sun, 11 May 2008 16:23:54 +0200
"Mikael Magnusson" <mikachu@xxxxxxxxx> wrote:
> I have {up,down}-line-or-search bound to Up/Down, and I noticed
> recently that down-line-or-search won't go to the empty entry anymore.
> Ie if you press up and then down, it will still have the previous
> entry in the cmdline, I have to press page down where I have
> down-history to get back to the empty line.

I have been annoying myself silly with this over yet another two hours
of my life that will never come again.

There is one bug in zlinecmp() that I've recently introduced.

However, I don't think that's the main problem, which is the second test
for whether a search line is acceptable.  In recent versions of the
shell, the test has been looking to ensure the search text *differs*
from the line you're trying it against, which obviously doesn't make
sense.  It was already doing something such in 4.2.  This is complicated
by the fact that until I changed it to using metafied strings the
comparisons were being done in interesting ways which have changed
subtly over the shell's history (though I haven't gone back before 4.2).
The upshot seems to be the test previously fortuitously failed due to
the fact that it was being passed the length of the current editing
line, not the length of the search string.

I am guessing that the real point of this second test is to compare if
the line is different from the one you've just left, and hence it
shouldn't involve the search string at all, just the line you're leaving
and the line you're trying.  Those more energetic may wish, as an
exercise, to compare with the archive.

Let's see how this works.

Index: Src/Zle/zle_hist.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_hist.c,v
retrieving revision 1.56
diff -u -r1.56 zle_hist.c
--- Src/Zle/zle_hist.c	5 May 2008 01:14:06 -0000	1.56
+++ Src/Zle/zle_hist.c	11 May 2008 18:13:17 -0000
@@ -111,7 +111,7 @@
     mbstate_t hstate, istate;
 #endif
 
-    while (*hptr == *iptr) {
+    while (*iptr && *hptr == *iptr) {
 	hptr++;
 	iptr++;
     }
@@ -470,13 +470,15 @@
     if (!(he = quietgethist(histline)))
 	return 1;
 
+    metafy_line();
     while ((he = movehistent(he, -1, hist_skip_flags))) {
 	if (isset(HISTFINDNODUPS) && he->node.flags & HIST_DUP)
 	    continue;
 	zt = GETZLETEXT(he);
 	if (zlinecmp(zt, str) < 0 &&
-	    (*args || strcmp(zt, str) != 0)) {
+	    (*args || strcmp(zt, zlemetaline) != 0)) {
 	    if (--n <= 0) {
+		unmetafy_line();
 		zle_setline(he);
 		srch_hl = histline;
 		srch_cs = zlecs;
@@ -484,6 +486,7 @@
 	    }
 	}
     }
+    unmetafy_line();
     return 1;
 }
 
@@ -524,13 +527,15 @@
     if (!(he = quietgethist(histline)))
 	return 1;
 
+    metafy_line();
     while ((he = movehistent(he, 1, hist_skip_flags))) {
 	if (isset(HISTFINDNODUPS) && he->node.flags & HIST_DUP)
 	    continue;
 	zt = GETZLETEXT(he);
 	if (zlinecmp(zt, str) < (he->histnum == curhist) &&
-	    (*args || strcmp(zt, str) != 0)) {
+	    (*args || strcmp(zt, zlemetaline) != 0)) {
 	    if (--n <= 0) {
+		unmetafy_line();
 		zle_setline(he);
 		srch_hl = histline;
 		srch_cs = zlecs;
@@ -538,6 +543,7 @@
 	    }
 	}
     }
+    unmetafy_line();
     return 1;
 }
 

-- 
Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/



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