From 916ba78cd7c30800e7025bb91e735e27320fff29 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sat, 3 Nov 2018 19:36:06 +0000 Subject: 43752: Fix _expand quoting. Quoting was not applied properly if globbing failed or was not applied. --- ChangeLog | 5 +++++ Completion/Base/Completer/_expand | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index c315d0f5b..1dfcb58f9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2018-11-03 Peter Stephenson + + * 43752: Completion/Base/Completer/_expand: Fix quoting if + globbing failed / was not tried for expression on command line. + 2018-11-02 Oliver Kiddle * 43748: Completion/Unix/Command/_ack: fix for ack 3beta diff --git a/Completion/Base/Completer/_expand b/Completion/Base/Completer/_expand index ee3681bad..f4909826a 100644 --- a/Completion/Base/Completer/_expand +++ b/Completion/Base/Completer/_expand @@ -103,9 +103,19 @@ subd=("$exp[@]") # Now try globbing. -[[ "$force" = *g* ]] || zstyle -T ":completion:${curcontext}:" glob && - eval 'exp=( ${~exp//(#b)\\([ \"'"\'"' +# We need to come out of this with consistent quoting, by hook or by crook. +integer done_quote +local orig_exp=$exp +if [[ "$force" = *g* ]] || zstyle -T ":completion:${curcontext}:" glob; then + eval 'exp=( ${~exp//(#b)\\([ \"'"\'"' +])/$match[1]} ); exp=( ${(q)exp} )' 2>/dev/null && done_quote=1 +fi +# If the globbing failed, or we didn't try globbing, we'll do +# it again without the "~" so globbing is simply omitted. +if (( ! done_quote )); then + eval 'exp=( ${orig_exp//(#b)\\([ \"'"\'"' ])/$match[1]} ); exp=( ${(q)exp} )' 2>/dev/null +fi ### Don't remember why we once used this instead of the (q) above. # eval 'exp=( ${~exp} ); exp=( ${exp//(#b)([][()|*?^#~<>\\=])/\\${match[1]}} )' 2>/dev/null -- cgit 1.4.1