zsh-workers
 help / color / mirror / code / Atom feed
* bug report: vi mode yank should yank to 0 register
@ 2014-10-21 14:32 Gábor Márton
  2014-10-22 10:24 ` Oliver Kiddle
  0 siblings, 1 reply; 8+ messages in thread
From: Gábor Márton @ 2014-10-21 14:32 UTC (permalink / raw)
  To: zsh-workers

[-- Attachment #1: Type: text/plain, Size: 478 bytes --]

Hi,

I am not sure if this list is the proper form of reporting bugs, please
forgive me.

I have noticed that zsh vi mode is using the " register instead of the 0
register when a yank is done.

Can anyone confirm that this is an issue with the latest zsh as well? Am I
sending the bug report to the right place? If not, where should I send it?

I am not subscribed to the mail list, so please reply for me as well not
just for the list.

Many Thanks,
Gabor (a happy zsh user :)

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

* Re: bug report: vi mode yank should yank to 0 register
  2014-10-21 14:32 bug report: vi mode yank should yank to 0 register Gábor Márton
@ 2014-10-22 10:24 ` Oliver Kiddle
  2014-10-22 10:32   ` Peter Stephenson
  2014-10-22 22:06   ` PATCH: " Oliver Kiddle
  0 siblings, 2 replies; 8+ messages in thread
From: Oliver Kiddle @ 2014-10-22 10:24 UTC (permalink / raw)
  To: Gábor Márton; +Cc: zsh-workers

Gábor Márton wrote:
> 
> I am not sure if this list is the proper form of reporting bugs, please
> forgive me.

No, this is exactly the right place. Thanks for the report.

> I have noticed that zsh vi mode is using the " register instead of the 0
> register when a yank is done.

It's a vi mode not a vim mode. And as in vi, there is no 0 register. You
might notice that you get a beep after pressing "0.

I'd agree that it would be nice to have some vim features working for
zsh. This is one case where I prefer the emacs yank stack concept.

I'm not sure that "1 to "9 are exactly working as in vi: both deletions
and yanks go to them. This is probably because they were implemented on
top of the killring which was implemented with emacs in mind first.

Oliver


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

* Re: bug report: vi mode yank should yank to 0 register
  2014-10-22 10:24 ` Oliver Kiddle
@ 2014-10-22 10:32   ` Peter Stephenson
  2014-10-22 12:25     ` Oliver Kiddle
  2014-10-22 22:06   ` PATCH: " Oliver Kiddle
  1 sibling, 1 reply; 8+ messages in thread
From: Peter Stephenson @ 2014-10-22 10:32 UTC (permalink / raw)
  To: zsh-workers

On Wed, 22 Oct 2014 12:24:42 +0200
Oliver Kiddle <okiddle@yahoo.co.uk> wrote:
> > I have noticed that zsh vi mode is using the " register instead of the 0
> > register when a yank is done.
> 
> It's a vi mode not a vim mode. And as in vi, there is no 0 register. You
> might notice that you get a beep after pressing "0.

It might therefore be acceptable to make 0 an alias for ".  But maybe
that's a big can of worms...

pws


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

* Re: bug report: vi mode yank should yank to 0 register
  2014-10-22 10:32   ` Peter Stephenson
@ 2014-10-22 12:25     ` Oliver Kiddle
  0 siblings, 0 replies; 8+ messages in thread
From: Oliver Kiddle @ 2014-10-22 12:25 UTC (permalink / raw)
  To: zsh-workers

Peter Stephenson wrote:
> It might therefore be acceptable to make 0 an alias for ".  But maybe
> that's a big can of worms...

Zsh doesn't really have a " register either. And that's effectively what
you're getting anyway. You type "0, and get a beep. When you now do a
paste, you're getting the default. We don't associate a register
character with the default.

Given that in vim, an ordinary yank should affect both " and 0
registers, a question for Gábor is: what exactly did you type, what did
you get and what did you expect?

Trying to speculate, I'm guessing it was "0p to get the last explicitly
yanked text ignoring any intermediate changes/deletions.

Oliver


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

* PATCH: Re: bug report: vi mode yank should yank to 0 register
  2014-10-22 10:24 ` Oliver Kiddle
  2014-10-22 10:32   ` Peter Stephenson
@ 2014-10-22 22:06   ` Oliver Kiddle
  2014-10-22 22:44     ` Oliver Kiddle
                       ` (2 more replies)
  1 sibling, 3 replies; 8+ messages in thread
From: Oliver Kiddle @ 2014-10-22 22:06 UTC (permalink / raw)
  To: Gábor Márton, zsh-workers

I wrote:
> > I have noticed that zsh vi mode is using the " register instead of the 0
> > register when a yank is done.
> 
> It's a vi mode not a vim mode. And as in vi, there is no 0 register. You
> might notice that you get a beep after pressing "0.

The patch below adds support for this. No tests or documentation just
yet. There's no user-visible handling for the " register partly because
I can't think of a use for it without also implementing vim's i_Ctrl-R
or some other vim feature I'm not aware of. More sensible might be a zle
special variable to access the registers. Is it actually possible at the
moment to have a special associative array without using a hash table
internally underneath?

> I'm not sure that "1 to "9 are exactly working as in vi: both deletions
> and yanks go to them. This is probably because they were implemented on
> top of the killring which was implemented with emacs in mind first.

This patch also has the side-effect of fixing this. Note that I was
wrong above about emacs: the registers are completely separate from the
killring.

In the process, I've found a couple of further issues: even with a named
register, we should update cutbuf and under some circumstances we seem
to be erroneously appending to cutbuf instead of replacing it.

Oliver

diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h
index 870e214..860c821 100644
--- a/Src/Zle/zle.h
+++ b/Src/Zle/zle.h
@@ -256,6 +256,7 @@ struct modifier {
 			      * of visible characters directly input by
 			      * the user.
 			      */
+#define CUT_YANK    (1<<3)   /* vi yank: use register 0 instead of 1-9 */
 
 /* undo system */
 
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index 442c319..8344c66 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -2128,7 +2128,7 @@ finish_(UNUSED(Module m))
 	    free(kring[i].buf);
 	zfree(kring, kringsize * sizeof(struct cutbuffer));
     }
-    for(i = 35; i--; )
+    for(i = 36; i--; )
 	zfree(vibuf[i].buf, vibuf[i].len);
 
     /* editor entry points */
diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c
index 1089e27..1479365 100644
--- a/Src/Zle/zle_utils.c
+++ b/Src/Zle/zle_utils.c
@@ -43,10 +43,10 @@ struct cutbuffer *kring;
 int kringsize, kringnum;
 
 /* Vi named cut buffers.  0-25 are the named buffers "a to "z, and *
- * 26-34 are the numbered buffer stack "1 to "9.                   */
+ * 26-35 are the numbered buffer stack "0 to "9.                   */
 
 /**/
-struct cutbuffer vibuf[35];
+struct cutbuffer vibuf[36];
 
 /* the line before last mod (for undo purposes) */
 
@@ -942,16 +942,23 @@ cuttext(ZLE_STRING_T line, int ct, int flags)
 	    b->len = len + ct;
 	}
 	return;
+    } else if (flags & CUT_YANK) {
+	/* Save in "0 */
+	free(vibuf[26].buf);
+	vibuf[26].buf = (ZLE_STRING_T)zalloc(ct * ZLE_CHAR_SIZE);
+	ZS_memcpy(vibuf[26].buf, line, ct);
+	vibuf[26].len = ct;
+	vibuf[26].flags = vilinerange ? CUTBUFFER_LINE : 0;
     } else {
 	/* Save in "1, shifting "1-"8 along to "2-"9 */
 	int n;
 	free(vibuf[34].buf);
-	for(n=34; n>26; n--)
+	for(n=35; n>27; n--)
 	    vibuf[n] = vibuf[n-1];
-	vibuf[26].buf = (ZLE_STRING_T)zalloc(ct * ZLE_CHAR_SIZE);
-	ZS_memcpy(vibuf[26].buf, line, ct);
-	vibuf[26].len = ct;
-	vibuf[26].flags = vilinerange ? CUTBUFFER_LINE : 0;
+	vibuf[27].buf = (ZLE_STRING_T)zalloc(ct * ZLE_CHAR_SIZE);
+	ZS_memcpy(vibuf[27].buf, line, ct);
+	vibuf[27].len = ct;
+	vibuf[27].flags = vilinerange ? CUTBUFFER_LINE : 0;
     }
     if (!cutbuf.buf) {
 	cutbuf.buf = (ZLE_STRING_T)zalloc(ZLE_CHAR_SIZE);
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c
index 9e39143..2555c6a 100644
--- a/Src/Zle/zle_vi.c
+++ b/Src/Zle/zle_vi.c
@@ -453,7 +453,7 @@ viyank(UNUSED(char **args))
 
     startvichange(1);
     if ((c2 = getvirange(0)) != -1) {
-	cut(zlecs, c2 - zlecs, 0);
+	cut(zlecs, c2 - zlecs, CUT_YANK);
 	ret = 0;
     }
     vichgflag = 0;
@@ -470,7 +470,7 @@ viyankeol(UNUSED(char **args))
     startvichange(-1);
     if (x == zlecs)
 	return 1;
-    cut(zlecs, x - zlecs, 0);
+    cut(zlecs, x - zlecs, CUT_YANK);
     return 0;
 }
 
@@ -492,7 +492,7 @@ viyankwholeline(UNUSED(char **args))
      zlecs = findeol() + 1;
     }
     vilinerange = 1;
-    cut(bol, zlecs - bol - 1, 0);
+    cut(bol, zlecs - bol - 1, CUT_YANK);
     zlecs = oldcs;
     return 0;
 }
@@ -910,7 +910,7 @@ visetbuffer(UNUSED(char **args))
     ZLE_INT_T ch;
 
     if ((zmod.flags & MOD_VIBUF) ||
-	(((ch = getfullchar(0)) < ZWC('1') || ch > ZWC('9')) &&
+	(((ch = getfullchar(0)) < ZWC('0') || ch > ZWC('9')) &&
 	 (ch < ZWC('a') || ch > ZWC('z')) &&
 	 (ch < ZWC('A') || ch > ZWC('Z'))))
 	return 1;
@@ -920,8 +920,8 @@ visetbuffer(UNUSED(char **args))
 	zmod.flags &= ~MOD_VIAPP;
     /* FIXME how portable is it for multibyte encoding? */
     zmod.vibuf = ZC_tolower(ch);
-    if (ch >= ZWC('1') && ch <= ZWC('9'))
-	zmod.vibuf += - (int)ZWC('1') + 26;
+    if (ch >= ZWC('0') && ch <= ZWC('9'))
+	zmod.vibuf += - (int)ZWC('0') + 26;
     else
 	zmod.vibuf += - (int)ZWC('a');
     zmod.flags |= MOD_VIBUF;


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

* Re: PATCH: Re: bug report: vi mode yank should yank to 0 register
  2014-10-22 22:06   ` PATCH: " Oliver Kiddle
@ 2014-10-22 22:44     ` Oliver Kiddle
  2014-10-22 23:03     ` Oliver Kiddle
  2014-10-23 19:25     ` Oliver Kiddle
  2 siblings, 0 replies; 8+ messages in thread
From: Oliver Kiddle @ 2014-10-22 22:44 UTC (permalink / raw)
  To: zsh-workers

I wrote:
> In the process, I've found a couple of further issues: ...
>                               ... and under some circumstances we seem
> to be erroneously appending to cutbuf instead of replacing it.

I think this problem just comes down to the following patch.

To reproduce, start with two lines of text and from vi command mode, do
ddyyp

Oliver

diff --git a/Src/Zle/iwidgets.list b/Src/Zle/iwidgets.list
index e3ffe3e..ea41a7f 100644
--- a/Src/Zle/iwidgets.list
+++ b/Src/Zle/iwidgets.list
@@ -119,7 +119,7 @@
 "vi-backward-blank-word", vibackwardblankword, 0
 "vi-backward-char", vibackwardchar, 0
 "vi-backward-delete-char", vibackwarddeletechar, ZLE_KEEPSUFFIX
-"vi-backward-kill-word", vibackwardkillword, ZLE_KILL | ZLE_KEEPSUFFIX
+"vi-backward-kill-word", vibackwardkillword, ZLE_KEEPSUFFIX
 "vi-backward-word", vibackwardword, 0
 "vi-beginning-of-line", vibeginningofline, 0
 "vi-caps-lock-panic", vicapslockpanic, 0
@@ -127,7 +127,7 @@
 "vi-change-eol", vichangeeol, 0
 "vi-change-whole-line", vichangewholeline, 0
 "vi-cmd-mode", vicmdmode, 0
-"vi-delete", videlete, ZLE_KILL | ZLE_KEEPSUFFIX
+"vi-delete", videlete, ZLE_KEEPSUFFIX
 "vi-delete-char", videletechar, ZLE_KEEPSUFFIX
 "vi-digit-or-beginning-of-line", vidigitorbeginningofline, 0
 "vi-down-line-or-history", vidownlineorhistory, ZLE_LINEMOVE
@@ -152,8 +152,8 @@
 "vi-insert", viinsert, 0
 "vi-insert-bol", viinsertbol, 0
 "vi-join", vijoin, 0
-"vi-kill-eol", vikilleol, ZLE_KILL | ZLE_KEEPSUFFIX
-"vi-kill-line", vikillline, ZLE_KILL | ZLE_KEEPSUFFIX
+"vi-kill-eol", vikilleol, ZLE_KEEPSUFFIX
+"vi-kill-line", vikillline, ZLE_KEEPSUFFIX
 "vi-match-bracket", vimatchbracket, 0
 "vi-open-line-above", viopenlineabove, 0
 "vi-open-line-below", viopenlinebelow, 0


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

* Re: PATCH: Re: bug report: vi mode yank should yank to 0 register
  2014-10-22 22:06   ` PATCH: " Oliver Kiddle
  2014-10-22 22:44     ` Oliver Kiddle
@ 2014-10-22 23:03     ` Oliver Kiddle
  2014-10-23 19:25     ` Oliver Kiddle
  2 siblings, 0 replies; 8+ messages in thread
From: Oliver Kiddle @ 2014-10-22 23:03 UTC (permalink / raw)
  To: zsh-workers

I wrote:
> In the process, I've found a couple of further issues: even with a named
> register, we should update cutbuf

And this one seems to be the even smaller patch below. Sorry for the
noise I was expecting to leave these for tomorrow.

Oliver

diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c
index 1479365..f69bc77 100644
--- a/Src/Zle/zle_utils.c
+++ b/Src/Zle/zle_utils.c
@@ -941,7 +941,6 @@ cuttext(ZLE_STRING_T line, int ct, int flags)
 	    ZS_memcpy(b->buf + len, line, ct);
 	    b->len = len + ct;
 	}
-	return;
     } else if (flags & CUT_YANK) {
 	/* Save in "0 */
 	free(vibuf[26].buf);


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

* Re: PATCH: Re: bug report: vi mode yank should yank to 0 register
  2014-10-22 22:06   ` PATCH: " Oliver Kiddle
  2014-10-22 22:44     ` Oliver Kiddle
  2014-10-22 23:03     ` Oliver Kiddle
@ 2014-10-23 19:25     ` Oliver Kiddle
  2 siblings, 0 replies; 8+ messages in thread
From: Oliver Kiddle @ 2014-10-23 19:25 UTC (permalink / raw)
  To: zsh-workers

Of the other vim registers "_ (the black hole register) is both useful
and meaningful in zsh so this adds that. I've also changed vi-set-buffer
so that when invoked from a zle widget, you can pass it the name of a
buffer to use so you can now use the following before other commands in
order to leave the cut buffer untouched.
  zle vi-set-buffer _

This also adds documentation and tests.

Oliver

diff --git a/Doc/Zsh/zle.yo b/Doc/Zsh/zle.yo
index 98f3802..881e56b 100644
--- a/Doc/Zsh/zle.yo
+++ b/Doc/Zsh/zle.yo
@@ -2180,19 +2180,29 @@ command.  tt(run-help) is normally aliased to tt(man).
 tindex(vi-set-buffer)
 item(tt(vi-set-buffer) (unbound) (") (unbound))(
 Specify a buffer to be used in the following command.
-There are 35 buffers that can be specified:
-the 26 `named' buffers tt("a) to tt("z)
-and the nine `queued' buffers tt("1) to tt("9).  The named buffers can also
-be specified as tt("A) to tt("Z).
-
-When a buffer is specified for a cut command, the text being cut replaces
-the previous contents of the specified buffer.  If a named buffer
-is specified using a capital, the newly cut text is appended to the buffer
-instead of overwriting it.
-
-If no buffer is specified for a cut command, tt("1) is used, and the
-contents of tt("1) to tt("8) are each shifted along one buffer; the contents of
-tt("9) is lost.
+There are 37 buffers that can be specified:
+the 26 `named' buffers tt("a) to tt("z), the `yank' buffer tt("0),
+the nine `queued' buffers tt("1) to tt("9) and the `black hole' buffer
+tt("_).  The named buffers can also be specified as tt("A) to tt("Z).
+
+When a buffer is specified for a cut, change or yank command, the text
+concerned replaces the previous contents of the specified buffer. If
+a named buffer is specified using a capital, the newly cut text is
+appended to the buffer instead of overwriting it. When using the tt("_)
+buffer, nothing happens. This can be useful for deleting text without
+affecting the normal registers.
+
+If no buffer is specified for a cut or change command, tt("1) is used, and
+the contents of tt("1) to tt("8) are each shifted along one buffer;
+the contents of tt("9) is lost. If no buffer is specified for a yank
+command, tt("0") is used. Finally, a paste command without a specified
+buffer will paste the text from the most recent command regardless of any
+buffer that might have been used with that command.
+
+When called from a widget function by the tt(zle) command, the buffer
+can optionally be specified with an argument. For example,
+
+example(zle vi-set-buffer A)
 )
 tindex(vi-set-mark)
 item(tt(vi-set-mark) (unbound) (m) (unbound))(
diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h
index 860c821..dd6cdcc 100644
--- a/Src/Zle/zle.h
+++ b/Src/Zle/zle.h
@@ -240,6 +240,7 @@ struct modifier {
 #define MOD_VIBUF (1<<2)   /* a vi cut buffer has been selected */
 #define MOD_VIAPP (1<<3)   /* appending to the vi cut buffer */
 #define MOD_NEG   (1<<4)   /* last command was negate argument */
+#define MOD_NULL  (1<<5)   /* throw away text for the vi cut buffer */
 
 /* current modifier status */
 
diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c
index f69bc77..46d5373 100644
--- a/Src/Zle/zle_utils.c
+++ b/Src/Zle/zle_utils.c
@@ -914,7 +914,7 @@ cut(int i, int ct, int flags)
 void
 cuttext(ZLE_STRING_T line, int ct, int flags)
 {
-    if (!ct)
+    if (!ct || zmod.flags & MOD_NULL)
 	return;
 
     UNMETACHECK();
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c
index 2555c6a..20cece0 100644
--- a/Src/Zle/zle_vi.c
+++ b/Src/Zle/zle_vi.c
@@ -782,7 +782,7 @@ viputbefore(UNUSED(char **args))
     int n = zmult;
 
     startvichange(-1);
-    if (n < 0)
+    if (n < 0 || zmod.flags & MOD_NULL)
 	return 1;
     if (zmod.flags & MOD_VIBUF)
 	buf = &vibuf[zmod.vibuf];
@@ -814,7 +814,7 @@ viputafter(UNUSED(char **args))
     int n = zmult;
 
     startvichange(-1);
-    if (n < 0)
+    if (n < 0 || zmod.flags & MOD_NULL)
 	return 1;
     if (zmod.flags & MOD_VIBUF)
 	buf = &vibuf[zmod.vibuf];
@@ -905,14 +905,26 @@ vicapslockpanic(UNUSED(char **args))
 
 /**/
 int
-visetbuffer(UNUSED(char **args))
+visetbuffer(char **args)
 {
     ZLE_INT_T ch;
 
-    if ((zmod.flags & MOD_VIBUF) ||
-	(((ch = getfullchar(0)) < ZWC('0') || ch > ZWC('9')) &&
+    if (*args) {
+	ch = **args;
+	if (args[1] || (ch && (*args)[1]))
+	    return 1;
+    } else {
+	ch = getfullchar(0);
+    }
+    if (ch == ZWC('_')) {
+	zmod.flags |= MOD_NULL;
+	prefixflag = 1;
+	return 0;
+    } else
+	zmod.flags &= ~MOD_NULL;
+    if ((ch < ZWC('0') || ch > ZWC('9')) &&
 	 (ch < ZWC('a') || ch > ZWC('z')) &&
-	 (ch < ZWC('A') || ch > ZWC('Z'))))
+	 (ch < ZWC('A') || ch > ZWC('Z')))
 	return 1;
     if (ch >= ZWC('A') && ch <= ZWC('Z'))	/* needed in cut() */
 	zmod.flags |= MOD_VIAPP;
diff --git a/Test/X02zlevi.ztst b/Test/X02zlevi.ztst
index 19188df..507107e 100644
--- a/Test/X02zlevi.ztst
+++ b/Test/X02zlevi.ztst
@@ -10,6 +10,66 @@
 
 %test
 
+  zletest $'yankee doodle\ebhDyy0"1P'
+0:paste register 1 to get last deletion
+>BUFFER:  doodleyankee
+>CURSOR: 6
+
+  zletest $'yankee\eyyodoodle\edd"0p'
+0:paste register 0 to get last yank
+>BUFFER: yankee
+>yankee
+>CURSOR: 7
+
+  zletest $'err\eddahello\e"hddP'
+0:setting named register also sets unnamed register
+>BUFFER: hello
+>CURSOR: 0
+
+  zletest $'first\e"ay0ddasecond\e"Add"aP'
+0:appending to named register
+>BUFFER: firs
+>second
+>CURSOR: 0
+
+  zletest $'word\e"a"byy"bp'
+0:set one and then a different register
+>BUFFER: word
+>word
+>CURSOR: 5
+
+  zletest $'i\exaar\e0"a"_cewn\eP'
+0:set register then set black hole register
+>BUFFER: win
+>CURSOR: 1
+
+  zletest $'double\eyy"_"0P'
+0:reset register after selecting black hole
+>BUFFER: double
+>double
+>CURSOR: 0
+
+# zsh works like vi here; in vim you get the concatenated string
+  zletest $'first\e"addasecond\eddP'
+0:retrieve unnamed register after appending
+>BUFFER: second
+>CURSOR: 0
+
+  zletest $'Z\exayankee doodle\e"_db0"_yeP'
+0:yank and delete to black hole register
+>BUFFER: Zyankee e
+>CURSOR: 0
+
+  zletest $'foo\eddabar\e"_p..'
+0:paste from black hole register and repeat
+>BUFFER: bar
+>CURSOR: 2
+
+  zletest $'start\eFa"ac2lnew\eX"ap..'
+0:repeat paste from named register
+>BUFFER: stnwararart
+>CURSOR: 9
+
   zletest $'word\euaend'
 0:undo initial change
 >BUFFER: end


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

end of thread, other threads:[~2014-10-23 19:32 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-10-21 14:32 bug report: vi mode yank should yank to 0 register Gábor Márton
2014-10-22 10:24 ` Oliver Kiddle
2014-10-22 10:32   ` Peter Stephenson
2014-10-22 12:25     ` Oliver Kiddle
2014-10-22 22:06   ` PATCH: " Oliver Kiddle
2014-10-22 22:44     ` Oliver Kiddle
2014-10-22 23:03     ` Oliver Kiddle
2014-10-23 19:25     ` Oliver Kiddle

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