zsh-workers
 help / color / mirror / code / Atom feed
* [PATCH] computil: Fix inconsistent handling of slash-escaped option names
@ 2018-12-21  9:41 dana
  2018-12-31 16:25 ` dana
  0 siblings, 1 reply; 2+ messages in thread
From: dana @ 2018-12-21  9:41 UTC (permalink / raw)
  To: Zsh workers

When writing option specs, you're supposed to be able to escape characters in
the option name that are special to the syntax; as the manual says:

>It is possible for options with a literal ‘+’ or ‘=’ to appear, but that
>character must be quoted, for example ‘-\+’.

This sort of works, but not entirely. It does make the name valid, and the
option does appear correctly as a possibility, but because the slashes are
only skipped when parsing, not actually removed from the final name, the
completion system gets confused when you actually use it. For example:

  % _foo() { _arguments -s : '-\+' -a -b }
  % compdef _foo foo
  % foo -+<TAB>

Because of the -s, it should try to complete -a or -b in the same word.
Instead, it starts a new word, and it behaves as if -+ hasn't been used yet.

Unless i'm missing something, this seems to fix it...

dana


diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c
index cb1c01042..a98574379 100644
--- a/Src/Zle/computil.c
+++ b/Src/Zle/computil.c
@@ -1409,7 +1409,7 @@ parse_cadef(char *nam, char **args)
 		     (*p != '=' ||
 		      (p[1] != ':' && p[1] != '[' && p[1] != '-')); p++)
 		if (*p == '\\' && p[1])
-		    p++;
+		    chuck(p);
 
 	    /* The character after the option name specifies the type. */
 	    c = *p;
@@ -1527,7 +1527,7 @@ parse_cadef(char *nam, char **args)
 
 	    opt->next = NULL;
 	    opt->gsname = doset;
-	    opt->name = ztrdup(rembslashcolon(name));
+	    opt->name = ztrdup(name);
 	    if (descr)
 		opt->descr = ztrdup(descr);
 	    else if (adpre && oargs && !oargs->next) {
diff --git a/Test/Y03arguments.ztst b/Test/Y03arguments.ztst
index fa4589374..ec9fd9e8a 100644
--- a/Test/Y03arguments.ztst
+++ b/Test/Y03arguments.ztst
@@ -78,11 +78,17 @@
 >line: {tst rest arg2 }{}
 >line: {tst rest arg2 rest }{}
 
- tst_arguments '-\+[opt]'
+ tst_arguments -s : '-\+[opt1]' '-a[opt2]' '-b[opt3]'
  comptest $'tst -\C-d'
-0:-+
+ comptest $'tst -+\C-d'
+0:slash-escaped option name (-+)
 >DESCRIPTION:{option}
->NO:{-+  -- opt}
+>NO:{-+  -- opt1}
+>NO:{-a  -- opt2}
+>NO:{-b  -- opt3}
+>DESCRIPTION:{option}
+>NO:{-a  -- opt2}
+>NO:{-b  -- opt3}
 
  tst_arguments -+o
  comptest $'tst -\t\t\t\C-w\C-w+\t\t\t'


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

end of thread, other threads:[~2018-12-31 16:23 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-21  9:41 [PATCH] computil: Fix inconsistent handling of slash-escaped option names dana
2018-12-31 16:25 ` dana

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