diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | Doc/Zsh/contrib.yo | 10 | ||||
-rw-r--r-- | Functions/Zle/forward-word-match | 36 | ||||
-rw-r--r-- | Functions/Zle/select-word-style | 138 |
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 |