From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27710 invoked by alias); 2 Oct 2014 05:20:26 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 33320 Received: (qmail 25240 invoked from network); 2 Oct 2014 05:20:25 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 From: Bart Schaefer Message-id: <141001222031.ZM11273@torch.brasslantern.com> Date: Wed, 01 Oct 2014 22:20:31 -0700 In-reply-to: <141001181118.ZM6305@torch.brasslantern.com> Comments: In reply to Bart Schaefer "Re: _expand_alias does not expand aliases that contain an "!"" (Oct 1, 6:11pm) References: <140830133206.ZM13172@torch.brasslantern.com> <140831135017.ZM739@torch.brasslantern.com> <140914113029.ZM31296@torch.brasslantern.com> <140914135552.ZM31608@torch.brasslantern.com> <20141001150324.1cdad6c9@pwslap01u.europe.root.pri> <20141001150641.02e52281@pwslap01u.europe.root.pri> <20141001151501.2eac05ef@pwslap01u.europe.root.pri> <141001092934.ZM5952@torch.brasslantern.com> <20141001173917.295076d6@pwslap01u.europe.root.pri> <141001181118.ZM6305@torch.brasslantern.com> X-Mailer: OpenZMail Classic (0.9.2 24April2005) To: zsh-workers@zsh.org Subject: Re: _expand_alias does not expand aliases that contain an "!" MIME-version: 1.0 Content-type: text/plain; charset=us-ascii On Oct 1, 6:11pm, Bart Schaefer wrote: } Subject: Re: _expand_alias does not expand aliases that contain an "!" } } On Oct 1, 5:39pm, Peter Stephenson wrote: } } Subject: Re: _expand_alias does not expand aliases that contain an "!" } } } } > new makebangspecial() can be called from histcharsetfn() instead of } } > doing a full inittyptab(). } } } } That certainly sounds possible, if you know where to put those calls. } } } } Here's the other proposal, done entirely local to inittyptab(), and } } untested. } } This looks fine, though it doesn't solve the problem of needing to turn } off special-ness during completion. } } Let me see if I can produce a patch for this (and back out the changes } to _expand_alias) before you do 5.0.7. OK, here's that patch. This starts with PWS's patch from 33311, merges the semantics of specialcomma into typtab_flags (which sadly becomes global to replace specialcomma) and adds makebangspecial(yesno), which is then used in the smallest sensible scope in compcall(). There may be other places where makebangspecial() should be called, but I don't think it's correct to blanket docompletion() with it the way makecommaspecial() is used. In fact that makecommaspecial() scope may be too wide leading to other bugs, but I'm not going to mess with that at this point. Also add signal safety for inittyptab(), since we're munging globals. All tests pass and the 'gc!' alias expansion from the original thread now works as expected. diff --git a/Completion/Base/Completer/_expand_alias b/Completion/Base/Completer/_expand_alias index 9064ce8..8240e41 100644 --- a/Completion/Base/Completer/_expand_alias +++ b/Completion/Base/Completer/_expand_alias @@ -25,8 +25,6 @@ else pre=(_main_complete - aliases) fi -[[ "$compstate[quoting]" = (single|double) ]] || word="${(Q)word}" - zstyle -s ":completion:${curcontext}:" regular tmp || tmp=yes case $tmp in always) sel=r;; diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c index ac7785a..35d410c 100644 --- a/Src/Zle/compcore.c +++ b/Src/Zle/compcore.c @@ -702,6 +702,7 @@ callcompfunc(char *s, char *fn) } zsfree(compprefix); zsfree(compsuffix); + makebangspecial(0); if (unset(COMPLETEINWORD)) { tmp = (linwhat == IN_MATH ? dupstring(s) : multiquote(s, 0)); untokenize(tmp); @@ -722,6 +723,7 @@ callcompfunc(char *s, char *fn) untokenize(ss); compsuffix = ztrdup(ss); } + makebangspecial(1); zsfree(complastprefix); zsfree(complastsuffix); complastprefix = ztrdup(compprefix); diff --git a/Src/utils.c b/Src/utils.c index 9109f66..e6eb8e6 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -3424,12 +3424,12 @@ equalsplit(char *s, char **t) return 0; } -static int specialcomma; /* the ztypes table */ /**/ mod_export short int typtab[256]; +static int typtab_flags = 0; /* initialize the ztypes table */ @@ -3440,8 +3440,15 @@ inittyptab(void) int t0; char *s; - for (t0 = 0; t0 != 256; t0++) - typtab[t0] = 0; + if (!(typtab_flags & ZTF_INIT)) { + typtab_flags = ZTF_INIT; + if (interact && isset(SHINSTDIN)) + typtab_flags |= ZTF_INTERACT; + } + + queue_signals(); + + memset(typtab, 0, sizeof(typtab)); for (t0 = 0; t0 != 32; t0++) typtab[t0] = typtab[t0 + 128] = ICNTRL; typtab[127] = ICNTRL; @@ -3514,20 +3521,43 @@ inittyptab(void) #endif for (s = SPECCHARS; *s; s++) typtab[STOUC(*s)] |= ISPECIAL; - if (specialcomma) + if (typtab_flags & ZTF_SP_COMMA) typtab[STOUC(',')] |= ISPECIAL; - if (isset(BANGHIST) && bangchar && interact && isset(SHINSTDIN)) + if (isset(BANGHIST) && bangchar && (typtab_flags & ZTF_INTERACT)) { + typtab_flags |= ZTF_BANGCHAR; typtab[bangchar] |= ISPECIAL; + } else + typtab_flags &= ~ZTF_BANGCHAR; + + unqueue_signals(); } /**/ mod_export void makecommaspecial(int yesno) { - if ((specialcomma = yesno) != 0) + if (yesno != 0) { + typtab_flags |= ZTF_SP_COMMA; typtab[STOUC(',')] |= ISPECIAL; - else + } else { + typtab_flags &= ~ZTF_SP_COMMA; typtab[STOUC(',')] &= ~ISPECIAL; + } +} + +/**/ +mod_export void +makebangspecial(int yesno) +{ + /* Name and call signature for congruence with makecommaspecial(), + * but in this case when yesno is nonzero we defer to the state + * saved by inittyptab(). + */ + if (yesno == 0) { + typtab[bangchar] &= ~ISPECIAL; + } else if (typtab_flags & ZTF_BANGCHAR) { + typtab[bangchar] |= ISPECIAL; + } } diff --git a/Src/ztype.h b/Src/ztype.h index 14f6610..eef0f23 100644 --- a/Src/ztype.h +++ b/Src/ztype.h @@ -59,6 +59,15 @@ #define iwsep(X) zistype(X,IWSEP) #define inull(X) zistype(X,INULL) +/* + * Bit flags for typtab_flags --- preserved after + * shell initialisation. + */ +#define ZTF_INIT (0x0001) /* One-off initialisation done */ +#define ZTF_INTERACT (0x0002) /* Shell interative and reading from stdin */ +#define ZTF_SP_COMMA (0x0004) /* Treat comma as a special characters */ +#define ZTF_BANGCHAR (0x0008) /* Treat bangchar as a special character */ + #ifdef MULTIBYTE_SUPPORT #define WC_ZISTYPE(X,Y) wcsitype((X),(Y)) #define WC_ISPRINT(X) iswprint(X) -- Barton E. Schaefer