215 lines
6.3 KiB
Bash
215 lines
6.3 KiB
Bash
#!/bin/zsh
|
|
#
|
|
# This file was written by Bart Trojanowski <bart@jukie.net>
|
|
#
|
|
# documented on my blog:
|
|
# http://www.jukie.net/~bart/blog/tag/zsh
|
|
#
|
|
# references
|
|
# http://www.zsh.org/mla/users/2006/msg01196.html
|
|
# http://dotfiles.org/~frogb/.zshrc
|
|
# http://kriener.org/articles/2009/06/04/zsh-prompt-magic
|
|
|
|
setopt prompt_subst
|
|
autoload colors
|
|
colors
|
|
|
|
autoload -Uz vcs_info
|
|
|
|
# -------------------------------
|
|
# define core prompt functions
|
|
|
|
# set some colors
|
|
for COLOR in RED GREEN BLUE YELLOW WHITE BLACK CYAN; do
|
|
eval PR_$COLOR='%{$fg[${(L)COLOR}]%}'
|
|
eval PR_BRIGHT_$COLOR='%{$fg_bold[${(L)COLOR}]%}'
|
|
done
|
|
PR_RST="%{${reset_color}%}"
|
|
PR_RESET="%{%b%s%u$reset_color%}"
|
|
PR_BG="%{%(?.$PR_RESET.%S)%}"
|
|
|
|
# set formats
|
|
# %b - branchname
|
|
# %u - unstagedstr (see below)
|
|
# %c - stangedstr (see below)
|
|
# %a - action (e.g. rebase-i)
|
|
# %R - repository path
|
|
# %S - path in the repository
|
|
FMT_BRANCH="${PR_GREEN}%b%u%c${PR_RST}" # e.g. master¹²
|
|
FMT_ACTION="(${PR_CYAN}%a${PR_RST}%)" # e.g. (rebase-i)
|
|
FMT_PATH="%R${PR_YELLOW}/%S" # e.g. ~/repo/subdir
|
|
|
|
# check-for-changes can be really slow.
|
|
# you should disable it, if you work with large repositories
|
|
zstyle ':vcs_info:*:prompt:*' check-for-changes true
|
|
zstyle ':vcs_info:*:prompt:*' unstagedstr '¹' # display ¹ if there are unstaged changes
|
|
zstyle ':vcs_info:*:prompt:*' stagedstr '²' # display ² if there are staged changes
|
|
zstyle ':vcs_info:*:prompt:*' actionformats "${FMT_BRANCH}${FMT_ACTION}//" "${FMT_PATH}"
|
|
zstyle ':vcs_info:*:prompt:*' formats "${FMT_BRANCH}//" "${FMT_PATH}"
|
|
zstyle ':vcs_info:*:prompt:*' nvcsformats "" "%~"
|
|
|
|
function lprompt {
|
|
local brackets=$1
|
|
local color1=$2
|
|
local color2=$3
|
|
|
|
local bracket_open="${color1}${brackets[1]}${PR_BG}"
|
|
local bracket_close="${color1}${brackets[2]}${PR_RESET}"
|
|
|
|
local git='$vcs_info_msg_0_'
|
|
local cwd="${color2}%B%1~%b"
|
|
|
|
local vimode='${PR_VIMODE}'
|
|
local vicol='${PR_VICOLOR}'
|
|
|
|
#PROMPT="${PR_BG}${bracket_open}${git}${cwd}${bracket_close} ${vicol}${vimode}${PR_RESET} "
|
|
PROMPT="${PR_BG}${bracket_open}${git}${cwd}${bracket_close} ${vicol}${vimode}${PR_RESET} "
|
|
}
|
|
|
|
function rprompt {
|
|
local brackets=$1
|
|
local color1=$2
|
|
local color2=$3
|
|
|
|
local bracket_open="${color1}${brackets[1]}${PR_RESET}"
|
|
local bracket_close="${color1}${brackets[2]}${PR_RESET}"
|
|
local colon="${color1}:"
|
|
local at="${color1}@${PR_RESET}"
|
|
|
|
local user_host="${color2}%n${at}${color2}%m"
|
|
local vcs_cwd='${${vcs_info_msg_1_%%.}/$HOME/~}'
|
|
local cwd="${color2}%B%20<..<${vcs_cwd}%<<%b"
|
|
local inner="${user_host}${colon}${cwd}"
|
|
|
|
RPROMPT="${PR_RESET}${bracket_open}${inner}${bracket_close}${PR_RESET}"
|
|
}
|
|
|
|
# -------------------------------
|
|
# host dependent colouring
|
|
|
|
#lprompt '[]' $PR_BRIGHT_BLACK $PR_WHITE
|
|
#rprompt '()' $PR_BRIGHT_BLACK $PR_WHITE
|
|
|
|
if [ $UID -eq 0 ]; then
|
|
lprompt '<>' $PR_RED $PR_RED
|
|
rprompt '<>' $PR_RED $PR_RED
|
|
else
|
|
case $HOST in
|
|
xenon)
|
|
lprompt '[]' $PR_BRIGHT_BLACK $PR_GREEN
|
|
rprompt '()' $PR_YELLOW $PR_WHITE
|
|
;;
|
|
oxygen*)
|
|
lprompt '[]' $PR_WHITE $PR_GREEN
|
|
rprompt '()' $PR_YELLOW $PR_WHITE
|
|
;;
|
|
|
|
meson*)
|
|
lprompt '<>' $PR_RED $PR_YELLOW
|
|
rprompt '<>' $PR_RED $PR_WHITE
|
|
;;
|
|
muon*)
|
|
lprompt '<>' $PR_RED $PR_BLUE
|
|
rprompt '<>' $PR_RED $PR_WHITE
|
|
;;
|
|
quark*)
|
|
lprompt '<>' $PR_RED $PR_GREEN
|
|
rprompt '<>' $PR_RED $PR_WHITE
|
|
;;
|
|
|
|
*)
|
|
if [ "${$(hostname -f)#*.}" = "jukie.net" ]; then
|
|
lprompt '[]' $PR_BRIGHT_BLACK $PR_WHITE
|
|
rprompt '()' $PR_BRIGHT_BLACK $PR_WHITE
|
|
else
|
|
lprompt '{}' $PR_WHITE $PR_WHITE
|
|
rprompt '()' $PR_WHITE $PR_WHITE
|
|
fi
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
if [ -n "$debian_chroot" ]; then
|
|
PROMPT="$bgc%{$fg[yellow]%}%B${debian_chroot}%b ${PROMPT}"
|
|
fi
|
|
|
|
# ------------------------------
|
|
# update the vcs_info_msg_ magic variables, but only as little as possible
|
|
|
|
# This variable dictates weather we are going to do the git prompt update
|
|
# before printing the next prompt. On some setups this saves 10s of work.
|
|
PR_GIT_UPDATE=1
|
|
|
|
# called before command excution
|
|
# here we decide if we should update the prompt next time
|
|
function zsh_git_prompt_preexec {
|
|
case "$(history $HISTCMD)" in
|
|
*git*)
|
|
PR_GIT_UPDATE=1
|
|
;;
|
|
esac
|
|
}
|
|
preexec_functions+='zsh_git_prompt_preexec'
|
|
|
|
# called after directory change
|
|
# we just assume that we have to update git prompt
|
|
function zsh_git_prompt_chpwd {
|
|
PR_GIT_UPDATE=1
|
|
}
|
|
chpwd_functions+='zsh_git_prompt_chpwd'
|
|
|
|
# called before prompt generation
|
|
# if needed, we will update the prompt info
|
|
function zsh_git_prompt_precmd {
|
|
if [[ -n "$PR_GIT_UPDATE" ]] ; then
|
|
vcs_info 'prompt'
|
|
PR_GIT_UPDATE=
|
|
fi
|
|
}
|
|
precmd_functions+='zsh_git_prompt_precmd'
|
|
|
|
# ------------------------------
|
|
# handle vi NORMAL/INSERT mode change
|
|
PR_VIMODE="#"
|
|
PR_VICOLOR=${PR_BLUE}
|
|
function zle-line-init zle-keymap-select {
|
|
PR_VIMODE="${${KEYMAP/vicmd/¢}/(main|viins)/$}"
|
|
PR_VICOLOR="${${KEYMAP/vicmd/${PR_RED}}/(main|viins)/${PR_GREEN}}"
|
|
zle reset-prompt
|
|
}
|
|
zle -N zle-line-init
|
|
zle -N zle-keymap-select
|
|
|
|
# ------------------------------
|
|
# this stuff updates screen and xterm titles as the command runs
|
|
|
|
case $TERM in
|
|
xterm* | rxvt* | urxvt*)
|
|
function zsh_term_prompt_precmd {
|
|
print -Pn "\e]0;%n@%m: %~\a"
|
|
}
|
|
function zsh_term_prompt_preexec {
|
|
local x="${${${1//\"/\\\"}//\$/\\\\\$}//\%/%%}"
|
|
print -Pn "\e]0;%n@%m: %~ $x\a"
|
|
}
|
|
preexec_functions+='zsh_term_prompt_preexec'
|
|
precmd_functions+='zsh_term_prompt_precmd'
|
|
;;
|
|
screen*)
|
|
function zsh_term_prompt_precmd {
|
|
print -nR $'\033k'"zsh"$'\033'\\\
|
|
|
|
print -nR $'\033]0;'"zsh"$'\a'
|
|
}
|
|
function zsh_term_prompt_preexec {
|
|
local x="${${${1//\"/\\\"}//\$/\\\\\$}//\%/%%}"
|
|
print -nR $'\033k'"$x"$'\033'\\\
|
|
|
|
print -nR $'\033]0;'"$x"$'\a'
|
|
}
|
|
preexec_functions+='zsh_term_prompt_preexec'
|
|
precmd_functions+='zsh_term_prompt_precmd'
|
|
;;
|
|
esac
|
|
|