about summary refs log tree commit diff
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:]]##'