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:
parent
07933936f3
commit
5b32dece55
4 changed files with 101 additions and 76 deletions
|
@ -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
|
||||
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue