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