Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: narrow-to-region



Here is a tidied up version of narrow-to-region together with a simple
widget narrow-to-region-invisible which reduces text outside the region
to `...'.

Index: Doc/Zsh/contrib.yo
===================================================================
RCS file: /cvsroot/zsh/zsh/Doc/Zsh/contrib.yo,v
retrieving revision 1.19
diff -u -r1.19 contrib.yo
--- Doc/Zsh/contrib.yo	21 Mar 2002 23:03:14 -0000	1.19
+++ Doc/Zsh/contrib.yo	4 Jul 2002 13:24:46 -0000
@@ -475,6 +475,40 @@
 
 example(bindkey '^Xf' insert-files)
 )
+tindex(narrow-to-region)
+tindex(narrow-to-region-invisible)
+xitem(tt(narrow-to-region [ -p) var(pre) tt(] [ -P) var(post) tt(] [ -n ] [) var(start) var(end) tt(]))
+item(tt(narrow-to-region-invisible))(
+Narrow the editable portion of the buffer to the region between the cursor
+and the mark, which may be in either order.  The region may not be empty.
+
+tt(narrow-to-region) may be used as a widget or called as a function from a
+user-defined widget; by default, the text outside the editable area remains
+visible.  Various options and arguments are available when it is called as
+a function.
+
+The options tt(-p) var(pretext) and tt(-P) var(posttext) may be
+used to replace the text before and after the display for the duration of
+the function; either or both may be an empty string.
+
+If the option tt(-n) is also given, var(pretext) or var(posttext) will only
+be inserted if there is text before or after the region respectively which
+will be made invisible.
+
+Two numeric arguments may be given which will be used instead of the cursor
+and mark positions.
+
+tt(narrow-to-region-invisible) is a simple widget which calls
+tt(narrow-to-region) with arguments which replace any text outside the
+region with `tt(...)'.
+
+On return from both widgets, the display is restored by any zle command
+which would usually cause the line to be accepted or aborted.  Hence an
+additional such command is required to accept or abort the current line.
+
+The return status of both widgets is zero if the line was accepted, else
+non-zero.
+)
 tindex(predict-on)
 tindex(predict-off)
 item(tt(predict-on))(
Index: Functions/Zle/narrow-to-region
===================================================================
RCS file: Functions/Zle/narrow-to-region
diff -N Functions/Zle/narrow-to-region
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ Functions/Zle/narrow-to-region	4 Jul 2002 13:24:46 -0000
@@ -0,0 +1,82 @@
+# Restrict the start of the editable line to the region between cursor
+# and mark (including the character at the end).  Can be bound used as
+# a zle widget, or called as a function from another widget.
+#
+# Optionally accepts exactly two arguments, which are used instead of
+# $CURSOR and $MARK as limits to the range.
+#
+# Other options:
+#   -p pretext   show `pretext' instead of the buffer text before the region.
+#   -P posttext  show  `posttext' instead of the buffer text after the region.
+#   -n           Only replace the text before or after the region with
+#                the -p or -P options if the text was not empty.
+# Either or both may be empty.
+
+emulate -L zsh
+setopt extendedglob
+
+local lbuffer rbuffer predisplay=$PREDISPLAY postdisplay=$POSTDISPLAY
+integer start end swap cursor=$CURSOR mark=$MARK stat
+
+local opt pretext posttext usepretext useposttext nonempty
+
+while getopts "np:P:" opt; do
+  case $opt in
+    (n) nonempty=1
+	;;
+    (p) pretext=$OPTARG usepretext=1
+	;;
+    (P) posttext=$OPTARG useposttext=1
+	;;
+    (*) [[ $opt != '?' ]] && print "$0: unhandled option: $opt" >&2
+	return 1
+	;;
+  esac
+done
+(( OPTIND > 1 )) && shift $(( OPTIND - 1 ))
+
+if (( $# )); then
+  if (( $# != 2 )); then
+    zle -M "$0: supply zero or two arguments"
+    return 1
+  fi
+  start=$1
+  end=$2
+else
+  start=$MARK
+  end=$CURSOR
+fi
+
+if (( start == end )); then
+  return 1
+elif (( start > end )); then
+  swap=start
+  start=end
+  end=swap
+fi
+
+(( end++, cursor -= start, mark -= start ))
+
+lbuffer=${BUFFER[1,start]}
+if [[ -z $usepretext || ( -n $nonempty && -z $lbuffer ) ]]; then
+  pretext=$lbuffer
+fi
+rbuffer=${BUFFER[end,-1]}
+if [[ -z $useposttext || ( -n $nonempty && -z $rbuffer ) ]]; then
+  posttext=$rbuffer
+fi
+PREDISPLAY="$predisplay$pretext"
+POSTDISPLAY="$posttext$postdisplay"
+BUFFER=${BUFFER[start+1,end-1]}
+CURSOR=$cursor
+MARK=$mark
+
+zle recursive-edit
+stat=$?
+
+PREDISPLAY=$predisplay
+POSTDISPLAY=$postdisplay
+LBUFFER="$lbuffer$LBUFFER"
+RBUFFER="$RBUFFER$rbuffer"
+
+return $stat
Index: Functions/Zle/narrow-to-region-invisible
===================================================================
RCS file: Functions/Zle/narrow-to-region-invisible
diff -N Functions/Zle/narrow-to-region-invisible
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ Functions/Zle/narrow-to-region-invisible	4 Jul 2002 13:24:46 -0000
@@ -0,0 +1,5 @@
+# As narrow-to-region, but replaces the text outside the editable region
+# with `...' if it was non-empty.  Can be used directly as a widget.
+
+autoload -U narrow-to-region
+narrow-to-region -p '...' -P '...' -n

-- 
Peter Stephenson <pws@xxxxxxx>                  Software Engineer
CSR Ltd., Science Park, Milton Road,
Cambridge, CB4 0WH, UK                          Tel: +44 (0)1223 392070


**********************************************************************
The information transmitted is intended only for the person or
entity to which it is addressed and may contain confidential 
and/or privileged material. 
Any review, retransmission, dissemination or other use of, or
taking of any action in reliance upon, this information by 
persons or entities other than the intended recipient is 
prohibited.  
If you received this in error, please contact the sender and 
delete the material from any computer.
**********************************************************************



Messages sorted by: Reverse Date, Date, Thread, Author