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