bc9fe7423f5d8c639b208ebb9a7dbfce078bfd9b

Author
Marc Cornellà <marc.cornella@live.com>
Committer
GitHub <noreply@github.com>
Date

Message

Merge pull request #8651 from mcornella/random-theme-refactor

Add random theme and consolidate logic from init and themes plugin

Diff

  1diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh
  2index c3fae6efb7f727adce57e42ca140961b76c9950d..30259372cd9f828a9308f3bd4a013afa85c95574 100644
  3--- a/oh-my-zsh.sh
  4+++ b/oh-my-zsh.sh
  5@@ -97,25 +97,12 @@ done
  6 unset config_file
  7 
  8 # Load the theme
  9-if [[ "$ZSH_THEME" == "random" ]]; then
 10-  if [[ "${(t)ZSH_THEME_RANDOM_CANDIDATES}" = "array" ]] && [[ "${#ZSH_THEME_RANDOM_CANDIDATES[@]}" -gt 0 ]]; then
 11-    themes=($ZSH/themes/${^ZSH_THEME_RANDOM_CANDIDATES}.zsh-theme)
 12+if [ ! "$ZSH_THEME" = ""  ]; then
 13+  if [ -f "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme" ]; then
 14+    source "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme"
 15+  elif [ -f "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme" ]; then
 16+    source "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme"
 17   else
 18-    themes=($ZSH/themes/*zsh-theme)
 19-  fi
 20-  N=${#themes[@]}
 21-  ((N=(RANDOM%N)+1))
 22-  RANDOM_THEME=${themes[$N]}
 23-  source "$RANDOM_THEME"
 24-  echo "[oh-my-zsh] Random theme '$RANDOM_THEME' loaded..."
 25-else
 26-  if [ ! "$ZSH_THEME" = ""  ]; then
 27-    if [ -f "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme" ]; then
 28-      source "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme"
 29-    elif [ -f "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme" ]; then
 30-      source "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme"
 31-    else
 32-      source "$ZSH/themes/$ZSH_THEME.zsh-theme"
 33-    fi
 34+    source "$ZSH/themes/$ZSH_THEME.zsh-theme"
 35   fi
 36 fi
 37diff --git a/plugins/themes/_theme b/plugins/themes/_theme
 38deleted file mode 100644
 39index 8214ddb0dd14f3e996da7f678140a1c913e45430..0000000000000000000000000000000000000000
 40--- a/plugins/themes/_theme
 41+++ /dev/null
 42@@ -1,3 +0,0 @@
 43-#compdef theme
 44-
 45-_arguments "1: :($(lstheme | tr "\n" " "))"
 46diff --git a/plugins/themes/themes.plugin.zsh b/plugins/themes/themes.plugin.zsh
 47index 2cd0ee3277006e079bd4c20dc09419976f6150a4..1fbde5b6463565ad2925aad780ac6fbfd25cc18f 100644
 48--- a/plugins/themes/themes.plugin.zsh
 49+++ b/plugins/themes/themes.plugin.zsh
 50@@ -1,26 +1,27 @@
 51-function theme
 52-{
 53-    if [ -z "$1" ] || [ "$1" = "random" ]; then
 54-	themes=($ZSH/themes/*zsh-theme)
 55-	N=${#themes[@]}
 56-	((N=(RANDOM%N)+1))
 57-	RANDOM_THEME=${themes[$N]}
 58-	source "$RANDOM_THEME"
 59-	echo "[oh-my-zsh] Random theme '$RANDOM_THEME' loaded..."
 60+function theme {
 61+    : ${1:=random} # Use random theme if none provided
 62+
 63+    if [[ -f "$ZSH_CUSTOM/$1.zsh-theme" ]]; then
 64+        source "$ZSH_CUSTOM/$1.zsh-theme"
 65+    elif [[ -f "$ZSH_CUSTOM/themes/$1.zsh-theme" ]]; then
 66+        source "$ZSH_CUSTOM/themes/$1.zsh-theme"
 67+    elif [[ -f "$ZSH/themes/$1.zsh-theme" ]]; then
 68+        source "$ZSH/themes/$1.zsh-theme"
 69     else
 70-	if [ -f "$ZSH_CUSTOM/themes/$1.zsh-theme" ]
 71-	then
 72-	    source "$ZSH_CUSTOM/themes/$1.zsh-theme"
 73-	else
 74-	    source "$ZSH/themes/$1.zsh-theme"
 75-	fi
 76+        echo "$0: Theme '$1' not found"
 77+        return 1
 78     fi
 79 }
 80 
 81-function lstheme
 82-{
 83+function _theme {
 84+    _arguments "1: :($(lstheme))"
 85+}
 86+
 87+compdef _theme theme
 88+
 89+function lstheme {
 90     # Resources:
 91     # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Modifiers
 92     # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Qualifiers
 93-    print -l {$ZSH,$ZSH_CUSTOM}/themes/*.zsh-theme(N:t:r)
 94+    print "$ZSH_CUSTOM"/*.zsh-theme(N:t:r) {"$ZSH_CUSTOM","$ZSH"}/themes/*.zsh-theme(N:t:r)
 95 }
 96diff --git a/themes/random.zsh-theme b/themes/random.zsh-theme
 97new file mode 100644
 98index 0000000000000000000000000000000000000000..43f6cbb60b5e9b4db46aec9cba2e5c0bb03ce2d2
 99--- /dev/null
100+++ b/themes/random.zsh-theme
101@@ -0,0 +1,38 @@
102+# Make themes a unique array
103+typeset -Ua themes
104+
105+if [[ "${(t)ZSH_THEME_RANDOM_CANDIDATES}" = array && ${#ZSH_THEME_RANDOM_CANDIDATES[@]} -gt 0 ]]; then
106+  # Use ZSH_THEME_RANDOM_CANDIDATES if properly defined
107+  themes=($ZSH_THEME_RANDOM_CANDIDATES)
108+else
109+  # Look for themes in $ZSH_CUSTOM and $ZSH and add only the theme name
110+  themes=(
111+    "$ZSH_CUSTOM"/*.zsh-theme(N:t:r)
112+    "$ZSH_CUSTOM"/themes/*.zsh-theme(N:t:r)
113+    "$ZSH"/themes/*.zsh-theme(N:t:r)
114+  )
115+  # Remove blacklisted themes from the list
116+  for theme in ${ZSH_THEME_RANDOM_BLACKLIST[@]}; do
117+    themes=("${(@)themes:#$theme}")
118+  done
119+fi
120+
121+# Choose a theme out of the pool of candidates
122+N=${#themes[@]}
123+(( N = (RANDOM%N) + 1 ))
124+RANDOM_THEME="${themes[$N]}"
125+unset N themes theme
126+
127+# Source theme
128+if [[ -f "$ZSH_CUSTOM/$RANDOM_THEME.zsh-theme" ]]; then
129+  source "$ZSH_CUSTOM/$RANDOM_THEME.zsh-theme"
130+elif [[ -f "$ZSH_CUSTOM/themes/$RANDOM_THEME.zsh-theme" ]]; then
131+  source "$ZSH_CUSTOM/themes/$RANDOM_THEME.zsh-theme"
132+elif [[ -f "$ZSH/themes/$RANDOM_THEME.zsh-theme" ]]; then
133+  source "$ZSH/themes/$RANDOM_THEME.zsh-theme"
134+else
135+  echo "[oh-my-zsh] Random theme '${RANDOM_THEME}' not found"
136+  return 1
137+fi
138+
139+echo "[oh-my-zsh] Random theme '${RANDOM_THEME}' loaded"