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

38957: make use of updates to match-words-by-style and better support completion of word-style styles for zstyle

This commit is contained in:
Oliver Kiddle 2016-07-28 16:16:25 +02:00
parent 54d5f8e363
commit b816bb42cf
4 changed files with 38 additions and 31 deletions

View file

@ -1,5 +1,10 @@
2016-07-28 Oliver Kiddle <opk@zsh.org>
* 38957: Functions/Zle/select-word-match,
Completion/Zsh/Command/_zstyle, Doc/Zsh/contrib.yo:
make use of updates to match-words-by-style and better support
completion of word-style styles for zstyle
* 38956: Completion/Zsh/Command/_bindkey,
Completion/Zsh/Command/_vared, Completion/Zsh/Command/_zle,
Completion/Zsh/Function/_add-zle-hook-widget,

View file

@ -173,6 +173,7 @@ styles=(
url-seps e:
whence e:
word-chars e:
word-class e:
word-style e:word-style
word-context e:
@ -241,11 +242,13 @@ while (( $#state )); do
case "$state[1]" in
(contexts)
if [[ ! -prefix :*: ]]; then
_wanted contexts expl context compadd -P : -qS : completion vcs_info zftp
_wanted contexts expl context compadd -P : -qS : chpwd completion vcs_info zftp zle
elif compset -P :completion:; then
contexts=( functions _completers cmdorcont argument tag )
elif compset -P :vcs_info:; then
contexts=( vcs-string user-context repo-root-name )
elif compset -P :zle:; then
_wanted widgets expl widget _widgets -qS :
fi
if (( $#contexts )); then
for ostate in $contexts; do
@ -521,7 +524,7 @@ while (( $#state )); do
;;
(word-style)
_wanted word-styles expl 'word style' compadd normal shell space
_wanted word-styles expl 'word style' compadd {normal,specified,unspecified,shell,whitespace}-subword
;;
(vcs-string)

View file

@ -2105,7 +2105,7 @@ Here are some examples of use of the tt(word-context) style to extend
the context.
example(zstyle ':zle:*' word-context \
"*/*" file "[[:space:]]" whitespace
"*/*" filename "[[:space:]]" whitespace
zstyle ':zle:transpose-words:whitespace' word-style shell
zstyle ':zle:transpose-words:filename' word-style normal
zstyle ':zle:transpose-words:filename' word-chars '')

View file

@ -12,7 +12,7 @@ emulate -L zsh
setopt extendedglob
local curcontext=:zle:$WIDGET
local -a matched_words
local -A matched_words
# Start and end of range of characters
integer pos1 pos2 num=${NUMERIC:-1}
local style word
@ -28,10 +28,10 @@ while (( num-- )); do
if (( MARK > CURSOR )); then
# if cursor is at the start of the selection, just move back a word
match-words-by-style
if [[ $style = i && -n $matched_words[3] ]]; then
word=$matched_words[3]
if [[ $style = i && -n $matched_words[ws-before-cursor] ]]; then
word=$matched_words[ws-before-cursor]
else
word=$matched_words[2]$matched_words[3]
word=$matched_words[word-before-cursor]$matched_words[ws-before-cursor]
fi
if [[ -n $word ]]; then
(( CURSOR -= ${#word} ))
@ -43,41 +43,40 @@ while (( num-- )); do
(( CURSOR+1 == $#BUFFER )) && return 1
(( CURSOR++ ))
match-words-by-style
if [[ -n $matched_words[4] ]]; then
if [[ -n $matched_words[ws-after-cursor] ]]; then
if [[ $style = i ]]; then
# just skip the whitespace
word=$matched_words[4]
word=$matched_words[ws-after-cursor]
else
# skip the whitespace plus word
word=$matched_words[4]$matched_words[5]
word=$matched_words[ws-after-cursor]$matched_words[word-after-cursor]
fi
else
if [[ $style = i ]]; then
# skip the word
word=$matched_words[5]
word=$matched_words[word-after-cursor]
else
# skip word and following whitespace
word=$matched_words[5]$matched_words[6]
word=$matched_words[word-after-cursor]$matched_words[ws-after-word]
fi
fi
(( CURSOR += ${#word} - 1 ))
else
match-words-by-style
if [[ -n "${matched_words[3]}" ]]; then
# There's whitespace before the cursor, so the word we are selecting
# starts at the cursor position.
if (( ${matched_words[is-word-start]} )); then
# The word we are selecting starts at the cursor position.
pos1=$CURSOR
else
# No whitespace before us, so select any wordcharacters there.
pos1="${#matched_words[1]}"
pos1="${#matched_words[start]}"
fi
if [[ -n "${matched_words[4]}" ]]; then
if [[ -n "${matched_words[3]}" ]] || (( CURSOR == 0 )); then
if [[ -n "${matched_words[ws-after-cursor]}" ]]; then
if [[ -n "${matched_words[ws-before-cursor]}" ]] || (( CURSOR == 0 )); then
# whitespace either side, select it
(( pos1 = CURSOR - ${#matched_words[3]} ))
(( pos2 = CURSOR + ${#matched_words[4]} ))
(( pos1 = CURSOR - ${#matched_words[ws-before-cursor]} ))
(( pos2 = CURSOR + ${#matched_words[ws-after-cursor]} ))
else
# There's whitespace at the cursor position, so only select
# up to the cursor position.
@ -86,28 +85,28 @@ while (( num-- )); do
else
# No whitespace at the cursor position, so select the
# current character and any following wordcharacters.
(( pos2 = CURSOR + ${#matched_words[5]} ))
(( pos2 = CURSOR + ${#matched_words[word-after-cursor]} ))
fi
if [[ $style = a ]]; then
if [[ -n "${matched_words[4]}" && ( -n "${matched_words[3]}" || CURSOR -eq 0 ) ]]; then
if [[ -n "${matched_words[ws-after-cursor]}" && ( -n "${matched_words[ws-before-cursor]}" || CURSOR -eq 0 ) ]]; then
# in the middle of whitespace so grab a word
if [[ -n "${matched_words[5]}" ]]; then
(( pos2 += ${#matched_words[5]} )) # preferably the one after
if [[ -n "${matched_words[word-after-cursor]}" ]]; then
(( pos2 += ${#matched_words[word-after-cursor]} )) # preferably the one after
else
(( pos1 -= ${#matched_words[2]} )) # otherwise the one before
(( pos1 -= ${#matched_words[word-before-cursor]} )) # otherwise the one before
fi
elif [[ -n "${matched_words[6]}" ]]; then
(( pos2 += ${#matched_words[6]} ))
elif [[ -n "${matched_words[3]}" ]]; then
elif [[ -n "${matched_words[ws-after-word]}" ]]; then
(( pos2 += ${#matched_words[ws-after-word]} ))
elif [[ -n "${matched_words[ws-before-cursor]}" ]]; then
# couldn't grab whitespace forwards so try backwards
(( pos1 -= ${#matched_words[3]} ))
(( pos1 -= ${#matched_words[ws-before-cursor]} ))
elif (( pos1 > 0 )); then
# There might have been whitespace before the word
(( CURSOR = pos1 ))
match-words-by-style
if [[ -n "${matched_words[3]}" ]]; then
(( pos1 -= ${#matched_words[3]} ))
if [[ -n "${matched_words[ws-before-cursor]}" ]]; then
(( pos1 -= ${#matched_words[ws-before-cursor]} ))
fi
fi
fi