114 lines
3.0 KiB
Bash
114 lines
3.0 KiB
Bash
prompt_fresh_help() {
|
|
echo "\
|
|
options:
|
|
-a enable almostontop like behaviour
|
|
-r recompile git-prompt executable"
|
|
}
|
|
|
|
prompt_fresh_setup() {
|
|
# Parse options
|
|
local almostontop=0
|
|
local recompile=0
|
|
while getopts 'ar' opt; do
|
|
case $opt in
|
|
a) local almostontop=1 ;;
|
|
r) local recompile=1 ;;
|
|
*) prompt -h fresh; return 1 ;;
|
|
esac
|
|
done
|
|
|
|
autoload -U add-zsh-hook
|
|
|
|
# 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, this is preferable
|
|
# since sometimes lines before the prompt can 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
|
|
|
|
[ $recompile -eq 1 ] && prompt_cleanup
|
|
fresh_compile_git_prompt
|
|
|
|
if [ "$USER" = "root" ]; then
|
|
local user="%{%F{1}%}%n%{%f%}"
|
|
else
|
|
local user="%{%F{35}%}%n%{%f%}"
|
|
fi
|
|
|
|
local userhost=$USER
|
|
if [ "$SSH_CONNECTION" != "" ]; then
|
|
local user="$user@%{%F{244}%}%M%{%f%}"
|
|
local userhost="$userhost@`hostname`"
|
|
fi
|
|
|
|
PS1="«$user» "
|
|
PS2="«${(l:${#userhost}:: :)}» "
|
|
|
|
prompt_opts=(percent sp subst)
|
|
}
|
|
|
|
prompt_cleanup() {
|
|
[ -f ~/.cache/zsh/git-prompt ] && rm ~/.cache/zsh/git-prompt
|
|
}
|
|
|
|
fresh_line_one() {
|
|
# First get the last commands exit code before doing anything
|
|
local exit_code=$?
|
|
|
|
# Construct the time and directory portions of the prompt
|
|
local time_stamp="%{%F{244}%}%D{%H:%M:%S}%{%f%}"
|
|
[[ -n $SANDBOX_HOME ]] && \
|
|
local directory="%{%F{3}%}$SANDBOX_NAME${PWD#$SANDBOX_HOME}%{%f%}" || \
|
|
local directory="%{%F{37}%}%~%{%f%}"
|
|
|
|
# Check we are in a git repository
|
|
local git=`~/.cache/zsh/git-prompt`
|
|
|
|
# If the last command failed, display its error code at the right
|
|
if [[ $exit_code -ne 0 ]]; then
|
|
local result=" %{%B%F{1}%}$exit_code%{%f%b%}"
|
|
fi
|
|
|
|
# If a virtualenv is enabled, display it's basename
|
|
if [[ ! -z "$VIRTUAL_ENV" ]]; then
|
|
local py=" %{%F{4}%}py%{%f%}%{%F{3}%}$(basename $VIRTUAL_ENV)%{%f%}"
|
|
fi
|
|
|
|
# If docker-machine env is active, display the machines name
|
|
if [[ ! -z "$DOCKER_MACHINE_NAME" ]]; then
|
|
local docker=" %{%F{6}%}$DOCKER_MACHINE_NAME%{%f%}"
|
|
fi
|
|
|
|
# Print the first line of the prompt
|
|
print -P "$time_stamp $directory$git$py$docker$result"
|
|
}
|
|
|
|
fresh_almostontop() {
|
|
clear
|
|
fresh_line_one
|
|
print -P "$PROMPT"'$1'
|
|
}
|
|
|
|
fresh_compile_git_prompt() {
|
|
# Compile a simple C program which parses the output of `git status
|
|
# --procelain` to greatly decrease the time taken to draw the prompt
|
|
[ ! -d ~/.cache/zsh ] && mkdir -p ~/.cache/zsh
|
|
if [ ! -f ~/.cache/zsh/git-prompt ]; then
|
|
cc -std=gnu99 -O3 -DNDEBUG -Wno-unused-result \
|
|
~/.config/zsh/git-prompt.c -o ~/.cache/zsh/git-prompt
|
|
if [ $? -ne 0 ]; then
|
|
echo "git-prompt was not compiled, is a C99 toolchain installed?"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
prompt_fresh_setup "$@"
|
|
|
|
# vim:ft=zsh
|