users/17132: skip-whitespace-first style for compatibility with bash etc.

in widgets using forward-word-match
interrupt_abort
Peter Stephenson 12 years ago
parent 07933936f3
commit 5b32dece55

@ -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 $
*****************************************************

@ -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):

@ -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

@ -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

Loading…
Cancel
Save