Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: New-line in prompt
- X-seq: zsh-users 1933
 
- From: "Bart Schaefer" <schaefer@xxxxxxxxxxxxxxxx>
 
- To: zsh-users@xxxxxxxxxxxxxxx
 
- Subject: Re: New-line in prompt
 
- Date: Mon, 9 Nov 1998 12:30:16 -0800
 
- In-reply-to: <Pine.OSF.3.96.981109132554.12190D-100000@xxxxxxxxxxxxxxxxxxxxxxxxx>
 
- References: <Pine.OSF.3.96.981109132554.12190D-100000@xxxxxxxxxxxxxxxxxxxxxxxxx>
 
On Nov 9,  1:27pm, Owen M. Astley wrote:
} Subject: New-line in prompt
}
} I am trying to get a new line (\n) in a prompt (actually I only want the
} new line if the current one is too long).  Has anybody got any idea about
} how to do this?  %{\n%} works but, as the man page says, it shouldn't
} change the cursor position (for obvious reasons if you use it).
This has spawned a discussion on zsh-workers that I thought I'd let the
zsh-users know about.
(1) Putting a newline in the prompt is a FAQ; the short answer is, you
just quote it:
PS1='stuff before the newline
stuff after the newline'
(2) A patch for 3.1.5 has been posted to add a "line length" test to the
conditional prompt syntax.  Without that patch, there's no simple way to
accomplish "insert Y if the prompt so far is longer than X characters."
Here's a not-so-simple way, but note that it fails if you have an non-
printing characters in the prompt (escapes for bold and underline, or
anything in %{...%}, etc.).
precmd() {
    # ... whatever you now have in precmd, followed by:
    fold-prompt
}
# Don't set PROMPT or PS1, instead set this array:
parts_of_PS1=(%m %n "%~" "%#")		# For example
fold-prompt() {
    emulate -R zsh
    setopt localoptions
    local tmp_PS1="" p P
    local fold_at=$[$COLUMNS-1]		# Adjust to taste
    for p in $parts_of_PS1
    do
	P=$(print -nP $p)
	if [[ $[$#tmp_PS1+$#P] -lt $fold_at ]]
	then
	    tmp_PS1="${tmp_PS1:+$tmp_PS1 }$P"
	else
	    ((fold_at += $#tmp_PS1 + 1))
	    tmp_PS1="$tmp_PS1
$P" # Note, newline enclosed in quotes ending on this line
	fi
    done
    PS1="${tmp_PS1:gs/%/%%/} "
}
-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com
Messages sorted by:
Reverse Date,
Date,
Thread,
Author