ChatGPT Wrote my Shell Prompt
I have, for years now, wanted a cool shell prompt — something worth showing off on r/linux or even r/unixporn. Not enough to dig into the weeds and figure out how to write one myself, but enough that it came up every once in a while. Then, the other day, I had a great idea: why not just let ChatGPT make it for me?
After some fiddling, I came up with the following schema for my new prompt:
User and Hostname #
If the previous command succeeded, {user}
and {hostname}
would be green but the at symbol (@) would be left black to differentiate the current username from the current hostname; if the previous command failed, those portions of the prompt would be colored red to indidcate that something had gone wrong.
Directory #
The directory variable would be replaced by the current working directory with $HOME
abbreviated with a tilde (~). {directory}
would always be light blue to make it easy to know where I was at all times.
git Information #
The variables in the square brackets, which present git
information, would be determined according to a series of rules.
If the current working directory was not a git repository, this entire block would be ommitted. This would help keep my prompt clean when navigating the filesystem and debugging applications.
{local branch}
would show the local branch if it existed. If there were unstaged changes in the local branch, the local branch would be colored orange. This visual cue would remind me to act on changes.
{upstream branch}
would show the remote tracking branch. I typically work with multiple remotes, and on multiple occasions I have accidentally pushed code to the wrong location. This helps mitigate those types of accidents.
{branch tracking symbol}
is determined by the following criteria (thanks Martin Gondermann):
- ↑n: ahead of remote by n commits
- ↓n: behind remote by n commits
- ↓m↑n: branches diverged, other by m commits, yours by n commits
- L: local branch, not remotely tracked
{local status}
is determined by the following criteria:
- ✔: repository clean
- ●n: there are n staged files
- ✖n: there are n files with merge conflicts
- ✖-n: there are n staged files waiting for removal
- ✚n: there are n changed but unstaged files
- …n: there are n untracked files
- ⚑n: there are n stash entries
Privilege Character #
The privilege character would be a dollar sign ($) when running as an unprivileged user, and an octothorp (#) when running with elevated privileges. Note that the privilege character would appear on the second line. Although not necessary in most scenarios, when the username and hostname got long and the prompt had to display a lot of information for a complex git
repository, this helped keep everything readable.
In practice, my prompt can look as simple as this:
zac@wk01:~/
$
Here I can easily see that I am logged in as zac
on wk01
, in the home directory, and the home directory is not a git
repository.
If I move into the ~/tools/
folder, I can quickly ascertain that this is a git
repository, I am on the master
branch, and there are no unstaged changes.
zac@wk01:~/tools [master origin/master | ✔]
$
Having altered one of the scripts in the project, my prompt would change to indicate that the repository had 1 unstaged change.
zac@wk01:~/tools [master origin/master | ● 1 ✖ 1 ✚ 1 ✖ - 1 … 1]
$
I suspect there are some bugs in the prompt, particular in the {local status}
formulation, but so far this has worked well for me. The underlying code is available on GitHub, in the shell-prompt repository.