1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-01-01 05:16:05 +01:00

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

in widgets using forward-word-match
This commit is contained in:
Peter Stephenson 2012-06-04 16:40:42 +00:00
parent 07933936f3
commit 5b32dece55
4 changed files with 101 additions and 76 deletions

View file

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

View file

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

View file

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

View file

@ -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
else
REPLY=$1
fi
detail=
detail=
case $REPLY in
([bB]*)
# bash style
wordstyle=standard
zstyle ':zle:*' word-chars ''
;;
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"
;;
([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
;;
([sS]*)
# shell command arguments or special tokens
wordstyle=shell
zstyle ':zle:*' skip-whitespace-first false
;;
([wW]*)
# whitespace-delimited
wordstyle=space
;;
([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
;;
(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
;;
(q*)
# quit without setting
return 1
;;
(*)
detail="\
(*)
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
return
continue
;;
esac
if [[ -n $wordstyle ]]; then
if [[ $REPLY = [[:upper:]]* ]]; then
wordstyle+=-subword
fi
zstyle ':zle:*' word-style $wordstyle
fi
return
done