about summary refs log tree commit diff
path: root/Functions/Zle/transpose-lines
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2010-06-16 21:50:39 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2010-06-16 21:50:39 +0000
commit091cbd9d5864173433c6937dd1dcc7742081ae13 (patch)
tree31bbb9e64af1d1c14031fd8840708cd6648bd49b /Functions/Zle/transpose-lines
parent14dde084755a8b15004d59bb6be5cc7a3726a8bf (diff)
downloadzsh-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-lines43
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