about summary refs log tree commit diff
path: root/Functions/Zle/transpose-words-match
blob: 52891b6acbbadf93147eb847d2dbd81caa5c7655 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# Transpose words, matching the words using match-words-by-style, q.v.
# The group of word characters preceeding the cursor (not necessarily
# immediately) are transposed with the group of word characters following
# the cursor (again, not necessarily immediately).
#
# Note the style skip-chars, used in the context of the current widget.
# This gives a number of character starting from the cursor position
# which are never considered part of a word and hence are always left
# alone.  The default is 0 and typically the only useful alternative
# is one.  This would have the effect that `fooXbar' with the cursor
# on X would be turned into `barXfoo' with the cursor still on the X,
# regardless of what the character X is.

autoload match-words-by-style

local curcontext=":zle:$WIDGET" skip
local -a matched_words
integer count=${NUMERIC:-1}

while (( count-- > 0 )); do
    match-words-by-style

    [[ -z "$matched_words[2]$matched_words[5]" ]] && return 1

    LBUFFER="$matched_words[1]$matched_words[5]${(j..)matched_words[3,4]}\
$matched_words[2]"
    RBUFFER="${(j..)matched_words[6,7]}"

done

return 0