This commit is contained in:
Marcel Hoyer 2012-12-16 02:17:56 -08:00
commit ba0273eeaf
4 changed files with 155 additions and 0 deletions

83
lib/scm.zsh Normal file
View file

@ -0,0 +1,83 @@
# SCM_DEBUG=yes # comment line to disable debugging
declare -A _SCM_PROMPT_CHARS
_SCM_TYPES=(git hg svn) && export _SCM_TYPES
_SCM_PROMPT_CHARS[git]=±
_SCM_PROMPT_CHARS[hg]=ʜɢ
_SCM_PROMPT_CHARS[svn]=svn
function _scm_debug { [ $SCM_DEBUG ] && echo $(xterm_color 237 "$*") >&2 }
# Checks given 1st path argument if it's root of .git|.hg|.svn
function _scm_get_scm_type {
[[ "$1" = "/" ]] && return 1
for type ($_SCM_TYPES) {
[ ! -d "$1/.$type" ] && continue
export SCM_ROOT="$1"
export SCM_TYPE=$type
return 0
}
return 1
}
function _scm_reset {
_scm_debug 'scm reset'
unset SCM_ROOT
unset SCM_TYPE
unset SCM_PROMPT_INFO
}
# Recursive lookup for possible SCM root
function scm_detect_root {
_DETECT_WD=${1:-$PWD}
# skip detection if SCM root already detected and current folder is sub folder of SCM
[ $SCM_ROOT ] && [[ $_DETECT_WD == $SCM_ROOT* ]] && return
_scm_reset
until [ "$_DETECT_WD" = "" ]; do
_scm_get_scm_type "$_DETECT_WD" && return
_DETECT_WD=${_DETECT_WD%/*}
done
}
function scm_prompt_char() {
[ ! $SCM_TYPE ] && return
echo $_SCM_PROMPT_CHARS[$SCM_TYPE]
}
function scm_prompt_info_for_git() { echo "$(git_prompt_info)$(git_prompt_status)" }
function scm_prompt_info_for_hg() {}
function scm_prompt_info_for_svn() {}
function scm_build_prompt_info() {
[ ! $SCM_TYPE ] && return
SCM_DATA_DIR=$SCM_ROOT/.$SCM_TYPE
SCM_PROMPT_CACHE_FILE=$SCM_DATA_DIR/prompt_cache
if [ ! -e "$SCM_PROMPT_CACHE_FILE" ]; then
_scm_debug "Creating $SCM_PROMPT_CACHE_FILE"
touch "$SCM_PROMPT_CACHE_FILE"
SCM_PROMPT_INFO=$(scm_prompt_info_for_$SCM_TYPE) # calls scm type specific prompt generator
else
LAST_UPDATE_TIME=`stat -c %Y $SCM_PROMPT_CACHE_FILE`
DIRSTATE_TIME=`stat -c %Y $SCM_DATA_DIR`
if [[ $DIRSTATE_TIME -gt $LAST_UPDATE_TIME || "$1" == "force" ]]; then
_scm_debug "Updating $SCM_PROMPT_CACHE_FILE"
SCM_PROMPT_INFO=$(scm_prompt_info_for_$SCM_TYPE) # calls scm type specific prompt generator
touch "$SCM_PROMPT_CACHE_FILE"
fi
fi
SCM_PROMPT_INFO=${SCM_PROMPT_INFO:-$(scm_prompt_info_for_$SCM_TYPE)}
export SCM_PROMPT_INFO
}

View file

@ -32,6 +32,39 @@ function omz_termsupport_preexec {
title "$CMD" "%100>...>${2:gs/%/%%}%<<"
}
# Prints given 2nd argument with xterm color code of 1st argument
# see http://www.calmar.ws/vim/256-xterm-24bit-rgb-color-chart.html for color codes
function xterm_color() {
echo -e "%{\033[38;5;$1m%}$2%{\033[0m%}"
}
function xterm_color_open() {
echo -e "%{\033[38;5;$1m%}"
}
function xterm_color_reset() {
echo -e "%{\033[0m%}"
}
function _show_colors() {
T='■' # The test text
echo -e "\n 40m 41m 42m 43m 44m 45m 46m 47m";
for FGs in ' m' ' 1m' ' 30m' '1;30m' \
' 31m' '1;31m' ' 32m' '1;32m' \
' 33m' '1;33m' ' 34m' '1;34m' \
' 35m' '1;35m' ' 36m' '1;36m' \
' 37m' '1;37m';
do FG=${FGs// /}
echo -en " $FGs \033[$FG $T "
for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
do echo -en "$EINS \033[$FG\033[$BG $T \033[0m";
done
echo;
done
}
autoload -U add-zsh-hook
add-zsh-hook precmd omz_termsupport_precmd
add-zsh-hook preexec omz_termsupport_preexec