From: "Bart Schaefer" <schaefer@candle.brasslantern.com>
To: zsh-users@sunsite.auc.dk
Subject: Revised version of "promptnl"
Date: Sun, 27 Aug 2000 17:02:58 +0000 [thread overview]
Message-ID: <1000827170259.ZM14669@candle.brasslantern.com> (raw)
This fixes a couple of bugs:
1. Typeahead confused it. This version attempts to consume all typeahead
and pushes anything it gets onto the ZLE buffer stack, whence ZLE will
fetch it again after the prompt is printed. This still isn't quite the
same as if ZLE read those bytes directly, and it's still possible to
confuse it by typing continually so that your strokes get mixed into
the cursor position string, but this should handle common cases.
2. "read -t" doesn't set REPLY to the empty string when it fails, so it's
necessary to test the result and only append to RECV on success.
---- 8< ---- cut here ---- 8< ----
#autoload
emulate -L zsh
# VT100 and ANSI terminals will report the cursor position when sent
# the sequence ESC [ 6 n -- it comes back as ESC [ column ; line R
# with of course no trailing newline. Column and line are 1-based.
local RECV='' SEND='\e[6n' REPLY=X
# If you are on a very slow tty, you may need to increase WAIT here.
integer WAIT=1
# Make sure there's no typeahead, or it'll confuse things. Remove
# this block entirely to use this function in 3.0.x at your own risk.
while read -t -k 1
do
RECV=$RECV$REPLY
done
if [[ -n $RECV ]]
then
print -z -r -- $RECV
RECV=''
REPLY=X
fi
# This is annoying, but zsh immediately resets it properly, so ...
stty -echo
# Output the SEND sequence and read back into RECV. In case this is
# not a terminal that understands SEND, do a non-blocking read and
# retry for at most WAIT seconds before giving up. Requires 3.1.9.
# For 3.0.x, remove "-t" but don't call this on the wrong terminal!
print -n $SEND
integer N=$SECONDS
while [[ $REPLY != R ]] && ((SECONDS - N <= WAIT))
do
if read -t -k 1
then
((N=SECONDS))
RECV=$RECV$REPLY
fi
done
# If the cursor is not in the first column, emit EOLMARK and newline.
(( ${${RECV#*\;}%R} > 1 )) && print -P -- $EOLMARK
return 0
---- 8< ---- cut here ---- 8< ----
--
Bart Schaefer Brass Lantern Enterprises
http://www.well.com/user/barts http://www.brasslantern.com
Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net
next reply other threads:[~2000-08-27 17:03 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2000-08-27 17:02 Bart Schaefer [this message]
2000-08-31 10:17 ` Completion doesn't work after upgrade Klaus Wacker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1000827170259.ZM14669@candle.brasslantern.com \
--to=schaefer@candle.brasslantern.com \
--cc=zsh-users@sunsite.auc.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).