369 lines
16 KiB
Markdown
369 lines
16 KiB
Markdown
Liquid Prompt — a useful adaptive prompt for Bash & zsh
|
||
=======================================================
|
||
|
||
Liquid Prompt gives you a nicely displayed prompt with useful information
|
||
when you need it. It shows you what you need when you need it.
|
||
You will notice what changes *when* it changes, saving time and frustration.
|
||
You can even use it with your favorite shell – Bash or zsh.
|
||
|
||
![Screenshot](https://raw.github.com/nojhan/liquidprompt/master/demo.png)
|
||
|
||
|
||
## Features
|
||
|
||
If there is nothing special about the current context, the appearance of Liquid
|
||
Prompt is similar to that of a default prompt:
|
||
|
||
`[user:~] $ `
|
||
|
||
If you are running a background command and are also in the "myb" branch
|
||
of a Git repository on a server:
|
||
|
||
`1r [user@server:~/liquidprompt] myb ± `
|
||
|
||
When Liquid Prompt is displaying everything (a rare event!), it may look like this:
|
||
|
||
`code 🕤 ⌁24% ⌂42% 3d/2&/1z [user@server:~/ … /code/liquidprompt][pyenv]↥ master(+10/-5,3)*+ 125 ± `
|
||
|
||
Here is an overview of what Liquid Prompt is capable of displaying:
|
||
|
||
* a tag associated to the current shell session (you can easily add any
|
||
prefix tag to your prompt by invoking `prompt_tag MYTAG`)
|
||
* the current time, displayed as either numeric values or as an analog clock
|
||
* the current battery status:
|
||
* a green `⏚` if charging, above the given threshold, but not charged
|
||
* a yellow `⏚` if charging and under the given threshold
|
||
* a yellow `⌁` if discharging but above the given threshold
|
||
* a red `⌁` if discharging and under the given threshold
|
||
* the remaining battery power if it is under the given threshold, displayed with
|
||
an increasingly red color map as remaining power decreases
|
||
* the average of the processors load if it is over a given limit, displayed with
|
||
an intensity color map as load increases
|
||
* the average temperature of the available system sensors (generally CPU and MB)
|
||
* the number of detached sessions (`screen` or `tmux`)
|
||
* the number of attached sleeping jobs (when you interrupt a command with Ctrl-Z
|
||
and bring it back with `fg`)
|
||
* the number of attached running jobs (commands started with a `&`)
|
||
* a pair of square brackets, in blue if your current shell is running in a
|
||
terminal multiplexer (`screen` or `tmux`)
|
||
* the current user, in bold yellow if it is root and in light white if it is not
|
||
the same as the login user
|
||
* a green `@` if the connection has X11 support; a yellow one if not
|
||
* the current host – in bold red if you are connected via a `telnet` connection
|
||
and blue (or other unique colors) if connected via SSH
|
||
* a green colon if the user has write permissions in the current directory and
|
||
a red one if not
|
||
* the current directory in bold, shortened if it takes too much space while always
|
||
preserving the first two directory names
|
||
* the current Python virtual environment
|
||
* an up arrow if an HTTP proxy is in use
|
||
* the name of the current branch if you are in a version control repository
|
||
(Git, Mercurial, Subversion, Bazaar, or Fossil):
|
||
* in green if everything is up-to-date
|
||
* in red if there are changes
|
||
* in yellow if there are pending commits to push
|
||
* the number of added/deleted lines if changes have been made and the
|
||
number of pending commits
|
||
* a yellow `+` if there are stashed modifications
|
||
* a red `*` if there are untracked files in the repository
|
||
* the runtime of the last command, if it has exceeded a certain threshold
|
||
* the error code of the last command, if it has failed in some way
|
||
* a smart mark at the end of the prompt:
|
||
* `±` for Git,
|
||
* `☿` for Mercurial,
|
||
* `‡` for Subversion,
|
||
* `‡±` for Git-Subversion,
|
||
* `⌘` for Fossil,
|
||
* `$` or `%` for a simple user, in red if you have `sudo` rights,
|
||
* a red `#` for the root user.
|
||
* if desired, the prompt will be replicated in your terminal window's
|
||
title (without the colors)
|
||
|
||
You can temporarily deactivate Liquid Prompt and revert to your previous prompt
|
||
by typing `prompt_off`. Use `prompt_on` to bring it back. You can disable
|
||
*all* prompts and simply use a single mark sign (`$ ` for user and `# ` for root)
|
||
by using the `prompt_OFF` command.
|
||
|
||
|
||
## Test Drive and Installation
|
||
|
||
Installation is simple. The basic dependencies are standard Unix utilities/commands.
|
||
If you experience some problems during the installation, please check that they
|
||
are met; see the [dependencies](#dependencies) section for what you need specifically.
|
||
|
||
Follow these steps:
|
||
|
||
cd
|
||
git clone https://github.com/nojhan/liquidprompt.git
|
||
source liquidprompt/liquidprompt
|
||
|
||
To use it every time you start a shell, add the following lines to your
|
||
`.bashrc` (if you use Bash) or `.zshrc` (if you use zsh):
|
||
|
||
# Only load Liquid Prompt in interactive shells, not from a script or from scp
|
||
[[ $- = *i* ]] && source ~/liquidprompt/liquidprompt
|
||
|
||
Next up is the configuration; you can skip this step if you like the defaults:
|
||
|
||
cp ~/liquidprompt/liquidpromptrc-dist ~/.config/liquidpromptrc
|
||
|
||
You can also copy the file to `~/.liquidpromptrc`.
|
||
Use your favorite text editor to change the defaults.
|
||
The `liquidpromptrc` file is richly commented and easy to set your own defaults.
|
||
You can even theme Liquid Prompt and use a custom PS1 prompt. This is explained
|
||
in the sections below.
|
||
|
||
Check in your `.bashrc` that the `PROMPT_COMMAND` variable is not set, or else
|
||
the prompt will not be available.
|
||
|
||
### Installation via Antigen
|
||
|
||
To install via antigen, simply add the following line in your `.zshrc` after activating antigen:
|
||
|
||
antigen bundle nojhan/liquidprompt
|
||
|
||
|
||
## Dependencies
|
||
|
||
Apart from obvious ones, some features depend on specific commands. If you do
|
||
not install them, the corresponding feature will not be available, but no error
|
||
will be displayed.
|
||
|
||
* Battery status requires `acpi` on GNU/Linux.
|
||
* Temperature status requires `acpi` or `lm-sensors` on GNU/Linux.
|
||
* Detached session status looks for `screen` and/or `tmux`.
|
||
* VCS support features require `git`, `hg`, `svn`, `bzr` or `fossil`, but you
|
||
probably already knew that.
|
||
|
||
For other features, the script uses commands that should be available on a large
|
||
variety of Unix systems: `tput`, `grep`, `awk`, `sed`, `ps`, `who`, and `expr`.
|
||
|
||
|
||
## Feature Configuration
|
||
|
||
You can configure some variables in the `~/.config/liquidpromptrc` file:
|
||
|
||
* `LP_BATTERY_THRESHOLD`, the maximal value under which the battery level is displayed
|
||
* `LP_LOAD_THRESHOLD`, the minimal value after which the load average is displayed
|
||
* `LP_TEMP_THRESHOLD`, the minimal value after which the average temperature is displayed
|
||
* `LP_RUNTIME_THRESHOLD`, the minimal value after which the runtime is displayed
|
||
* `LP_PATH_LENGTH`, the maximum percentage of the screen width used to display the path
|
||
* `LP_PATH_KEEP`, how many directories to keep at the beginning of a shortened path
|
||
* `LP_HOSTNAME_ALWAYS`, a choice between always displaying the hostname or
|
||
showing it only when connected via a remote shell
|
||
* `LP_USER_ALWAYS`, a choice between always displaying the user or showing
|
||
it only when he is different from the one that logged in
|
||
|
||
You can also force some features to be disabled, to save some time in the
|
||
prompt-building process:
|
||
|
||
* `LP_ENABLE_PERM`, if you want to detect if the directory is writeable
|
||
* `LP_ENABLE_SHORTEN_PATH`, if you want to shorten the path display
|
||
* `LP_ENABLE_PROXY`, if you want to detect if a proxy is used
|
||
* `LP_ENABLE_JOBS`, if you want to have jobs information
|
||
* `LP_ENABLE_LOAD`, if you want to have load information
|
||
* `LP_ENABLE_BATT`, if you want to have battery information
|
||
* `LP_ENABLE_GIT`, if you want to have Git information
|
||
* `LP_ENABLE_SVN`, if you want to have Subversion information
|
||
* `LP_ENABLE_HG`, if you want to have Mercurial information
|
||
* `LP_ENABLE_BZR`, if you want to have Bazaar information
|
||
* `LP_ENABLE_FOSSIL`, if you want to have Fossil information
|
||
* `LP_ENABLE_VCS_ROOT`, if you want to show VCS informations with root account
|
||
* `LP_ENABLE_TITLE`, if you want to use the prompt as your terminal window's title
|
||
* `LP_ENABLE_SCREEN_TITLE`, if you want to use the prompt as your screen window's title
|
||
* `LP_ENABLE_SSH_COLORS`, if you want different colors for hosts you SSH into
|
||
* `LP_ENABLE_RUNTIME`, if you want to display the runtime of the last command
|
||
* `LP_ENABLE_SUDO`, if you want the prompt mark to change color while you have password-less root access
|
||
* `LP_ENABLE_FQDN`, if you want the display of the fully qualified domain name
|
||
* `LP_ENABLE_TIME`, if you want to display the time at which the prompt was shown
|
||
* `LP_TIME_ANALOG`, if you want to show the time using an analog clock instead of numeric values
|
||
|
||
Note that if required commands are not installed, enabling the corresponding
|
||
feature will have no effect. Also, all the `LP_ENABLE_…` variables override the
|
||
templates; i.e. if you use `$LP_BATT` in your template and you set `LP_ENABLE_BATT=0`
|
||
in your configuration file, your prompt will not have any battery information.
|
||
|
||
If you are using Bash and want to use the `PROMPT_DIRTRIM` built-in
|
||
functionality to shorten but still want to have Liquid Prompt calculating the
|
||
number of directories to keep in the path, precise a value for `PROMPT_DIRTRIM`
|
||
before sourcing Liquid Prompt and it will override this value with one fitting
|
||
the width of your terminal.
|
||
|
||
You may face performances decrease when using VCS located in remote directories.
|
||
To avoid this, you can set the `LP_DISABLED_VCS_PATH` variable to a list of
|
||
absolute colon-separated paths where VCS-related features should be disabled.
|
||
|
||
|
||
## Customizing the Prompt
|
||
|
||
### Adding a Prefix/Postfix
|
||
|
||
You can prefix the `LP_PS1` variable with anything you want using
|
||
`LP_PS1_PREFIX`. The following example activate a custom window's title:
|
||
|
||
LP_PS1_PREFIX="\[\e]0;\u@\h: \w\a\]"
|
||
|
||
To postfix the prompt, use the `LP_PS1_POSTFIX` variable. For example, to add a
|
||
newline and a single character:
|
||
|
||
LP_PS1_POSTFIX="\n>"
|
||
|
||
Note: the `prompt_tag` function is a convenient way to add a prefix. You can use
|
||
it to add a keyword to each of your different terminals:
|
||
|
||
[:~/code/liquidprompt] develop ± prompt_tag mycode
|
||
mycode [:~/code/liquidprompt] develop ±
|
||
|
||
|
||
### Rearranging the Prompt
|
||
|
||
You can sort what you want to see by sourcing your favorite template file
|
||
(`*.ps1`) in the configuration file.
|
||
|
||
You can start from the `liquid.ps1` file, which show the default settings.
|
||
To use your own configuration, just set `LP_PS1_FILE` to your own file path in
|
||
your `~/.liquidpromptrc` and you're done.
|
||
|
||
Those scripts basically export the `LP_PS1` variable, by appending features and
|
||
theme colors.
|
||
|
||
Available features:
|
||
* `LP_BATT` battery
|
||
* `LP_LOAD` load
|
||
* `LP_TEMP` temperature
|
||
* `LP_JOBS` detached `screen` or `tmux` sessions/running jobs/suspended jobs
|
||
* `LP_USER` user
|
||
* `LP_HOST` hostname
|
||
* `LP_PERM` a colon (`:`)
|
||
* `LP_PWD` current working directory
|
||
* `LP_PROXY` HTTP proxy
|
||
* `LP_VCS` informations concerning the current working repository
|
||
* `LP_ERR` last error code
|
||
* `LP_MARK` prompt mark
|
||
* `LP_TITLE` the prompt as a window's title escaped sequences
|
||
* LP_TTYN the terminal basename
|
||
* `LP_BRACKET_OPEN` and `LP_BRACKET_CLOSE`, brackets enclosing the user+path part
|
||
|
||
For example, if you just want to have a prompt displaying the user and the
|
||
host, with a normal full path in blue and Git support only:
|
||
|
||
export LP_PS1=`echo -ne "[\${LP_USER}\${LP_HOST}:\${BLUE}\$(pwd)\${NO_COL}] \${LP_GIT} \\\$ "`
|
||
|
||
Note that you need to properly escape dollar signs in a string that will be
|
||
interpreted by Bash at each prompt.
|
||
|
||
To erase your new formatting, just bind `LP_PS1` to a null string:
|
||
|
||
export LP_PS1=""
|
||
|
||
|
||
## Themes
|
||
|
||
You can change the colors and special characters of some parts of Liquid Prompt
|
||
by sourcing your favorite theme file (`*.theme`) in the configuration file. See
|
||
[`liquid.theme`](liquid.theme) for an example of the default Liquid Prompt theme.
|
||
|
||
### Colors
|
||
|
||
The available colours available for use are:
|
||
|
||
`BOLD`, `BLACK`, `BOLD_GRAY`, `WHITE`, `BOLD_WHITE`, `GREEN`, `BOLD_GREEN`,
|
||
`YELLOW`, `BOLD_YELLOW`, `BLUE`, `BOLD_BLUE`, `PINK`, `CYAN`, `BOLD_CYAN,`,
|
||
`RED`, `BOLD_RED`, `WARN_RED`, `CRIT_RED`, `DANGER_RED`, and `NO_COL`.
|
||
|
||
Set the variable to a null string (`""`) if you do not want color.
|
||
|
||
* Current working directory
|
||
* `LP_COLOR_PATH` as normal user
|
||
* `LP_COLOR_PATH_ROOT` as root
|
||
* Color of the proxy mark
|
||
* `LP_COLOR_PROXY`
|
||
* Jobs count
|
||
* `LP_COLOR_JOB_D` Detached (`screen` / `tmux` sessions without attached clients)
|
||
* `LP_COLOR_JOB_R` Running (`xterm &`)
|
||
* `LP_COLOR_JOB_Z` Sleeping (Ctrl-Z)
|
||
* `LP_COLOR_IN_MULTIPLEXER` currently running in a terminal multiplexer
|
||
* Last error code
|
||
* `LP_COLOR_ERR`
|
||
* Prompt mark
|
||
* `LP_COLOR_MARK` as user
|
||
* `LP_COLOR_MARK_ROOT` as root
|
||
* `LP_COLOR_MARK_SUDO` when you did `sudo` and your credentials are still cached (use `sudo -K` to revoke them)
|
||
* `LP_MARK_PREFIX="\n"` put the prompt on the second line
|
||
* Current user
|
||
* `LP_COLOR_USER_LOGGED` user who logged in
|
||
* `LP_COLOR_USER_ALT` user but not the one who logged in
|
||
* `LP_COLOR_USER_ROOT` root
|
||
* Hostname
|
||
* `LP_COLOR_HOST` local host
|
||
* `LP_COLOR_SSH` connected via SSH
|
||
* `LP_COLOR_TELNET` connected via `telnet`
|
||
* `LP_COLOR_X11_ON` connected with X11 support
|
||
* `LP_COLOR_X11_OFF` connected without X11 support
|
||
* Separation mark (by default, the colon before the path)
|
||
* `LP_COLOR_WRITE` have write permission
|
||
* `LP_COLOR_NOWRITE` do not have write permission
|
||
* VCS
|
||
* `LP_COLOR_UP` repository is up-to-date / a push has been made
|
||
* `LP_COLOR_COMMITS` some commits have not been pushed
|
||
* `LP_COLOR_CHANGES` there are some changes to commit
|
||
* `LP_COLOR_DIFF` number of lines or files impacted by current changes
|
||
* Battery
|
||
* `LP_COLOR_CHARGING_ABOVE` charging and above threshold
|
||
* `LP_COLOR_CHARGING_UNDER` charging but under threshold
|
||
* `LP_COLOR_DISCHARGING_ABOVE` discharging but above threshold
|
||
* `LP_COLOR_DISCHARGING_UNDER` discharging and under threshold
|
||
|
||
|
||
### Special Characters
|
||
|
||
* `LP_MARK_DEFAULT` (default: "") the mark you want at the end of your prompt
|
||
(leave empty to use your shell's default mark)
|
||
* `LP_MARK_BATTERY` (default: "⌁") in front of the battery charge
|
||
* `LP_MARK_ADAPTER` (default: "⏚") displayed when plugged-in
|
||
* `LP_MARK_LOAD` (default: "⌂") in front of the load
|
||
* `LP_MARK_PROXY` (default: "↥") indicate a proxy in use
|
||
* `LP_MARK_HG` (default: "☿") prompt mark in Mercurial repositories
|
||
* `LP_MARK_SVN` (default: "‡") prompt mark in Subversion repositories
|
||
* `LP_MARK_GIT` (default: "±") prompt mark in Git repositories
|
||
* `LP_MARK_FOSSIL` (default: "⌘") prompt mark in Fossil repositories
|
||
* `LP_MARK_BZR` (default: "⚯") prompt mark in Bazaar repositories
|
||
* `LP_MARK_DISABLED` (default: "⌀") prompt mark in disabled repositories
|
||
(see `LP_DISABLED_VCS_PATH`)
|
||
* `LP_MARK_UNTRACKED` (default: "\*") if Git has untracked files
|
||
* `LP_MARK_STASH` (default: "+") if Git has stashed modifications
|
||
* `LP_MARK_BRACKET_OPEN` (default: "[") marks around the main part of the prompt
|
||
* `LP_MARK_BRACKET_CLOSE` (default: "]") marks around the main part of the prompt
|
||
* `LP_MARK_PERM` (default: ":") colored green red or green to indicate write
|
||
permissions of the current directory
|
||
* `LP_TITLE_OPEN` (default: "\e]0;") escape character opening a window's title
|
||
* `LP_TITLE_CLOSE` (default: "\a") escape character closing a window's title
|
||
|
||
|
||
## Known Limitations and Bugs
|
||
|
||
Liquid Prompt is distributed under the [GNU Affero General Public License
|
||
version 3](LICENSE).
|
||
|
||
* Does not display the number of commits to be pushed in Mercurial repositories.
|
||
* Browsing very large Subversion repositories may dramatically slow down
|
||
the display of Liquid Prompt (use `LP_DISABLED_VCS_PATH` to avoid that).
|
||
* Subversion repositories cannot display commits to be pushed because
|
||
that's not how Subversion works
|
||
* The proxy detection only uses the `$http_proxy` environment variable.
|
||
* The window's title escape sequence may not work properly on some terminals
|
||
(like `xterm-256`).
|
||
* The analog clock requires a Unicode-aware terminal and at least a
|
||
sufficiently complete font on your system. The [Symbola](http://users.teilar.gr/~g1951d/)
|
||
font, designed by Georges Douros, is known to work well. On Debian or Ubuntu
|
||
install try the `fonts-symbola` or `ttf-ancient-fonts` package.
|
||
|
||
|
||
## Authors
|
||
|
||
Current Maintainer: [![endorse](https://api.coderwall.com/dolmen/endorsecount.png)](https://coderwall.com/dolmen)
|
||
|
||
Original Author: [![endorse](https://api.coderwall.com/nojhan/endorsecount.png)](https://coderwall.com/nojhan)
|
||
|
||
And many contributors!
|