diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2010-06-16 21:50:39 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2010-06-16 21:50:39 +0000 |
commit | 091cbd9d5864173433c6937dd1dcc7742081ae13 (patch) | |
tree | 31bbb9e64af1d1c14031fd8840708cd6648bd49b /Functions/Zle/transpose-lines | |
parent | 14dde084755a8b15004d59bb6be5cc7a3726a8bf (diff) | |
download | zsh-091cbd9d5864173433c6937dd1dcc7742081ae13.tar.gz zsh-091cbd9d5864173433c6937dd1dcc7742081ae13.tar.xz zsh-091cbd9d5864173433c6937dd1dcc7742081ae13.zip |
28042: transpose-lines widget
Diffstat (limited to 'Functions/Zle/transpose-lines')
-rw-r--r-- | Functions/Zle/transpose-lines | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/Functions/Zle/transpose-lines b/Functions/Zle/transpose-lines new file mode 100644 index 000000000..06e1da4ac --- /dev/null +++ b/Functions/Zle/transpose-lines @@ -0,0 +1,43 @@ +# Transpose lines. This is like in emacs: with a positive argument +# (default 1) the current line and the previous line are swapped and the +# cursor goes down one line; with a negative argument the previous two +# lines are swapped and the cursor goes up one line. + +emulate -L zsh +setopt extendedglob # xtrace + +local -a match mbegin mend +integer count=${NUMERIC:-1} +local init prev lline final rrline + +if (( ${NUMERIC:-1} < 0 )); then + while (( count++ )); do + [[ $LBUFFER != (#b)(|*$'\n')([^$'\n']#$'\n')([^$'\n']#$'\n')([^$'\n']#) ]] && return 1 + + LBUFFER=$match[1]$match[3] + RBUFFER=$match[2]$match[4]$RBUFFER + done +else + while (( count-- )); do + [[ $LBUFFER != (#b)(*)$'\n'([^$'\n']#) ]] && return 1 + + prev=$match[1] + lline=$match[2] + + if [[ $prev = (#b)(*$'\n')([^$'\n']#) ]]; then + init=$match[1] + prev=$match[2] + fi + + if [[ $RBUFFER = (#b)([^$'\n']#)$'\n'(*) ]]; then + rline=$match[1] + final=$match[2] + prev+=$'\n' + else + rline=$RBUFFER + fi + + LBUFFER=$init$lline$rline$'\n'$prev + RBUFFER=$final + done +fi |