I’ve been using below shell prompt since 2013 and only slightly tweaked it over time. The most significant change was probably displaying the Git branch.
The basic idea of my prompt is to not show redundant or obvious information. This allows the prompt to be short, yet useful.
By default, the prompt displays the hostname, shortened directory, and
a %
to signify a zsh
.
The hostname is bold to make it stand out when you are scrolling,
and the sigil is colored to mark the beginning of the command.
It looks like this:
juno ~% ./mycommand -x
Long directory names are truncated in the middle:
juno /tmp/dirwithare…gname%
In rare cases, only showing two levels of hierarchy may be confusing,
so you can set $NDIRS
to something higher, e.g. 4:
juno deeply/nested/dir/structure%
When the previous command failed, the prompt also displays the exit status of the previous command:
juno 42? ~%
When there are background jobs running, the prompt shows how many there are:
juno 1& ~%
Note how the status and job display use the associated ASCII symbols.
When we are in a Git repository, the current branch is displayed inline as part of the base directory (when possible), or as a prefix, together with the repo name. By design, in the most common cases this keeps the prompt very short:
juno prj/rack@master%
juno rack@master/doc%
juno rack@master doc/Rack%
When the prompt detects a SSH session, the prompt sigil is doubled, so we are a bit more careful there:
hecate prj/lr%%
When the shell runs as root, the sigil is red (I don’t usually run zsh as root):
juno /etc#
That’s it, essentially.
Apart from the Git integration, it’s really straight-forward.
Not visible above is
trick 4 to
simplify pasting of old lines,
and how it updates the title of terminal emulators to
hostname: dir
respectively hostname: current-command
(which needs quite complicated quoting).
The whole thing is defined in the PROMPT
section of
my .zshrc.
NP: Light Bearer—Aggressor & Usurper