1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-23 16:40:24 +02: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

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