summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--Doc/Zsh/contrib.yo10
-rw-r--r--Functions/Zle/forward-word-match36
-rw-r--r--Functions/Zle/select-word-style138
4 files changed, 109 insertions, 84 deletions
diff --git a/ChangeLog b/ChangeLog
index dd08328b1..bf37eba3a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-06-04  Peter Stephenson  <p.w.stephenson@ntlworld.com>
+
+	* users/17132: Doc/Zsh/contrib.yo,
+	Functions/Zle/forward-word-match,
+	Functions/Zle/select-word-style: skip-whitespace-first style for
+	compatibility with bash and other editors in forward-word.
+
 2012-05-31  Peter Stephenson  <pws@csr.com>
 
 	* Foudil Brétel: 30495: Completion/Unix/Command/_systemd (also
@@ -16333,5 +16340,5 @@
 
 *****************************************************
 * This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.5661 $
+* $Revision: 1.5662 $
 *****************************************************
diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo
index ea96d5dbc..139a68150 100644
--- a/Doc/Zsh/contrib.yo
+++ b/Doc/Zsh/contrib.yo
@@ -1734,6 +1734,16 @@ context is examined and if it contains the string tt(back), the word before
 the cursor is considered, else the word after cursor is considered. Some
 examples are given below.
 
+The style tt(skip-whitespace-first) is only used with the
+tt(forward-word) widget.  If it is set to true, then tt(forward-word)
+skips any non-word-characters, followed by any non-word-characters:
+this is similar to the behaviour of other word-orientated widgets,
+and also that used by other editors, however it differs from the
+standard zsh behaviour.  When using tt(select-word-style) the widget
+is set in the context tt(:zle:*) to tt(true) if the word style is
+tt(bash) and tt(false) otherwise.  It may be overridden by setting it in
+the more specific context tt(:zle:forward-word*).
+
 Here are some examples of use of the styles, actually taken from the
 simplified interface in tt(select-word-style):
 
diff --git a/Functions/Zle/forward-word-match b/Functions/Zle/forward-word-match
index 50e18cbde..e5b5ef3a6 100644
--- a/Functions/Zle/forward-word-match
+++ b/Functions/Zle/forward-word-match
@@ -8,32 +8,36 @@ local -a matched_words
 integer count=${NUMERIC:-1}
 
 if (( count < 0 )); then
-    (( NUMERIC = -count ))
-    zle ${WIDGET/forward/backward}
-    return
+  (( NUMERIC = -count ))
+  zle ${WIDGET/forward/backward}
+  return
 fi
 
 while (( count-- )); do
-
-    match-words-by-style
-
+  match-words-by-style
+ 
+  if zstyle -t $curcontext skip-whitespace-first; then
+    # Standard non-zsh behaviour: skip leading whitespace and the word.
+    word=$matched_words[4]$matched_words[5]
+  else
+    # Traditional zsh behaviour.
     # For some reason forward-word doesn't work like the other word
     # commands; it skips whitespace only after any matched word
     # characters.
-
     if [[ -n $matched_words[4] ]]; then
-        # just skip the whitespace
-	word=$matched_words[4]
+      # just skip the whitespace
+      word=$matched_words[4]
     else
-        # skip the word and trailing whitespace
-	word=$matched_words[5]$matched_words[6]
+      # skip the word and trailing whitespace
+      word=$matched_words[5]$matched_words[6]
     fi
+  fi
 
-    if [[ -n $word ]]; then
-	(( CURSOR += ${#word} ))
-    else
-	return 1
-    fi
+  if [[ -n $word ]]; then
+    (( CURSOR += ${#word} ))
+  else
+    return 1
+  fi
 done
 
 return 0
diff --git a/Functions/Zle/select-word-style b/Functions/Zle/select-word-style
index 95d2e4446..1e472229c 100644
--- a/Functions/Zle/select-word-style
+++ b/Functions/Zle/select-word-style
@@ -4,71 +4,75 @@ setopt extendedglob
 local -a word_functions
 
 word_functions=(backward-kill-word backward-word
-    capitalize-word down-case-word
-    forward-word kill-word
-    transpose-words up-case-word)
+  capitalize-word down-case-word
+  forward-word kill-word
+  transpose-words up-case-word)
 
 [[ -z $1 ]] && autoload -Uz read-from-minibuffer
 
-local REPLY detail f wordstyle
+local REPLY detail f wordstyle teststyle
 
 if ! zle -l $word_functions[1]; then
-    for f in $word_functions; do
-	autoload -Uz $f-match
-	zle -N $f $f-match
-    done
+  for f in $word_functions; do
+    autoload -Uz $f-match
+    zle -N $f $f-match
+  done
 fi
 
 
 while true; do
-
-    if [[ -n $WIDGET && -z $1 ]]; then
-	read-from-minibuffer -k1 "Word styles (hit return for more detail):
+  if [[ -n $WIDGET && -z $1 ]]; then
+    read-from-minibuffer -k1 "Word styles (hit return for more detail):
 (b)ash (n)ormal (s)hell (w)hitespace (d)efault (q)uit
 (B), (N), (S), (W) as above with subword matching
 ${detail}? " || return 1
-    else
-	REPLY=$1
-    fi
-
-    detail=
-
-    case $REPLY in
-	([bB]*)
-	# bash style
-	wordstyle=standard
-	zstyle ':zle:*' word-chars ''
-	;;
-
-	([nN]*)
-	# normal zsh style
-	wordstyle=standard
-	zstyle ':zle:*' word-chars "$WORDCHARS"
-	;;
-
-	([sS]*)
-	# shell command arguments or special tokens
-	wordstyle=shell
-	;;
-
-	([wW]*)
-	# whitespace-delimited
-	wordstyle=space
-	;;
-
-	(d*)
-	# default: could also return widgets to builtins here
-	wordstyle=
-	zstyle -d ':zle:*' word-chars
-	;;
-
-	(q*)
-	# quit without setting
-	return 1
-	;;
-
-	(*)
-	detail="\
+  else
+    REPLY=$1
+  fi
+
+  detail=
+
+  case $REPLY in
+    ([bB]*)
+    # bash style
+    wordstyle=standard
+    zstyle ':zle:*' word-chars ''
+    zstyle ':zle:*' skip-whitespace-first true
+    ;;
+
+    ([nN]*)
+    # normal zsh style
+    wordstyle=standard
+    zstyle ':zle:*' word-chars "$WORDCHARS"
+    zstyle ':zle:*' skip-whitespace-first false
+    ;;
+
+    ([sS]*)
+    # shell command arguments or special tokens
+    wordstyle=shell
+    zstyle ':zle:*' skip-whitespace-first false
+    ;;
+
+    ([wW]*)
+    # whitespace-delimited
+    wordstyle=space
+    zstyle ':zle:*' skip-whitespace-first false
+    ;;
+
+    (d*)
+    # default: could also return widgets to builtins here
+    wordstyle=
+    zstyle -d ':zle:*' word-chars
+    zstyle -d ':zle:*' skip-whitespace-first
+    ;;
+
+    (q*)
+    # quit without setting
+    return 1
+    ;;
+
+    (*)
+    detail="\
 (b)ash:       Word characters are alphanumerics only
 (n)ormal:     Word characters are alphanumerics plus \$WORDCHARS
 (s)hell:      Words are command arguments using shell syntax
@@ -76,21 +80,21 @@ ${detail}? " || return 1
 (d)efault:    Use default, no special handling (usually same as \`n')
 (q)uit:       Quit without setting a new style
 "
-	if [[ -z $WIDGET || -n $1 ]]; then
-	    print "Usage: $0 word-style
+    if [[ -z $WIDGET || -n $1 ]]; then
+      print "Usage: $0 word-style
 where word-style is one of the characters in parentheses:
 $detail" >&2
-	    return 1
-	fi
-	continue
-	;;
-    esac
-
-    if [[ -n $wordstyle ]]; then
-      if [[ $REPLY = [[:upper:]]* ]]; then
-	wordstyle+=-subword
-      fi
-      zstyle ':zle:*' word-style $wordstyle
+      return 1
+    fi
+    continue
+    ;;
+  esac
+
+  if [[ -n $wordstyle ]]; then
+    if [[ $REPLY = [[:upper:]]* ]]; then
+      wordstyle+=-subword
     fi
-    return
+    zstyle ':zle:*' word-style $wordstyle
+  fi
+  return
 done