summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--Functions/Zle/match-words-by-style22
2 files changed, 23 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 464d4f1dc..169990433 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2004-12-09 Peter Stephenson <pws@csr.com>
+ * 20613: Functions/Zle/match-words-by-style: fix inconsistencies
+ with embedded whitespace when matching by shell words.
+
* 20612: Doc/Zsh/contrib.yo, Functions/Zle/match-words-by-style:
options to match-words-by-style can override styles.
diff --git a/Functions/Zle/match-words-by-style b/Functions/Zle/match-words-by-style
index 9d637a587..277fe058f 100644
--- a/Functions/Zle/match-words-by-style
+++ b/Functions/Zle/match-words-by-style
@@ -69,13 +69,13 @@ setopt extendedglob
local wordstyle spacepat wordpat1 wordpat2 opt charskip wordchars wordclass
local match mbegin mend pat1 pat2 word1 word2 ws1 ws2 ws3 skip
-local MATCH MBEGIN MEND
+local nwords MATCH MBEGIN MEND
if [[ -z $curcontext ]]; then
local curcontext=:zle:match-words-by-style
fi
-while getopts "w:s:c:C:" opt; do
+while getopts "w:s:c:C:tT" opt; do
case $opt in
(w)
wordstyle=$OPTARG
@@ -107,6 +107,7 @@ case $wordstyle in
(shell) local bufwords
# This splits the line into words as the shell understands them.
bufwords=(${(z)LBUFFER})
+ nwords=${#bufwords}
# Work around bug: if stripping quotes failed, a bogus
# space is appended. Not a good test, since this may
# be a quoted space, but it's hard to get right.
@@ -129,6 +130,23 @@ case $wordstyle in
wordpat2="${(q)wordpat2}"
fi
spacepat='[[:space:]]#'
+
+ # Assume the words are at the top level, i.e. if we are inside
+ # 'something with spaces' then we need to ignore the embedded
+ # spaces and consider the whole word.
+ bufwords=(${(z)BUFFER})
+ if (( ${#bufwords[$nwords]} > ${#wordpat1} )); then
+ # Yes, we're in the middle of a shell word.
+ # Find out what's in front.
+ eval pat1='${LBUFFER%%(#b)('${wordpat1}')('${spacepat}')}'
+ # Now everything from ${#pat1}+1 is wordy
+ wordpat1=${(q)LBUFFER[${#pat1}+1,-1]}
+
+ # Likewise at the end...
+ eval pat2='${RBUFFER##(#b)('${charskip}${spacepat}')('\
+${wordpat2}')('${spacepat}')}'
+ wordpat2=${(q)RBUFFER[1,-1-${#pat2}]}
+ fi
;;
(*space) spacepat='[[:space:]]#'
wordpat1='[^[:space:]]##'