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:
parent
54d5f8e363
commit
b816bb42cf
4 changed files with 38 additions and 31 deletions
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 '')
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue