diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | Doc/Zsh/contrib.yo | 34 | ||||
-rw-r--r-- | Functions/Zle/narrow-to-region | 82 | ||||
-rw-r--r-- | Functions/Zle/narrow-to-region-invisible | 5 |
4 files changed, 125 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog index 7c33de05a..724ce7396 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2002-07-04 Peter Stephenson <pws@csr.com> + * 17410: Doc/Zsh/contrib.yo, Functions/Zle/narrow-to-region, + Functions/Zle/narrow-to-region-invisible: use 17390/17405 to + create narrow-to-region widget/function. + * 17405: Src/Zle/zle_main.c, Src/Zle/zle_params.c, Doc/Zsh/zle.yo: adapt 17390 so that PREDISPLAY and POSTDISPLAY are reset when zle is entered. diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo index f21a31284..58a943e1a 100644 --- a/Doc/Zsh/contrib.yo +++ b/Doc/Zsh/contrib.yo @@ -475,6 +475,40 @@ into the command line. 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))( diff --git a/Functions/Zle/narrow-to-region b/Functions/Zle/narrow-to-region new file mode 100644 index 000000000..baa8b48c2 --- /dev/null +++ b/Functions/Zle/narrow-to-region @@ -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 diff --git a/Functions/Zle/narrow-to-region-invisible b/Functions/Zle/narrow-to-region-invisible new file mode 100644 index 000000000..d70966b96 --- /dev/null +++ b/Functions/Zle/narrow-to-region-invisible @@ -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 |