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

PATCH: zstyle -L with arguments



I finally got fed up with having to use grep to get the values of styles
when I ran across one with a multiple-line "eval"-style argument.

The way the first argument of zstyle is a pattern and the second
argument a style name seems pretty much inevitable, but it's a bit
clumsy that the pattern has to match a string that's itself going to be
tested as a pattern.  The alternative would be to it the other way
around and output styles that match in a given context, making the test
the same as for normal style lookup; however, I don't think that's
actually as useful for listing.  It makes it hard to list every context
in which a style is set, for example, which is a natural thing to want
to do.

Probably _zstyle needs tweaking but I haven't looked at it.

Index: Doc/Zsh/mod_zutil.yo
===================================================================
RCS file: /cvsroot/zsh/zsh/Doc/Zsh/mod_zutil.yo,v
retrieving revision 1.17
diff -u -r1.17 mod_zutil.yo
--- Doc/Zsh/mod_zutil.yo	24 Apr 2005 18:38:04 -0000	1.17
+++ Doc/Zsh/mod_zutil.yo	15 Aug 2006 14:18:44 -0000
@@ -7,7 +7,7 @@
 
 startitem()
 findex(zstyle)
-xitem(tt(zstyle) [ tt(-L) ])
+xitem(tt(zstyle) [ tt(-L) [ var(pattern) [ var(style) ] ] ])
 xitem(tt(zstyle) [ tt(-e) | tt(-) | tt(-)tt(-) ] var(pattern) var(style) var(strings) ...)
 xitem(tt(zstyle -d) [ var(pattern) [ var(styles) ... ] ])
 xitem(tt(zstyle -g) var(name) [ var(pattern) [ var(style) ] ])
@@ -31,8 +31,18 @@
 `tt(*)'.
 
 The first form (without arguments) lists the definitions in the order
-tt(zstyle) will test them. If the tt(-L) option is given, listing is
-done in the form of calls to tt(zstyle).  Forms with arguments:
+tt(zstyle) will test them.
+
+If the tt(-L) option is given, listing is done in the form of calls to
+tt(zstyle).  The optional first argument is a pattern which will be matched
+against the string supplied as the pattern for the context; note that
+this means, for example, `tt(zstyle -L ":completion:*")' will
+match any supplied pattern beginning `tt(:completion:)', not
+just tt(":completion:*"):  use tt(":completion:\*") to match that.
+The optional second argument limits the output to a specific style (not a
+pattern).  tt(-L) is not compatible with any other options.
+
+The other forms are the following:
 
 startitem()
 item(tt(zstyle) [ tt(-) | tt(-)tt(-) | tt(-e) ] var(pattern) var(style) var(strings) ...)(
Index: Src/Modules/zutil.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Modules/zutil.c,v
retrieving revision 1.17
diff -u -r1.17 zutil.c
--- Src/Modules/zutil.c	30 May 2006 22:35:03 -0000	1.17
+++ Src/Modules/zutil.c	15 Aug 2006 14:18:52 -0000
@@ -268,9 +268,10 @@
 		zwarnnam(nam, "invalid argument: %s", args[0]);
 		return 1;
 	    }
-	    if (oc == 'L')
+	    if (oc == 'L') {
 		list = 2;
-	    else if (oc == 'e') {
+		args++;
+	    } else if (oc == 'e') {
 		eval = add = 1;
 		args++;
 	    }
@@ -305,13 +306,44 @@
 	Style s;
 	Stypat p;
 	char **v;
+	char *context, *stylename;
+	Patprog contprog;
+
+	switch (arrlen(args)) {
+	case 2:
+	    context = args[0];
+	    stylename = args[1];
+	    break;
+
+	case 1:
+	    context = args[0];
+	    stylename = NULL;
+	    break;
+
+	case 0:
+	    context = stylename = NULL;
+	    break;
+
+	default:
+	    zwarnnam(nam, "too many arguments");
+	    return 1;
+	}
+	if (context) {
+	    tokenize(context);
+	    contprog = patcompile(context, PAT_STATIC, NULL);
+	} else
+	    contprog = NULL;
 
 	for (s = zstyles; s; s = s->next) {
 	    if (list == 1) {
 		quotedzputs(s->name, stdout);
 		putchar('\n');
 	    }
+	    if (stylename && strcmp(s->name, stylename) != 0)
+		continue;
 	    for (p = s->pats; p; p = p->next) {
+		if (contprog && !pattry(contprog, p->pat))
+		    continue;
 		if (list == 1)
 		    printf("%s  %s", (p->eval ? "(eval)" : "      "), p->pat);
 		else {

-- 
Peter Stephenson <pws@xxxxxxx>                  Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK                          Tel: +44 (0)1223 692070


To access the latest news from CSR copy this link into a web browser:  http://www.csr.com/email_sig.php



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