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

Re: Prompt erases line

> The zsh propmpt always seem to erase the line if the
> line does not end in a "\n"
> -----
> lewang@phobe ~ % echo asdf
> asdf
> lewang@phobe ~ % echo -n adsf
> lewang@phobe ~ %
> -----
> Is there any way to get it to just print the prompt
> after the text on the same line?

unsetopt PROMPT_CR

This is assuming that you don't have a carriage return character in your
PS1 shell variable.

Put it in your $HOME/.zshrc file if you want it to behave that way every
time you start a shell.

Be aware that unsetting PROMPT_CR can cause some unusual behaviour with
the zle editor, because it has no way of knowing how many characters
have already been printed on the line before the prompt.


On an aside, I used to have the following code in my precmd function,
which would detect if the cursor wasn't up against the left edge of the
screen using an xterm/VT100 escape sequence.  If the cursor wasn't in
the first column, the precmd function would print a message and arrange
for the prompt to be printed anew on the line below.

It was a cute feature, but I've since disabled it because it was too
slow to use seriously, and timing issues meant that it didn't always
work across a slow (dialup) connection.  It would have worked a bit
quicker if the "STTY='opts' command" trick worked on the print/read
combination in the middle of the report-cursor-position function (thus
removing two fork/execs to the external stty command), but I couldn't
make it work.

Besides, the whole thing was pretty useless, to be honest.

To use it, set PROMPTCURSORPOS to a number such as 10.  This is the
number of milliseconds the function waits for a response from the
terminal driver.

# report-cursor-position
# Returns the horizontal cursor position for xterms and other terminals.
# The returned number is zero-origin, so a "successful" (in shell terms)
# return means the cursor is at the left edge of the screen.
# This code is lifted from an example in the xterm FAQ
# written by Icarus Sparry <icarus@xxxxxxxxxx> 11 Apr 1997
# and modified to use a different control sequence.

  local old a
  if [[ $TERM = xterm* ]]
    # Send the terminal the code and wait for its response.
    exec </dev/tty
    old=$(stty -g)
    stty raw -echo min 0  time ${1-10}
    print -n "\e[6n" > /dev/tty
    IFS='' read -r a
    stty $old
    return $(( $a - 1 ))

# .... other stuff ...
  # Check the cursor position - is it up against the left margin?
  # This can be kind of slow, so we only do it if a shell variable is
  # set (which it isn't by default - see below).
  if [[ ${+PROMPTCURSORPOS} -eq 1 ]]
    # This function works on xterms and other assorted terminals
    # by querying the terminal for its cursor position.  It returns zero
    # if the cursor is in the leftmost position, nonzero otherwise.
    if ! report-cursor-position $PROMPTCURSORPOS
      print "[no newline]"
# .... other stuff ...


Debbie Pickett http://www.csse.monash.edu.au/~debbiep debbiep@xxxxxxxxxxxxxxxxxx
              If I throw a stick, will you leave? - button slogan

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