Theme changes
 * Load colors before base theme so they can be used by base theme
 * Change git-specific variables to SCM-agnostic ones
diff --git a/themes/base.theme.bash b/themes/base.theme.bash
index f898875..9ae5d0e 100644
--- a/themes/base.theme.bash
+++ b/themes/base.theme.bash
@@ -1,27 +1,82 @@
 #!/bin/bash
 
-# Stolen from Steve Losh
-function prompt_char {
-    git branch >/dev/null 2>/dev/null && echo -e '±' && return
-    hg root >/dev/null 2>/dev/null && echo -e '☿' && return
-    echo -e '○'
-}
+SCM_THEME_PROMPT_DIRTY=' ✗'
+SCM_THEME_PROMPT_CLEAN=' ✓'
+SCM_THEME_PROMPT_PREFIX=' |'
+SCM_THEME_PROMPT_SUFFIX='|'
 
-function parse_git_dirty {
-  if [[ -n $(git status -s 2> /dev/null) ]]; then
-    echo -e "$GIT_THEME_PROMPT_DIRTY"
-  else
-    echo -e "$GIT_THEME_PROMPT_CLEAN"
+GIT='git'
+SCM_GIT_CHAR='±'
+
+HG='hg'
+SCM_HG_CHAR='☿'
+
+SVN='svn'
+SCM_SVN_CHAR='⑆'
+
+SCM_NONE_CHAR='○'
+
+RVM_THEME_PROMPT_PREFIX=' |'
+RVM_THEME_PROMPT_SUFFIX='|'
+
+function scm {
+  if [[ -d .git ]]; then SCM=$GIT
+  elif [[ -d .hg ]]; then SCM=$HG
+  elif [[ -d .svn ]]; then SCM=$SVN
+  else SCM='NONE'
   fi
 }
 
-function git_prompt_info() {
-  ref=$(git symbolic-ref HEAD 2> /dev/null) || return
-  echo -e "$GIT_THEME_PROMPT_PREFIX${ref#refs/heads/}$(parse_git_dirty)$GIT_THEME_PROMPT_SUFFIX"
+function scm_char {
+  if [[ -z $SCM ]]; then scm; fi
+  [[ $SCM == $GIT ]] && echo $SCM_GIT_CHAR && return
+  [[ $SCM == $HG ]] && echo $SCM_HG_CHAR && return
+  [[ $SCM == $SVN ]] && echo $SCM_SVN_CHAR && return
+  echo $SCM_NONE_CHAR
 }
 
+function scm_prompt_info {
+  if [[ -z $SCM ]]; then scm; fi
+  [[ $SCM == $GIT ]] && git_prompt_info && return
+  [[ $SCM == $HG ]] && hg_prompt_info && return
+  [[ $SCM == $SVN ]] && svn_prompt_info && return
+}
 
-function rvm_version_prompt() {
+# Stolen from Steve Losh
+# left in for backwards-compatibility
+function prompt_char {
+    char=$(scm_char);
+    echo -e "$char"
+}
+
+function git_prompt_info {
+  if [[ -n $(git status -s 2> /dev/null) ]]; then
+      state=${GIT_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
+  else
+      state=${GIT_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
+  fi
+  prefix=${GIT_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
+  suffix=${GIT_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
+  ref=$(git symbolic-ref HEAD 2> /dev/null) || return
+
+  echo -e "$prefix${ref#refs/heads/}$state$suffix"
+}
+
+function svn_prompt_info {
+  if [[ -n $(svn status 2> /dev/null) ]]; then
+      state=${SVN_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
+  else
+      state=${SVN_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
+  fi
+  prefix=${SVN_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
+  suffix=${SVN_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
+  ref=$(svn info 2> /dev/null | awk -F/ '/^URL:/ { for (i=0; i<=NF; i++) { if ($i == "branches" || $i == "tags" ) { print $(i+1); break }; if ($i == "trunk") { print $i; break } } }') || return
+
+  [[ -z $ref ]] && return
+  echo -e "$prefix$ref$state$suffix"
+}
+
+function rvm_version_prompt {
   if which rvm &> /dev/null; then
     rvm=$(rvm tools identifier) || return
     echo -e "$RVM_THEME_PROMPT_PREFIX$rvm$RVM_THEME_PROMPT_SUFFIX"