zsh-workers
 help / color / mirror / code / Atom feed
* down-line-or-search doesn't go to last entry
@ 2008-05-11 14:23 Mikael Magnusson
  2008-05-11 18:31 ` Peter Stephenson
  0 siblings, 1 reply; 3+ messages in thread
From: Mikael Magnusson @ 2008-05-11 14:23 UTC (permalink / raw)
  To: zsh-workers

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.

-- 
Mikael Magnusson


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: down-line-or-search doesn't go to last entry
  2008-05-11 14:23 down-line-or-search doesn't go to last entry Mikael Magnusson
@ 2008-05-11 18:31 ` Peter Stephenson
  2008-05-11 19:10   ` Mikael Magnusson
  0 siblings, 1 reply; 3+ messages in thread
From: Peter Stephenson @ 2008-05-11 18:31 UTC (permalink / raw)
  To: zsh-workers

On Sun, 11 May 2008 16:23:54 +0200
"Mikael Magnusson" <mikachu@gmail.com> 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@ntlworld.com>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: down-line-or-search doesn't go to last entry
  2008-05-11 18:31 ` Peter Stephenson
@ 2008-05-11 19:10   ` Mikael Magnusson
  0 siblings, 0 replies; 3+ messages in thread
From: Mikael Magnusson @ 2008-05-11 19:10 UTC (permalink / raw)
  To: zsh-workers

2008/5/11 Peter Stephenson <p.w.stephenson@ntlworld.com>:
>
> On Sun, 11 May 2008 16:23:54 +0200
>  "Mikael Magnusson" <mikachu@gmail.com> 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.

That appears to fix the problem here, thanks.

-- 
Mikael Magnusson


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-05-11 19:11 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-11 14:23 down-line-or-search doesn't go to last entry Mikael Magnusson
2008-05-11 18:31 ` Peter Stephenson
2008-05-11 19:10   ` Mikael Magnusson

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).