Add -a option to enable almostontop behaviour

* Add option parsing to `prompt_fresh_setup` to detect when options are
  set during setup.
* Add `-a` option to enable almostontop behaviour, every time a command
  is invoked the screen is cleared and the is prompt redrawn before the
  command begins using the `preexec` hook. `-a` is disabled by default.
* Add `prompt_fresh_help` function to display a description of available
  options using `prompt -h fresh`.
* Canonicalize all utility functions for the fresh prompt theme to
  follow the `fresh_<name>` convention.

Fixes #1.
This commit is contained in:
Kenneth Benzie 2018-04-15 16:22:08 +01:00
parent 2c189c87e6
commit 7653ea6f93

View File

@ -1,8 +1,35 @@
prompt_fresh_help() {
echo "\
options:
-a enable almostontop like behaviour"
}
prompt_fresh_setup() {
compile_git_prompt
fresh_compile_git_prompt
# Parse options
local almostontop=0
while getopts 'a' opt; do
case $opt in
a) local almostontop=1 ;;
*) prompt -h fresh; return 1 ;;
esac
done
autoload -U add-zsh-hook
add-zsh-hook precmd fresh_precmd
# Hook to print the first line of the "two line" prompt, this line is not
# actually part of the prompt so does not get redrawn which can sometimes
# cause lines before the prompt to disappear.
add-zsh-hook precmd fresh_line_one
if [ $almostontop -eq 1 ]; then
# Hook to clear the screen then prints the prompt with previous command at
# the top of the screen.
add-zsh-hook preexec fresh_almostontop
else
add-zsh-hook -d preexec fresh_almostontop
fi
if [ "$USERNAME" = "root" ]; then
local user="%{%F{9}%}%n%{%f%}"
@ -14,7 +41,7 @@ prompt_fresh_setup() {
local user="%{%F{35}%}$user%{%f%}@%{%F{244}%}%M%{%f%}"
fi
local length=`visible_length "$user"`
local length=`fresh_visible_length "$user"`
PS1="«$user» "
PS2="${(l:$length + 1:: :)}» "
@ -28,7 +55,7 @@ prompt_cleanup() {
if [ -f ~/.cache/zsh/git-prompt ]; then rm ~/.cache/zsh/git-prompt; fi
}
fresh_precmd() {
fresh_line_one() {
# First get the last commands exit code before doing anything
local exit_code=$?
@ -99,7 +126,7 @@ fresh_precmd() {
else
# The last command failed, display its error code at the right
local result="%{%B%F{1}%}$exit_code%{%f%b%}"
local length=`visible_length "$line$result"`
local length=`fresh_visible_length "$line$result"`
print -P "$line${(l:COLUMNS - $length - 1:: :)}$result"
fi
}
@ -115,11 +142,17 @@ fresh_rprompt() {
echo $rprompt
}
visible_length() {
fresh_almostontop() {
clear
fresh_line_one
print -P "$PROMPT"'$1'
}
fresh_visible_length() {
echo $(( ${#${(S%%)1//(\%(KF1]|)\{*\}|\%[Bbkf])}} ))
}
compile_git_prompt() {
fresh_compile_git_prompt() {
# Compile a simple C executable which parses the output of `git status
# --procelain` to greatly decrease the time taken to render the prompt
local cache=~/.cache/zsh