Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: beep and garbage with long commands
- X-seq: zsh-workers 20075
- From: Dan Nelson <dnelson@xxxxxxxxxxxxxxx>
- To: slumos@xxxxxxxxxxxxxxx
- Subject: Re: beep and garbage with long commands
- Date: Fri, 18 Jun 2004 01:52:59 -0500
- Cc: zsh-workers@xxxxxxxxxx
- In-reply-to: <861xkf9ccz.fsf@xxxxxxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- References: <861xkf9ccz.fsf@xxxxxxxxxxxxxx>
In the last episode (Jun 16), slumos@xxxxxxxxxxxxxxx said:
> When entering certain long commands, zsh (at least 4.0.7 and 4.2.0 on
> at least FreeBSD and Solaris) beeps and echos parts of the command.
> Here's a stupid made-up example:
>
> [~]0% ls -la | while read line; do echo $line | awk '{print $1 " " $2 " " $3 " " $4 " " $5 "\n"}'; done >|/dev/null; echo
>
> "}'; done >|/dev/null; echo
> [~]0%
I bet you have a preexec function that sets your xterm's title bar,
right? Either the backslashes or the embedded newline is aborting the
escape sequence, you end up with the rest of your command printed
onscreen, plus the ^G that was supposed to end the titlebar escape
string.
I've attached the part of my zshrc file dealing with xterm and screen
titles. It strips control characters from the commandline before
sending it to xterm. It also sets the window name in screen, so if you
use the windows or windowlist command, you can see at a glance what is
running in each screen:
0*&$ ./start 1-$ mutt 2@$ irc_irc.ca 3$ ssh_emssr 4$ ssh_emssr 5$ joe_/e
Note there are raw control characters in the attached file, so you
might not be able to cut'n'paste the text correctly unless you save it.
I also have the following in my screenrc, since screen won't write to
the xterm titlebar unless the termcap entry has the 'hs' capability.
termcapinfo xterm|xterm-color 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'
--
Dan Nelson
dnelson@xxxxxxxxxxxxxxx
SHOST=`print -P %m`
# strip control chars and replace with "."
# result is returned in $reply
function _strip()
{
local i=1
reply=$1
while (( i <= $#1 )) ; do
[[ $reply[i] > "" && $reply[i] < "" ]] || reply[i]="."
(( i ++ ))
done
}
if [[ $+WINDOW = 1 && $TERM = screen* ]] ; then
PROMPT="(%n@$SHOST.$WINDOW) %B%/>%(#/#/)%b "
RPROMPT="%t %D{%m/%d} %l"
# set window title to first 10 chars of command
# set hardstatus to hostname and first 100 chars of command
preexec () { _strip $1 ; echo -En "k${reply[1,10]:gs/ /_/}\\]0;$SHOST: ${reply[1,100]}" }
else
PROMPT="(%n@%m) %B%/>%(#/#/)%b "
case $TERM in
cons25-crt|xterm*|screen*)
# set titlebar to first 100 chars of command
preexec () { _strip $1 ; echo -En "]0;$SHOST: $reply[1,100]" } ;;
esac
fi
# Update titlebar and inform the user of background jobs
precmd ()
{
if [[ $+WINDOW = 1 && $TERM = screen* ]] ; then
# Set the window title to $SHELL
# Set hardstatus to hostname
print -Pn "k${SHELL:t}\\\\]0;%m"
fi
case $TERM in
# set titlebar to hostname
cons25-crt|xterm*|screen*)
print -Pn "]0;%m" ;;
esac
if [[ -o interactive ]] ; then
jobs -s
:
fi
}
Messages sorted by:
Reverse Date,
Date,
Thread,
Author