zsh-workers
 help / color / mirror / code / Atom feed
* [PATCH 1/2] Fix vi-rev-repeat-find after vi-find-*-char-skip
@ 2012-08-12 18:00 Aaron Schrab
  2012-08-12 18:00 ` [PATCH 2/2] Make vi-repeat-find more vim-like Aaron Schrab
  0 siblings, 1 reply; 4+ messages in thread
From: Aaron Schrab @ 2012-08-12 18:00 UTC (permalink / raw)
  To: zsh-workers

When vi-rev-repeat-find (,) is used to repeat either
vi-find-next-char-skip (t) or vi-find-prev-char-skip (T), the direction
in which the final cursor location will be adjusted needs to be reversed
along with the direction of the search.  If this is not done, the
reverse find will go past the desired character rather than stopping
before it.

Examples of behaviour ([] indicates cursor position):

Previously:

       Completion/Un[i]x/Command/_ls
    t/ Completion/Uni[x]/Command/_ls
    ,  Completio[n]/Unix/Command/_ls

       Completion/Un[i]x/Command/_ls
    T/ Completion/[U]nix/Command/_ls
    ,  Completion/Unix/[C]ommand/_ls

Now:

       Completion/Un[i]x/Command/_ls
    t/ Completion/Uni[x]/Command/_ls
    ,  Completion/[U]nix/Command/_ls

       Completion/Un[i]x/Command/_ls
    T/ Completion/[U]nix/Command/_ls
    ,  Completion/Uni[x]/Command/_ls
---
 Src/Zle/zle_move.c |    2 ++
 1 file changed, 2 insertions(+)

diff --git a/Src/Zle/zle_move.c b/Src/Zle/zle_move.c
index 0e940bc..284a863 100644
--- a/Src/Zle/zle_move.c
+++ b/Src/Zle/zle_move.c
@@ -770,9 +770,11 @@ virevrepeatfind(char **args)
 	zmult = -zmult;
 	return ret;
     }
+    tailadd = -tailadd;
     vfinddir = -vfinddir;
     ret = virepeatfind(args);
     vfinddir = -vfinddir;
+    tailadd = -tailadd;
     return ret;
 }
 
-- 
1.7.10.4


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

* [PATCH 2/2] Make vi-repeat-find more vim-like
  2012-08-12 18:00 [PATCH 1/2] Fix vi-rev-repeat-find after vi-find-*-char-skip Aaron Schrab
@ 2012-08-12 18:00 ` Aaron Schrab
  2012-08-12 21:04   ` Bart Schaefer
  0 siblings, 1 reply; 4+ messages in thread
From: Aaron Schrab @ 2012-08-12 18:00 UTC (permalink / raw)
  To: zsh-workers

Change vi-repeat-find (;) and vi-rev-repeat-find (,) to ignore a match
at the first character checked if repeating a vi-find-next-char-skip (t)
or vi-find-prev-char-skip (T), as vim does (when cpoptions doesn't
contain ;).  The standard vi behaviour makes immediately repeating one
of these searches useless, since the first character checked will always
match resulting in no movement of the cursor.
---
 Src/Zle/zle_move.c |   31 ++++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/Src/Zle/zle_move.c b/Src/Zle/zle_move.c
index 284a863..d5f464c 100644
--- a/Src/Zle/zle_move.c
+++ b/Src/Zle/zle_move.c
@@ -679,7 +679,7 @@ vifindnextchar(char **args)
     if ((vfindchar = vigetkey()) != ZLEEOF) {
 	vfinddir = 1;
 	tailadd = 0;
-	return virepeatfind(args);
+	return vifindchar(0, args);
     }
     return 1;
 }
@@ -691,7 +691,7 @@ vifindprevchar(char **args)
     if ((vfindchar = vigetkey()) != ZLEEOF) {
 	vfinddir = -1;
 	tailadd = 0;
-	return virepeatfind(args);
+	return vifindchar(0, args);
     }
     return 1;
 }
@@ -703,7 +703,7 @@ vifindnextcharskip(char **args)
     if ((vfindchar = vigetkey()) != ZLEEOF) {
 	vfinddir = 1;
 	tailadd = -1;
-	return virepeatfind(args);
+	return vifindchar(0, args);
     }
     return 1;
 }
@@ -715,14 +715,14 @@ vifindprevcharskip(char **args)
     if ((vfindchar = vigetkey()) != ZLEEOF) {
 	vfinddir = -1;
 	tailadd = 1;
-	return virepeatfind(args);
+	return vifindchar(0, args);
     }
     return 1;
 }
 
 /**/
 int
-virepeatfind(char **args)
+vifindchar(int repeat, char **args)
 {
     int ocs = zlecs, n = zmult;
 
@@ -735,6 +735,16 @@ virepeatfind(char **args)
 	zmult = n;
 	return ret;
     }
+    if (repeat && tailadd != 0) {
+	if (vfinddir > 0) {
+	    if(zlecs < zlell && (ZLE_INT_T)zleline[zlecs+1] == vfindchar)
+		INCCS();
+	}
+	else {
+	    if(zlecs > 0 && (ZLE_INT_T)zleline[zlecs-1] == vfindchar)
+		DECCS();
+	}
+    }
     while (n--) {
 	do {
 	    if (vfinddir > 0)
@@ -760,19 +770,26 @@ virepeatfind(char **args)
 
 /**/
 int
+virepeatfind(char **args)
+{
+    return vifindchar(1, args);
+}
+
+/**/
+int
 virevrepeatfind(char **args)
 {
     int ret;
 
     if (zmult < 0) {
 	zmult = -zmult;
-	ret = virepeatfind(args);
+	ret = vifindchar(1, args);
 	zmult = -zmult;
 	return ret;
     }
     tailadd = -tailadd;
     vfinddir = -vfinddir;
-    ret = virepeatfind(args);
+    ret = vifindchar(1, args);
     vfinddir = -vfinddir;
     tailadd = -tailadd;
     return ret;
-- 
1.7.10.4


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

* Re: [PATCH 2/2] Make vi-repeat-find more vim-like
  2012-08-12 18:00 ` [PATCH 2/2] Make vi-repeat-find more vim-like Aaron Schrab
@ 2012-08-12 21:04   ` Bart Schaefer
  2012-08-12 21:32     ` Aaron Schrab
  0 siblings, 1 reply; 4+ messages in thread
From: Bart Schaefer @ 2012-08-12 21:04 UTC (permalink / raw)
  To: zsh-workers

On Aug 12,  2:00pm, Aaron Schrab wrote:
} Subject: [PATCH 2/2] Make vi-repeat-find more vim-like

In the past we've rejected this sort of patch on the grounds that zsh
is emulating vi, not emulating vim.

On the one hand there are things about vim that seriously annoy me.
On the other hand, http://xkcd.com/1093/.  ("The original code for vi
was written by Bill Joy in 1976 ...")


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

* Re: [PATCH 2/2] Make vi-repeat-find more vim-like
  2012-08-12 21:04   ` Bart Schaefer
@ 2012-08-12 21:32     ` Aaron Schrab
  0 siblings, 0 replies; 4+ messages in thread
From: Aaron Schrab @ 2012-08-12 21:32 UTC (permalink / raw)
  To: zsh-workers

At 14:04 -0700 12 Aug 2012, Bart Schaefer <schaefer@brasslantern.com> wrote:
>On Aug 12,  2:00pm, Aaron Schrab wrote:
>} Subject: [PATCH 2/2] Make vi-repeat-find more vim-like
>
>In the past we've rejected this sort of patch on the grounds that zsh
>is emulating vi, not emulating vim.

Right, but is it worth it to be strict about that?  Even if it's 
unlikely that the emulation will be complete in any case?  Here, I think 
the vi behaviour is quite stupid and useless; while the vim behaviour 
can be really nice.

Also, I want to make sure it's understood that the first patch in this 
series fixes a behaviour to match what would happen in both vi and vim.  
I just happened to notice that problem while testing out the changes for 
the second patch.


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

end of thread, other threads:[~2012-08-12 21:33 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-12 18:00 [PATCH 1/2] Fix vi-rev-repeat-find after vi-find-*-char-skip Aaron Schrab
2012-08-12 18:00 ` [PATCH 2/2] Make vi-repeat-find more vim-like Aaron Schrab
2012-08-12 21:04   ` Bart Schaefer
2012-08-12 21:32     ` Aaron Schrab

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).