Add an analog clock

Using `LP_TIME_ANALOG`, you can now display an analog clock instead of
numeric values. The analog clock is "accurate" to the nearest half hour.
This commit is contained in:
nojhan 2013-04-20 21:51:55 +02:00
parent 42af71d3f1
commit 91959b636a
3 changed files with 70 additions and 10 deletions

View File

@ -28,13 +28,17 @@ in a git repository on a server, at branch "myb":
A liquid prompt displaying everything (a rare event!) may look like this: A liquid prompt displaying everything (a rare event!) may look like this:
`code ⌁24% ⌂42% 3d/2&/1z [user@server:~/ … /code/liquidprompt]↥ master(+10/-5,3)*+ 125 ± ` `code 🕤 ⌁24% ⌂42% 3d/2&/1z [user@server:~/ … /code/liquidprompt][pyenv]↥ master(+10/-5,3)*+ 125 ± `
It displays: It (may) displays:
* a green ⌁ if the battery is charging and above a given threshold, * A tag associated to the current shell session (you can easily add any
a yellow ⌁ if the battery is charging and under threshold, prefix tag to your prompt, by invoking `prompt_tag MYTAG`).
a red ⌁ if the battery is discharging but above threshold; * The current time, either as numerci values or an analog clock,
* a green ⏚ if the battery is charging, above the given threshold, but not charged,
a yellow ⏚ if the battery is charging and under threshold,
a yellow ⌁ if the battery is discharging but above threshold,
a red ⌁ if the battery is discharging and under threshold;
* the average of the batteries remaining power, if it is under the given * the average of the batteries remaining power, if it is under the given
threshold, with a colormap, going more and more red with decreasing power; threshold, with a colormap, going more and more red with decreasing power;
* the average of the processors load, if it is over a given limit, with a * the average of the processors load, if it is over a given limit, with a
@ -66,11 +70,10 @@ changes have been made and the number of pending commits, if any;
* a yellow plus if there is stashed modifications; * a yellow plus if there is stashed modifications;
* a red star if there is some untracked files in the repository; * a red star if there is some untracked files in the repository;
* the error code of the last command, if it has failed in some way; * the error code of the last command, if it has failed in some way;
* a smart mark: ± for git directories, ☿ for mercurial, ‡ for svn, * a smart mark: ± for git directories, ☿ for mercurial, ‡ for svn,
for fossil, $ for simple user, a red # for root; ‡± for git-svn, ⌘ for fossil, $ or % for simple user, a red # for root;
* if you ask for, the liquidprompt will be replicated in your terminal window's * if you ask for, the liquidprompt will be replicated in your terminal window's
title (without the colors); title (without the colors);
* you can easily add a prefix tag to your prompt, by invoking `prompt_tag MYTAG`.
You can temporarily deactivate the liquid prompt and come back to your previous You can temporarily deactivate the liquid prompt and come back to your previous
one by typing `prompt_off`. Use `prompt_on` to bring it back. You can deactivate one by typing `prompt_off`. Use `prompt_on` to bring it back. You can deactivate
@ -140,6 +143,8 @@ building:
* `LP_ENABLE_TITLE`, if you want to use the prompt as your terminal window's title * `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_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 in * `LP_ENABLE_SSH_COLORS`, if you want different colors for hosts you SSH in
* `LP_ENABLE_TIME`, if you want to display the time at which the prompt was shown
* `LP_TIME_ANALOG`, when showing time, use an analog clock instead of numeric values
Note that if required commands are not installed, enabling the Note that if required commands are not installed, enabling the
corresponding feature will have no effect. corresponding feature will have no effect.
@ -298,10 +303,12 @@ version 3.
* Does not display the number of commits to be pushed in Mercurial repositories. * Does not display the number of commits to be pushed in Mercurial repositories.
* Browsing into very large subversion repositories may dramatically slow down * Browsing into very large subversion repositories may dramatically slow down
the display of the liquid prompt. the display of the liquid prompt (use `LP_DISABLED_VCS_PATH` to avoid that).
* Subversion repository cannot display commits to be pushed, this is a * Subversion repository cannot display commits to be pushed, this is a
limitation of the Subversion versionning model. limitation of the Subversion versionning model.
* The proxy detection only uses the `$http_proxy` environment variable. * The proxy detection only uses the `$http_proxy` environment variable.
* The window's title escape sequence may not work properly on some terminals * The window's title escape sequence may not work properly on some terminals
(like xterm-256) (like xterm-256)
* The analog clock necessitate a unicode-aware terminal and a sufficiently
complete font.

View File

@ -1299,10 +1299,56 @@ _lp_sb()
################### ###################
# CURRENT TIME # # CURRENT TIME #
################### ###################
_lp_time_analog()
{
# get the date as "hours(12) minutes" in a single call
# make a bash array with it
d=( $(date "+%I %M") )
# separate hours and minutes
hour=${d[0]#0} # no leading 0
min=${d[1]#0}
# The targeted unicode characters are the "CLOCK FACE" ones
# They are located in the codepages between:
# U+1F550 (ONE OCLOCK) and U+1F55B (TWELVE OCLOCK), for the plain hours
# U+1F55C (ONE-THIRTY) and U+1F567 (TWELVE-THIRTY), for the thirties
#
# Those codes may be output with unicode escapes or hexadecimal escapes,
# the later being the more portable.
#
# But we can iterate only over integers.
#
# We thus need the following conversion table:
# utf hex int
# hours 50:5B 90:9b 144:155
# half 5C:67 9c:a7 156:167
# The characters being grouped bas plain/thirty, we must first now
# if we are close to the 0 or 30 minutes.
# Bash using integer arithmetic by default, we do not need rounding.
# We thus add 0 (plain hour) or 12 (half).
# Then we add 144, which is the first index (as an integer).
mi=$((144+12*($min/30)))
# Add the computed minutes index (144 or 156) minus 1 (because the first hour starts at 0).
hi=$(($mi+$hour-1))
# Get the hexadecimal representation of this integer
hex=$(printf "%x" $hi)
# Print the first three bytes (that are always the same) and the computed last one.
# Add a space for correct alignement
echo -ne "\xf0\x9f\x95\x$hex "
}
_lp_time() _lp_time()
{ {
[[ "$LP_ENABLE_TIME" != 1 ]] && return [[ "$LP_ENABLE_TIME" != 1 ]] && return
echo -ne "${LP_COLOR_TIME}${_LP_TIME_SYMBOL}${NO_COL}" if [[ "$LP_TIME_ANALOG" != 1 ]]; then
echo -ne "${LP_COLOR_TIME}${_LP_TIME_SYMBOL}${NO_COL}"
else
echo -ne "${LP_COLOR_TIME}$(_lp_time_analog)${NO_COL}"
fi
} }
######################## ########################

View File

@ -95,6 +95,13 @@ LP_ENABLE_BZR=1
# Recommended value is 0 # Recommended value is 0
LP_ENABLE_TIME=0 LP_ENABLE_TIME=0
# When showing time, use an analog clock instead of numeric values.
# The analog clock is "accurate" to the nearest half hour.
# You must have a unicode-capable terminal and a font with the "CLOCK"
# characters.
# Recommended value is 0
LP_TIME_ANALOG=0
# Use the liquid prompt as the title of the terminal window # Use the liquid prompt as the title of the terminal window
# This may not work properly on exotic terminals, thus the # This may not work properly on exotic terminals, thus the
# recommended value is 0 # recommended value is 0