Last active 2 weeks ago

Cross-platform Zsh setup scripts and managed dotfiles with Oh My Zsh framework, Starship prompt, aliases, functions, and path configuration.

Revision 9aedc4e2073c8f2986ea18215e1cedb90a5e6408

README.md Raw

Bash Script Installer for Zsh

The "Bash Script Installer" simplifies the setup of Zsh.

Zsh

Ubuntu

bash -c "$(curl -fsSL https://opengist.rmrf.online/weehong/f0d940c3c1214bf5b7996195199fdc09/raw/HEAD/zsh_ubuntu.sh)"

WSL

bash -c "$(curl -fsSL https://opengist.rmrf.online/weehong/f0d940c3c1214bf5b7996195199fdc09/raw/HEAD/zsh_wsl.sh)"

MacOS

bash -c "$(curl -fsSL https://opengist.rmrf.online/weehong/f0d940c3c1214bf5b7996195199fdc09/raw/HEAD/zsh_macos.sh)"

Configuration

bash -c "$(curl -fsSL https://opengist.rmrf.online/weehong/f0d940c3c1214bf5b7996195199fdc09/raw/HEAD/config.sh)"

Prompt theme

Run the installer theme option and select either Spaceship or Starship. Starship uses the managed config at ~/.config/starship.toml.

alias Raw
1# =============================================================================
2# OS-SPECIFIC ALIASES
3# =============================================================================
4if [[ "$OSTYPE" == "linux-gnu"* ]] && command -v apt-get >/dev/null 2>&1; then
5 # Linux Only System update & cleanup
6 alias uu='sudo apt-get update && \
7 sudo apt-get upgrade -y && \
8 sudo apt-get full-upgrade -y && \
9 sudo apt-get autoremove -y && \
10 sudo apt-get autoclean -y && \
11 sudo apt-get clean'
12elif [[ "$OSTYPE" == "darwin"* ]]; then
13 # macOS Only
14 alias flushdns='sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder'
15fi
16
17# =============================================================================
18# UNIVERSAL GIT ALIASES (Fixed: Removed broken "$@" from aliases)
19# =============================================================================
20alias gph='git push'
21alias gco='git checkout'
22alias gbh='git branch'
23alias gmt='git commit'
24alias gpl='git pull'
25alias grb='git rebase'
26alias grt='git reset'
27alias gst='git status'
28alias grmrf='git checkout -- . && git clean -fd'
config.sh Raw
1#!/bin/bash
2set -euo pipefail
3
4# Configuration
5GIST_RAW_BASE="https://opengist.rmrf.online/weehong/f0d940c3c1214bf5b7996195199fdc09/raw/HEAD"
6CONFIG_FILES=(
7 ".alias"
8 ".func"
9 ".pathrc"
10 ".sourcerc"
11 ".vimrc"
12 ".zshrc"
13 ".config/starship.toml"
14)
15
16echo "Starting configuration download..."
17
18for f in "${CONFIG_FILES[@]}"; do
19 # Remove the leading dot for the URL path
20 remote_name="${f#.}"
21 [[ "$f" == ".config/starship.toml" ]] && remote_name="starship.toml"
22 url="$GIST_RAW_BASE/$remote_name"
23 target="$HOME/$f"
24
25 echo "Downloading $f..."
26 mkdir -p "$(dirname "$target")"
27
28 # Use -f to fail silently on server errors, -s for silent, -L to follow redirects
29 if curl -fsSL "$url" -o "$target"; then
30 echo "Successfully updated $target"
31 else
32 echo "Error: Failed to download $f from $url" >&2
33 fi
34done
35
36echo "Done! All configuration files have been replaced."
37
func Raw
1# =============================================================================
2# CUSTOM FUNCTIONS
3# =============================================================================
4
5# -----------------------------------------------------------------------------
6# Function: clip (Cross-platform clipboard)
7# -----------------------------------------------------------------------------
8clip() {
9 local cmd
10 local args=()
11
12 if command -v pbcopy >/dev/null 2>&1; then
13 cmd="pbcopy" # macOS
14 elif grep -qi "microsoft" /proc/version 2>/dev/null && command -v clip.exe >/dev/null 2>&1; then
15 cmd="clip.exe" # WSL
16 elif [ "$XDG_SESSION_TYPE" = "wayland" ] && command -v wl-copy >/dev/null 2>&1; then
17 cmd="wl-copy" # Linux Wayland
18 elif command -v xclip >/dev/null 2>&1; then
19 cmd="xclip" # Linux X11 (Fallback 1)
20 args=("-selection" "clipboard")
21 elif command -v xsel >/dev/null 2>&1; then
22 cmd="xsel" # Linux X11 (Fallback 2)
23 args=("--clipboard" "--input")
24 else
25 printf "Error: No supported clipboard utility found.\n" >&2
26 return 1
27 fi
28
29 if [ $# -gt 0 ]; then
30 if [ -f "$1" ]; then
31 "$cmd" "${args[@]}" < "$1"
32 echo "Copied contents of '$1' to clipboard."
33 else
34 printf "Error: File '%s' not found.\n" "$1" >&2
35 return 1
36 fi
37 else
38 "$cmd" "${args[@]}"
39 fi
40}
41
42# -----------------------------------------------------------------------------
43# Function: open_file (Cross-platform file/directory opener)
44# -----------------------------------------------------------------------------
45open_file() {
46 local target="${1:-.}"
47
48 if [[ "$OSTYPE" == "darwin"* ]]; then
49 command open "$target"
50 elif grep -qi "microsoft" /proc/version 2>/dev/null; then
51 if command -v wslpath >/dev/null 2>&1 && command -v explorer.exe >/dev/null 2>&1; then
52 explorer.exe "$(wslpath -w "$target")"
53 else
54 printf "Error: 'wslpath' or 'explorer.exe' not found.\n" >&2
55 return 1
56 fi
57 elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
58 if command -v xdg-open >/dev/null 2>&1; then
59 xdg-open "$target"
60 else
61 printf "Error: 'xdg-open' not found.\n" >&2
62 return 1
63 fi
64 fi
65}
66alias open='open_file'
67
68# -----------------------------------------------------------------------------
69# Function: clear_history (Supports shell and Claude)
70# -----------------------------------------------------------------------------
71# -----------------------------------------------------------------------------
72# Function: clear_history (Supports shell and Claude)
73# -----------------------------------------------------------------------------
74clear_history() {
75 case "$1" in
76 claude)
77 if [ -d "$HOME/.claude/projects" ]; then
78 # Use 'yes' to skip prompts and -f to ignore non-existent files
79 yes | rm -rf "$HOME/.claude/projects"/*
80 echo "Claude project history/cache cleared."
81 fi
82 ;;
83
84 *)
85 # 1. Truncate the file
86 : > "$HISTFILE"
87
88 # 2. Clear RAM by briefly setting history size to 0
89 local old_histsize=$HISTSIZE
90 HISTSIZE=0
91 HISTSIZE=$old_histsize
92
93 echo "Shell history cleared."
94 ;;
95 esac
96}
97
98# -----------------------------------------------------------------------------
99# Function: claude (Includes --yolo and clear shortcuts)
100# -----------------------------------------------------------------------------
101claude() {
102 # Shortcut for clearing cache
103 if [[ "$1" == "clear" ]]; then
104 clear_history claude
105 return 0
106 fi
107
108 # Check if binary exists
109 if ! whence -p claude >/dev/null 2>&1; then
110 printf "Error: 'claude' CLI is not installed or not in your PATH.\n" >&2
111 return 1
112 fi
113
114 # Handle --yolo mode
115 if [[ "$1" == "--yolo" ]]; then
116 shift
117 command claude --dangerously-skip-permissions "$@"
118 return $?
119 fi
120
121 command claude "$@"
122}
123
124# -----------------------------------------------------------------------------
125# Function: create (Efficiently create file + parent dirs)
126# -----------------------------------------------------------------------------
127create() {
128 if ! command -v install >/dev/null 2>&1; then
129 printf "Error: 'install' coreutil is not available.\n" >&2
130 return 1
131 fi
132
133 if [ $# -eq 0 ]; then
134 printf "Usage: create <file> [file ...]\n" >&2
135 return 2
136 fi
137
138 for p in "$@"; do
139 # Expand tilde manually if shell doesn't
140 [[ "$p" == "~/"* ]] && p="${HOME}/${p#\~/}"
141
142 if [ -z "$p" ] || [ "$p" = "/" ]; then
143 printf "create: refusing to operate on '%s'\n" "$p" >&2
144 continue
145 fi
146
147 if [ -e "$p" ]; then
148 printf "create: '%s' already exists. Skipping.\n" "$p" >&2
149 continue
150 fi
151
152 if install -D /dev/null "$p"; then
153 echo "Created '$p'"
154 fi
155 done
156}
157
158# -----------------------------------------------------------------------------
159# Function: check_port
160# -----------------------------------------------------------------------------
161check_port() {
162 local PORT=$1
163 if [ -z "$PORT" ]; then
164 printf "Usage: check_port <port_number>\n" >&2
165 return 1
166 fi
167
168 if [[ "$OSTYPE" == "darwin"* ]]; then
169 lsof -i :"$PORT" || echo "Port $PORT is FREE"
170 else
171 sudo ss -tulnp | grep ":$PORT " || echo "Port $PORT is FREE"
172 fi
173}
174
175# -----------------------------------------------------------------------------
176# Function: append_path (Adds to session PATH if exists)
177# -----------------------------------------------------------------------------
178append_path() {
179 local dir="$1"
180 if [ -d "$dir" ]; then
181 case ":$PATH:" in
182 *":$dir:"*) ;;
183 *) PATH="$PATH:$dir" ;;
184 esac
185 elif [ "${SUPPRESS_WARNINGS:-0}" -ne 1 ]; then
186 echo "Warning: $dir does not exist." >&2
187 fi
188}
189
190# -----------------------------------------------------------------------------
191# Function: add_path_to_config (Fixed awk/sed injection)
192# -----------------------------------------------------------------------------
193add_path_to_config() {
194 local new_path="$1"
195 local config_file="$HOME/.bashrc"
196 [[ "$SHELL" == *"zsh"* ]] && config_file="$HOME/.zshrc"
197
198 if [ -z "$new_path" ]; then
199 printf "Usage: add_path_to_config <directory>\n" >&2
200 return 1
201 fi
202
203 new_path="${new_path/#\~/$HOME}"
204
205 if [ ! -d "$new_path" ]; then
206 printf "Warning: '%s' does not exist. Add anyway? (y/N) " "$new_path"
207 read -r REPLY
208 [[ ! $REPLY =~ ^[Yy]$ ]] && return 1
209 fi
210
211 # Check if already exists in file
212 if grep -Fq "append_path \"$new_path\"" "$config_file"; then
213 printf "Notice: Already in %s.\n" "$config_file"
214 return 0
215 fi
216
217 # Robust Injection: Use sed to insert before export PATH or just append
218 if grep -q "^export PATH" "$config_file"; then
219 sed -i.bak "/^export PATH/i append_path \"$new_path\"" "$config_file"
220 else
221 echo "append_path \"$new_path\"" >> "$config_file"
222 echo "export PATH" >> "$config_file"
223 fi
224
225 printf "✅ Success: Added to %s\n" "$config_file"
226 append_path "$new_path" && export PATH
227}
pathrc Raw
1# =============================================================================
2# ENVIRONMENT & PATH CONFIGURATION
3# =============================================================================
4
5# 1. Source functions first
6if [[ -f "$HOME/.func" && -r "$HOME/.func" ]]; then
7 source "$HOME/.func"
8fi
9
10# 2. Define Root Variables
11export DOTNET_ROOT="$HOME/.dotnet"
12
13# 3. PATH INITIALIZATION
14# -----------------------------------------------------------------------------
15append_path "$HOME/.local/bin"
16append_path "$DOTNET_ROOT"
17append_path "$DOTNET_ROOT/tools"
18append_path "$HOME/.opencode/bin"
19append_path "$HOME/Flutter/bin"
20
21# macOS specific paths
22if [[ "$OSTYPE" == "darwin"* ]]; then
23 append_path "/Applications/Espanso.app/Contents/MacOS"
24fi
25
26# Finalize PATH
27export PATH
sourcerc Raw
1# =============================================================================
2# FILE: ~/.sourcerc
3# Description: Initializes third-party package managers and Oh My Zsh.
4# =============================================================================
5
6# Source the custom environment setup file if it exists and is not empty
7if [[ -f "$HOME/.local/bin/env" && -r "$HOME/.local/bin/env" ]]; then
8 source "$HOME/.local/bin/env"
9fi
10
11# Source the SDKMAN initialization script if it exists and is not empty
12if [[ -f "$HOME/.sdkman/bin/sdkman-init.sh" && -r "$HOME/.sdkman/bin/sdkman-init.sh" ]]; then
13 source "$HOME/.sdkman/bin/sdkman-init.sh"
14fi
15
16# Source the NVM initialization script if it exists and is not empty
17if [[ -f "$HOME/.nvm/nvm.sh" && -r "$HOME/.nvm/nvm.sh" ]]; then
18 source "$HOME/.nvm/nvm.sh"
19fi
20
21# =============================================================================
22# CLAUDE CODE / AI GATEWAY
23# =============================================================================
24export ANTHROPIC_BASE_URL="https://gateway.ai.cloudflare.com/v1/9a71825e3842e918e0dff9ad84f50484/claude-code-gateway/anthropic"
25
26# =============================================================================
27# OH MY ZSH
28# =============================================================================
29if [[ -f "$HOME/.oh-my-zsh/oh-my-zsh.sh" && -r "$HOME/.oh-my-zsh/oh-my-zsh.sh" ]]; then
30 source "$HOME/.oh-my-zsh/oh-my-zsh.sh"
31else
32 echo "Warning: Oh My Zsh not found or is empty."
33fi
34
35# =============================================================================
36# GOOGLE CLOUD SDK
37# =============================================================================
38if [[ -f "$HOME/google-cloud-sdk/path.zsh.inc" ]]; then
39 source "$HOME/google-cloud-sdk/path.zsh.inc"
40fi
41
42if [[ -f "$HOME/google-cloud-sdk/completion.zsh.inc" ]]; then
43 source "$HOME/google-cloud-sdk/completion.zsh.inc"
44fi
45
46# =============================================================================
47# NVM (Node Version Manager)
48# =============================================================================
49export NVM_DIR="$HOME/.nvm"
50
51[[ -f "$NVM_DIR/nvm.sh" && -r "$NVM_DIR/nvm.sh" ]] && \. "$NVM_DIR/nvm.sh"
52[[ -f "$NVM_DIR/bash_completion" && -r "$NVM_DIR/bash_completion" ]] && \. "$NVM_DIR/bash_completion"
starship.toml Raw
1"$schema" = "https://starship.rs/config-schema.json"
2
3add_newline = true
4command_timeout = 1000
5format = "$time$username$hostname$directory$git_branch$git_status$nodejs$dotnet$java$kotlin$ruby$xcode$swift$golang$docker_context$python$line_break$character"
6
7[time]
8disabled = false
9format = "[$time]($style) "
10time_format = "%R"
11style = "dimmed white"
12
13[username]
14show_always = true
15format = "[$user]($style) "
16style_user = "bold cyan"
17style_root = "bold red"
18
19[hostname]
20ssh_only = true
21format = "on [$hostname]($style) "
22style = "bold yellow"
23
24[directory]
25truncation_length = 3
26truncate_to_repo = false
27style = "bold blue"
28
29[git_branch]
30symbol = "git:"
31format = "on [$symbol$branch]($style) "
32style = "bold purple"
33
34[git_status]
35format = "([$all_status$ahead_behind]($style) )"
36style = "bold red"
37
38[character]
39success_symbol = "[❯](bold green)"
40error_symbol = "[❯](bold red)"
41vimcmd_symbol = "[❮](bold green)"
42
43[docker_context]
44disabled = true
45
46[package]
47disabled = true
48
vimrc Raw
1" Enable line numbers
2set number
3
4" Enable relative line numbers
5set relativenumber
6
7" Enable syntax highlighting
8syntax on
9
10" Set colorscheme
11colorscheme slate
12
13" Enable file type detection and plugins
14filetype plugin indent on
15
16" Set the tab width to 4 spaces
17set tabstop=4
18set shiftwidth=4
19set expandtab
20
21" Enable auto-indentation
22set autoindent
23set smartindent
24
25" Highlight current line
26set cursorline
27
28" Show matching parentheses
29set showmatch
30
31" Enable line wrapping
32set wrap
33
34" Enable mouse support
35set mouse=a
36
37" Enable clipboard access
38set clipboard=unnamedplus
39
40" Disable swap file
41set noswapfile
42
43" Enable incremental search
44set incsearch
45
46" Ignore case in search
47set ignorecase
48
49" Override ignorecase if search contains capital letters
50set smartcase
51
52" Display line and column number of the cursor position
53set ruler
54
55" Set the status line at the bottom
56set laststatus=2
57
58" Show command in bottom bar
59set showcmd
60
61" Set command height
62set cmdheight=2
63
64" Set history lines
65set history=1000
66
67" Disable backup file
68set nobackup
69
70" Enable persistent undo
71set undofile
72
73" Set maximum number of undo levels
74set undolevels=1000
75
76" Set undo directory
77if has("persistent_undo")
78 silent !mkdir ~/.vim/undodir > /dev/null 2>&1
79 set undodir=~/.vim/undodir
80endif
81
82" Set search highlighting
83set hlsearch
84
85" Enable visual bell
86set visualbell
87
88" Set default file encoding
89set encoding=utf-8
90
91" Set the leader key to space
92let mapleader = " "
93
94" Map <Leader>w to save the file
95nnoremap <Leader>w :w<CR>
96
97" Map <Leader>q to quit
98nnoremap <Leader>q :q<CR>
99
100" Map <Leader>x to save and quit
101nnoremap <Leader>x :wq<CR>
102
103" Enable folding
104set foldmethod=syntax
105set foldlevelstart=99
106
107" Enable line wrapping at 80 characters
108set textwidth=80
109set colorcolumn=80
110
111" Add some basic key mappings
112" Map jj to escape insert mode
113inoremap jj <Esc>
114
115" Map <Leader>n to toggle line numbers
116nnoremap <Leader>n :set number!<CR>
117
118" Map <Leader>r to toggle relative line numbers
119nnoremap <Leader>r :set relativenumber!<CR>
120
121" Configure plugins (if you use a plugin manager like vim-plug)
122" Example with vim-plug:
123" call plug#begin('~/.vim/plugged')
124" Plug 'tpope/vim-sensible'
125" Plug 'preservim/nerdtree'
126" Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
127" Plug 'airblade/vim-gitgutter'
128" call plug#end()
129
130" NERDTree key mappings
131" nnoremap <C-n> :NERDTreeToggle<CR>
132
133" Enable automatic hard wrapping at textwidth (80 chars)
134set formatoptions+=t " Auto-wrap text using textwidth
135set formatoptions+=c " Auto-wrap comments using textwidth
136set formatoptions+=r " Continue comments when pressing Enter
137set formatoptions+=o " Continue comments when using 'o' or 'O'
138set formatoptions+=q " Allow formatting of comments with 'gq'
139set formatoptions+=n " Recognize numbered lists
140set formatoptions+=l " Don't break lines that were already long
141
142" Enable syntax highlighting
143syntax on
144
145" Increase memory limit for complex syntax parsing (Prevents E363)
146set maxmempattern=20000
zsh_macos.sh Raw
1#!/bin/bash
2set -euo pipefail
3
4# =============================
5# COLORS & LOGGING
6# =============================
7RED='\033[0;31m'
8GREEN='\033[0;32m'
9YELLOW='\033[1;33m'
10BLUE='\033[0;34m'
11NC='\033[0m'
12
13log() { echo -e "${BLUE}[INFO]${NC} $*"; }
14ok() { echo -e "${GREEN}[OK]${NC} $*"; }
15warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
16err() { echo -e "${RED}[ERROR]${NC} $*" >&2; }
17
18# =============================
19# CONFIG
20# =============================
21GIST_RAW_BASE="https://opengist.rmrf.online/weehong/f0d940c3c1214bf5b7996195199fdc09/raw/HEAD"
22
23CONFIG_FILES=(
24 ".alias"
25 ".func"
26 ".pathrc"
27 ".sourcerc"
28 ".vimrc"
29 ".zshrc"
30 ".config/starship.toml"
31)
32
33# =============================
34# REQUIREMENTS
35# =============================
36check_requirements() {
37 if [[ $EUID -eq 0 ]]; then
38 err "Do not run as root on macOS"
39 exit 1
40 fi
41}
42
43# =============================
44# INSTALLATION FUNCTIONS
45# =============================
46install_oh_my_zsh() {
47 if [[ -d "$HOME/.oh-my-zsh" ]]; then
48 ok "Oh My Zsh already installed"
49 return
50 fi
51
52 log "Installing Oh My Zsh..."
53 RUNZSH=no CHSH=no KEEP_ZSHRC=yes \
54 sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
55 ok "Oh My Zsh installed"
56}
57
58install_plugins() {
59 log "Installing plugins..."
60 local dir="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins"
61 mkdir -p "$dir"
62
63 [[ -d "$dir/zsh-autosuggestions" ]] || \
64 git clone https://github.com/zsh-users/zsh-autosuggestions "$dir/zsh-autosuggestions"
65
66 [[ -d "$dir/zsh-syntax-highlighting" ]] || \
67 git clone https://github.com/zsh-users/zsh-syntax-highlighting "$dir/zsh-syntax-highlighting"
68
69 ok "Plugins installed"
70}
71
72install_spaceship_theme() {
73 log "Installing Spaceship theme..."
74 local themes="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes"
75 local dir="$themes/spaceship-prompt"
76
77 mkdir -p "$themes"
78 [[ -d "$dir" ]] || \
79 git clone https://github.com/spaceship-prompt/spaceship-prompt.git "$dir" --depth=1
80
81 ln -sf "$dir/spaceship.zsh-theme" "$themes/spaceship.zsh-theme"
82 ok "Spaceship theme installed"
83}
84
85install_starship_config() {
86 local target="$HOME/.config/starship.toml"
87 local tmp="${target}.tmp.$$"
88
89 log "Installing Starship config..."
90 mkdir -p "$(dirname "$target")"
91
92 if curl -fsSL "$GIST_RAW_BASE/starship.toml" -o "$tmp"; then
93 mv "$tmp" "$target"
94 ok "Starship config installed at $target"
95 else
96 rm -f "$tmp"
97 warn "Failed to download Starship config"
98 fi
99}
100
101install_starship_theme() {
102 if command -v starship >/dev/null 2>&1; then
103 ok "Starship already installed"
104 elif command -v brew >/dev/null 2>&1; then
105 log "Installing Starship with Homebrew..."
106 brew install starship
107 ok "Starship installed"
108 else
109 log "Installing Starship..."
110 mkdir -p "$HOME/.local/bin"
111 curl -fsSL https://starship.rs/install.sh | sh -s -- -y -b "$HOME/.local/bin"
112 ok "Starship installed"
113 fi
114
115 install_starship_config
116}
117
118install_theme() {
119 local choice="${1:-}"
120 local selected_theme
121
122 if [[ -z "$choice" ]]; then
123 echo "Select prompt theme:"
124 echo " 1) Spaceship"
125 echo " 2) Starship"
126 read -r -p "Select theme [1-2]: " choice
127 fi
128
129 case "$(printf '%s' "$choice" | tr '[:upper:]' '[:lower:]')" in
130 1|spaceship) selected_theme="spaceship" ;;
131 2|starship) selected_theme="starship" ;;
132 *) warn "Invalid theme selection: $choice"; return 1 ;;
133 esac
134
135 case "$selected_theme" in
136 spaceship) install_spaceship_theme ;;
137 starship) install_starship_theme ;;
138 esac
139
140 printf "%s\n" "$selected_theme" > "$HOME/.zsh_theme"
141 ok "Theme selected: $selected_theme"
142}
143
144download_configs() {
145 log "Downloading custom config files..."
146 local backup="$HOME/.config_backup_$(date +%Y%m%d_%H%M%S)"
147 mkdir -p "$backup"
148
149 for f in "${CONFIG_FILES[@]}"; do
150 # Strip the leading dot for the download URL
151 local remote_file="${f#.}"
152 [[ "$f" == ".config/starship.toml" ]] && remote_file="starship.toml"
153 local url="$GIST_RAW_BASE/$remote_file"
154 local target="$HOME/$f"
155 local tmp="${target}.tmp.$$"
156
157 mkdir -p "$(dirname "$target")"
158
159 if [[ -f "$target" ]]; then
160 cp "$target" "$backup/"
161 fi
162
163 log "Fetching $remote_file -> $f ..."
164 if curl -fsSL "$url" -o "$tmp"; then
165 mv "$tmp" "$target"
166 else
167 rm -f "$tmp"
168 warn "Failed to download $remote_file"
169 fi
170 done
171
172 ok "Configs downloaded (Backup at $backup)"
173}
174
175update_zshrc() {
176 local zshrc="$HOME/.zshrc"
177 log "Checking .zshrc..."
178
179 if [[ ! -f "$zshrc" ]]; then
180 warn ".zshrc not found. Run option 5 first."
181 return 1
182 fi
183
184 ok ".zshrc already comes from the managed gist."
185 ok "Load order is built in: .sourcerc -> .func -> .pathrc -> .alias"
186}
187
188switch_shell() {
189 log "Starting Zsh session..."
190 echo -e "${YELLOW}Type 'exit' to return to this installer menu.${NC}"
191 echo "----------------------------------------"
192 zsh -l
193 echo "----------------------------------------"
194 ok "Returned from Zsh session"
195}
196
197# =============================
198# INTERACTIVE MENU
199# =============================
200show_menu() {
201 echo "==========================================="
202 echo "macOS Zsh Setup - Choose what to do"
203 echo "==========================================="
204 echo " 0) Run ALL steps (1-7)"
205 echo " 1) Install Oh My Zsh"
206 echo " 2) Install plugins (autosuggestions, syntax highlighting)"
207 echo " 3) Install/select prompt theme (Spaceship or Starship)"
208 echo " 4) Download custom configs (~/.alias, .func, .vimrc, etc.)"
209 echo " 5) Check ~/.zshrc load order"
210 echo " 6) Switch to Zsh (Temporary Sub-shell)"
211 echo " 7) Quit"
212 echo "==========================================="
213}
214
215run_choices() {
216 local input
217 read -p "Select: " input
218 input="${input//,/ }"
219
220 local -a to_run=()
221 local -a to_exclude=()
222
223 for item in $input; do
224 if [[ "$item" == !* ]]; then
225 to_exclude+=("${item:1}")
226 elif [[ "$item" == "0" ]]; then
227 to_run+=(1 2 3 4 5 6)
228 else
229 to_run+=("$item")
230 fi
231 done
232
233 if [[ ${#to_run[@]} -gt 0 ]]; then
234 for choice in "${to_run[@]}"; do
235 local skip=false
236
237 if [[ ${#to_exclude[@]} -gt 0 ]]; then
238 for ex in "${to_exclude[@]}"; do
239 if [[ "$choice" == "$ex" ]]; then
240 skip=true
241 break
242 fi
243 done
244 fi
245
246 $skip && continue
247
248 case "$choice" in
249 1) install_oh_my_zsh ;;
250 2) install_plugins ;;
251 3) install_theme ;;
252 4) download_configs ;;
253 5) update_zshrc ;;
254 6) switch_shell ;;
255 7) exit 0 ;;
256 *) warn "Skipping invalid option: $choice" ;;
257 esac
258 echo
259 done
260 fi
261}
262
263# =============================
264# MAIN
265# =============================
266main() {
267 check_requirements
268 while true; do
269 show_menu
270 run_choices
271 read -p "Do you want to run more options? (y/n): " again
272 [[ "$again" =~ ^[Yy]$ ]] || break
273 done
274 ok "macOS configuration complete!"
275}
276
277main "$@"
278
zsh_ubuntu.sh Raw
1#!/bin/bash
2set -euo pipefail
3
4# =============================
5# COLORS & LOGGING
6# =============================
7RED='\033[0;31m'
8GREEN='\033[0;32m'
9YELLOW='\033[1;33m'
10BLUE='\033[0;34m'
11NC='\033[0m'
12
13log() { echo -e "${BLUE}[INFO]${NC} $*"; }
14ok() { echo -e "${GREEN}[OK]${NC} $*"; }
15warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
16err() { echo -e "${RED}[ERROR]${NC} $*" >&2; }
17
18# =============================
19# FLAGS & CONFIG
20# =============================
21SKIP_PACKAGES=false
22SKIP_SHELL_CHANGE=false
23INSTALL_HOMEBREW=false
24
25GIST_RAW_BASE="https://opengist.rmrf.online/weehong/f0d940c3c1214bf5b7996195199fdc09/raw/HEAD"
26CONFIG_FILES=(
27 ".alias"
28 ".func"
29 ".pathrc"
30 ".sourcerc"
31 ".vimrc"
32 ".zshrc"
33 ".config/starship.toml"
34)
35
36# =============================
37# OS DETECTION
38# =============================
39detect_os() {
40 if [ -f /etc/os-release ]; then
41 . /etc/os-release
42 echo "$ID"
43 else
44 echo "unknown"
45 fi
46}
47
48# =============================
49# REQUIREMENTS
50# =============================
51check_requirements() {
52 if [[ $EUID -eq 0 ]]; then
53 err "Do not run as root"
54 exit 1
55 fi
56 if ! command -v sudo >/dev/null 2>&1; then
57 err "sudo required"
58 exit 1
59 fi
60}
61
62# =============================
63# INSTALLATION FUNCTIONS
64# =============================
65update_system() {
66 $SKIP_PACKAGES && return
67 log "Updating system..."
68 sudo apt-get update -y
69 sudo apt-get upgrade -y
70 ok "System updated"
71}
72
73install_packages() {
74 $SKIP_PACKAGES && return
75 log "Installing core packages..."
76 sudo apt-get install -y \
77 zsh git vim curl wget unzip zip build-essential xz-utils
78 ok "Packages installed"
79}
80
81set_timezone() {
82 log "Setting timezone to Asia/Singapore..."
83 sudo timedatectl set-timezone Asia/Singapore
84 ok "Timezone set to Asia/Singapore"
85}
86
87install_homebrew() {
88 ! $INSTALL_HOMEBREW && return
89 command -v brew >/dev/null 2>&1 && ok "Homebrew already installed" && return
90 log "Installing Homebrew..."
91 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
92 ok "Homebrew installed"
93}
94
95configure_shell() {
96 $SKIP_SHELL_CHANGE && return
97 log "Changing default shell to zsh..."
98 local zsh_path
99 zsh_path="$(command -v zsh)"
100 grep -qx "$zsh_path" /etc/shells || echo "$zsh_path" | sudo tee -a /etc/shells >/dev/null
101 chsh -s "$zsh_path"
102 ok "Shell changed (requires logout/login to take effect)"
103}
104
105install_oh_my_zsh() {
106 [[ -d "$HOME/.oh-my-zsh" ]] && ok "Oh My Zsh already installed" && return
107 log "Installing Oh My Zsh..."
108 RUNZSH=no CHSH=no KEEP_ZSHRC=yes \
109 sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
110 ok "Oh My Zsh installed"
111}
112
113install_plugins() {
114 log "Installing plugins..."
115 local dir="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins"
116 mkdir -p "$dir"
117 [[ -d "$dir/zsh-autosuggestions" ]] || git clone https://github.com/zsh-users/zsh-autosuggestions "$dir/zsh-autosuggestions"
118 [[ -d "$dir/zsh-syntax-highlighting" ]] || git clone https://github.com/zsh-users/zsh-syntax-highlighting "$dir/zsh-syntax-highlighting"
119 ok "Plugins installed"
120}
121
122install_spaceship_theme() {
123 log "Installing Spaceship theme..."
124 local themes="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes"
125 local dir="$themes/spaceship-prompt"
126 mkdir -p "$themes"
127 [[ -d "$dir" ]] || git clone https://github.com/spaceship-prompt/spaceship-prompt.git "$dir" --depth=1
128 ln -sf "$dir/spaceship.zsh-theme" "$themes/spaceship.zsh-theme"
129 ok "Spaceship theme installed"
130}
131
132install_starship_config() {
133 local target="$HOME/.config/starship.toml"
134 local tmp="${target}.tmp.$$"
135
136 log "Installing Starship config..."
137 mkdir -p "$(dirname "$target")"
138
139 if curl -fsSL "$GIST_RAW_BASE/starship.toml" -o "$tmp"; then
140 mv "$tmp" "$target"
141 ok "Starship config installed at $target"
142 else
143 rm -f "$tmp"
144 warn "Failed to download Starship config"
145 fi
146}
147
148install_starship_theme() {
149 if command -v starship >/dev/null 2>&1; then
150 ok "Starship already installed"
151 elif command -v brew >/dev/null 2>&1; then
152 log "Installing Starship with Homebrew..."
153 brew install starship
154 ok "Starship installed"
155 else
156 log "Installing Starship..."
157 mkdir -p "$HOME/.local/bin"
158 curl -fsSL https://starship.rs/install.sh | sh -s -- -y -b "$HOME/.local/bin"
159 ok "Starship installed"
160 fi
161
162 install_starship_config
163}
164
165install_theme() {
166 local choice="${1:-}"
167 local selected_theme
168
169 if [[ -z "$choice" ]]; then
170 echo "Select prompt theme:"
171 echo " 1) Spaceship"
172 echo " 2) Starship"
173 read -r -p "Select theme [1-2]: " choice
174 fi
175
176 case "$(printf '%s' "$choice" | tr '[:upper:]' '[:lower:]')" in
177 1|spaceship) selected_theme="spaceship" ;;
178 2|starship) selected_theme="starship" ;;
179 *) warn "Invalid theme selection: $choice"; return 1 ;;
180 esac
181
182 case "$selected_theme" in
183 spaceship) install_spaceship_theme ;;
184 starship) install_starship_theme ;;
185 esac
186
187 printf "%s\n" "$selected_theme" > "$HOME/.zsh_theme"
188 ok "Theme selected: $selected_theme"
189}
190
191download_configs() {
192 log "Downloading custom config files..."
193 local backup="$HOME/.config_backup_$(date +%Y%m%d_%H%M%S)"
194 mkdir -p "$backup"
195
196 for f in "${CONFIG_FILES[@]}"; do
197 # Strip the leading dot for the download URL
198 local remote_file="${f#.}"
199 [[ "$f" == ".config/starship.toml" ]] && remote_file="starship.toml"
200 local url="$GIST_RAW_BASE/$remote_file"
201 local target="$HOME/$f"
202 local tmp="${target}.tmp.$$"
203
204 mkdir -p "$(dirname "$target")"
205
206 if [[ -f "$target" ]]; then
207 cp "$target" "$backup/"
208 fi
209
210 log "Fetching $remote_file -> $f ..."
211 if curl -fsSL "$url" -o "$tmp"; then
212 mv "$tmp" "$target"
213 else
214 rm -f "$tmp"
215 warn "Failed to download $remote_file"
216 fi
217 done
218
219 ok "Configs downloaded (Backup at $backup)"
220}
221
222update_zshrc() {
223 local zshrc="$HOME/.zshrc"
224 log "Checking .zshrc..."
225
226 if [[ ! -f "$zshrc" ]]; then
227 warn ".zshrc not found. Run option 9 first."
228 return 1
229 fi
230
231 ok ".zshrc already comes from the managed gist."
232 ok "Load order is built in: .sourcerc -> .func -> .pathrc -> .alias"
233}
234
235switch_shell() {
236 log "Starting Zsh session..."
237 echo -e "${YELLOW}Type 'exit' to return to this installer menu.${NC}"
238 echo "----------------------------------------"
239 zsh -l
240 echo "----------------------------------------"
241 ok "Returned from Zsh session"
242}
243
244# =============================
245# INTERACTIVE MENU
246# =============================
247show_menu() {
248 echo "==========================================="
249 echo "Zsh Installer - Choose what to do"
250 echo "==========================================="
251 echo " 0) Run ALL steps (1-11)"
252 echo " 1) Update system packages"
253 echo " 2) Install core packages (zsh, git, vim, etc.)"
254 echo " 3) Set Timezone (Asia/Singapore)"
255 echo " 4) Install Homebrew"
256 echo " 5) Configure shell (chsh - sets default shell)"
257 echo " 6) Install Oh My Zsh"
258 echo " 7) Install plugins (autosuggestions, syntax highlighting)"
259 echo " 8) Install/select prompt theme (Spaceship or Starship)"
260 echo " 9) Download custom configs (~/.alias, .vimrc, etc.)"
261 echo "10) Check ~/.zshrc load order"
262 echo "11) Switch to Zsh (Temporary Sub-shell)"
263 echo "12) Quit"
264 echo "==========================================="
265}
266
267run_choices() {
268 local input
269 read -p "Select: " input
270 input="${input//,/ }"
271
272 local -a to_run=()
273 local -a to_exclude=()
274
275 for item in $input; do
276 if [[ "$item" == !* ]]; then
277 to_exclude+=("${item:1}")
278 elif [[ "$item" == "0" ]]; then
279 to_run+=(1 2 3 4 5 6 7 8 9 10 11)
280 else
281 to_run+=("$item")
282 fi
283 done
284
285 for choice in "${to_run[@]}"; do
286 local skip=false
287
288 for ex in "${to_exclude[@]}"; do
289 if [[ "$choice" == "$ex" ]]; then
290 skip=true
291 break
292 fi
293 done
294
295 $skip && continue
296
297 case "$choice" in
298 1) update_system ;;
299 2) install_packages ;;
300 3) set_timezone ;;
301 4) install_homebrew ;;
302 5) configure_shell ;;
303 6) install_oh_my_zsh ;;
304 7) install_plugins ;;
305 8) install_theme ;;
306 9) download_configs ;;
307 10) update_zshrc ;;
308 11) switch_shell ;;
309 12) log "Exiting..."; exit 0 ;;
310 *) warn "Skipping invalid option: $choice" ;;
311 esac
312 echo
313 done
314}
315
316# =============================
317# MAIN
318# =============================
319main() {
320 check_requirements
321 while true; do
322 show_menu
323 run_choices
324 read -p "Do you want to run more options? (y/n): " again
325 [[ "$again" =~ ^[Yy]$ ]] || break
326 done
327 ok "Zsh installation/configuration complete!"
328}
329
330main "$@"
331
zsh_wsl.sh Raw
1#!/bin/bash
2set -euo pipefail
3
4# =============================
5# COLORS & LOGGING
6# =============================
7RED='\033[0;31m'
8GREEN='\033[0;32m'
9YELLOW='\033[1;33m'
10BLUE='\033[0;34m'
11NC='\033[0m'
12
13log() { echo -e "${BLUE}[INFO]${NC} $*"; }
14ok() { echo -e "${GREEN}[OK]${NC} $*"; }
15warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
16err() { echo -e "${RED}[ERROR]${NC} $*" >&2; }
17
18# =============================
19# FLAGS & CONFIG
20# =============================
21SKIP_PACKAGES=false
22SKIP_SHELL_CHANGE=false
23INSTALL_HOMEBREW=false
24
25GIST_RAW_BASE="https://opengist.rmrf.online/weehong/f0d940c3c1214bf5b7996195199fdc09/raw/HEAD"
26CONFIG_FILES=(
27 ".alias"
28 ".func"
29 ".pathrc"
30 ".sourcerc"
31 ".vimrc"
32 ".zshrc"
33 ".config/starship.toml"
34)
35
36# =============================
37# PLATFORM DETECTION
38# =============================
39detect_os() {
40 if [ -f /etc/os-release ]; then
41 . /etc/os-release
42 echo "$ID"
43 else
44 echo "unknown"
45 fi
46}
47
48is_wsl() {
49 grep -qi "microsoft" /proc/version 2>/dev/null
50}
51
52# =============================
53# REQUIREMENTS
54# =============================
55check_requirements() {
56 if [[ $EUID -eq 0 ]]; then
57 err "Do not run as root"
58 exit 1
59 fi
60 if ! command -v sudo >/dev/null 2>&1; then
61 err "sudo required"
62 exit 1
63 fi
64 if ! is_wsl; then
65 err "This installer is intended for WSL"
66 exit 1
67 fi
68}
69
70# =============================
71# INSTALLATION FUNCTIONS
72# =============================
73update_system() {
74 $SKIP_PACKAGES && return
75 log "Updating system..."
76 sudo apt-get update -y
77 sudo apt-get upgrade -y
78 ok "System updated"
79}
80
81install_packages() {
82 $SKIP_PACKAGES && return
83 log "Installing core packages..."
84 sudo apt-get install -y \
85 zsh git vim curl wget unzip zip build-essential xz-utils
86 ok "Packages installed"
87}
88
89set_timezone() {
90 log "Checking timezone configuration..."
91 if command -v timedatectl >/dev/null 2>&1 && timedatectl status >/dev/null 2>&1; then
92 sudo timedatectl set-timezone Asia/Singapore
93 ok "Timezone set to Asia/Singapore"
94 return
95 fi
96
97 warn "Skipping timezone change: timedatectl is not available in this WSL environment"
98}
99
100install_homebrew() {
101 ! $INSTALL_HOMEBREW && return
102 command -v brew >/dev/null 2>&1 && ok "Homebrew already installed" && return
103 log "Installing Homebrew..."
104 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
105 ok "Homebrew installed"
106}
107
108configure_shell() {
109 $SKIP_SHELL_CHANGE && return
110 log "Changing default shell to zsh..."
111 local zsh_path
112 zsh_path="$(command -v zsh)"
113 grep -qx "$zsh_path" /etc/shells || echo "$zsh_path" | sudo tee -a /etc/shells >/dev/null
114 chsh -s "$zsh_path"
115 ok "Shell changed (open a new WSL session for it to take effect)"
116}
117
118install_oh_my_zsh() {
119 [[ -d "$HOME/.oh-my-zsh" ]] && ok "Oh My Zsh already installed" && return
120 log "Installing Oh My Zsh..."
121 RUNZSH=no CHSH=no KEEP_ZSHRC=yes \
122 sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
123 ok "Oh My Zsh installed"
124}
125
126install_plugins() {
127 log "Installing plugins..."
128 local dir="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins"
129 mkdir -p "$dir"
130 [[ -d "$dir/zsh-autosuggestions" ]] || git clone https://github.com/zsh-users/zsh-autosuggestions "$dir/zsh-autosuggestions"
131 [[ -d "$dir/zsh-syntax-highlighting" ]] || git clone https://github.com/zsh-users/zsh-syntax-highlighting "$dir/zsh-syntax-highlighting"
132 ok "Plugins installed"
133}
134
135install_spaceship_theme() {
136 log "Installing Spaceship theme..."
137 local themes="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes"
138 local dir="$themes/spaceship-prompt"
139 mkdir -p "$themes"
140 [[ -d "$dir" ]] || git clone https://github.com/spaceship-prompt/spaceship-prompt.git "$dir" --depth=1
141 ln -sf "$dir/spaceship.zsh-theme" "$themes/spaceship.zsh-theme"
142 ok "Spaceship theme installed"
143}
144
145install_starship_config() {
146 local target="$HOME/.config/starship.toml"
147 local tmp="${target}.tmp.$$"
148
149 log "Installing Starship config..."
150 mkdir -p "$(dirname "$target")"
151
152 if curl -fsSL "$GIST_RAW_BASE/starship.toml" -o "$tmp"; then
153 mv "$tmp" "$target"
154 ok "Starship config installed at $target"
155 else
156 rm -f "$tmp"
157 warn "Failed to download Starship config"
158 fi
159}
160
161install_starship_theme() {
162 if command -v starship >/dev/null 2>&1; then
163 ok "Starship already installed"
164 elif command -v brew >/dev/null 2>&1; then
165 log "Installing Starship with Homebrew..."
166 brew install starship
167 ok "Starship installed"
168 else
169 log "Installing Starship..."
170 mkdir -p "$HOME/.local/bin"
171 curl -fsSL https://starship.rs/install.sh | sh -s -- -y -b "$HOME/.local/bin"
172 ok "Starship installed"
173 fi
174
175 install_starship_config
176}
177
178install_theme() {
179 local choice="${1:-}"
180 local selected_theme
181
182 if [[ -z "$choice" ]]; then
183 echo "Select prompt theme:"
184 echo " 1) Spaceship"
185 echo " 2) Starship"
186 read -r -p "Select theme [1-2]: " choice
187 fi
188
189 case "$(printf '%s' "$choice" | tr '[:upper:]' '[:lower:]')" in
190 1|spaceship) selected_theme="spaceship" ;;
191 2|starship) selected_theme="starship" ;;
192 *) warn "Invalid theme selection: $choice"; return 1 ;;
193 esac
194
195 case "$selected_theme" in
196 spaceship) install_spaceship_theme ;;
197 starship) install_starship_theme ;;
198 esac
199
200 printf "%s\n" "$selected_theme" > "$HOME/.zsh_theme"
201 ok "Theme selected: $selected_theme"
202}
203
204download_configs() {
205 log "Downloading custom config files..."
206 local backup="$HOME/.config_backup_$(date +%Y%m%d_%H%M%S)"
207 mkdir -p "$backup"
208
209 for f in "${CONFIG_FILES[@]}"; do
210 # Strip the leading dot for the download URL
211 local remote_file="${f#.}"
212 [[ "$f" == ".config/starship.toml" ]] && remote_file="starship.toml"
213 local url="$GIST_RAW_BASE/$remote_file"
214 local target="$HOME/$f"
215 local tmp="${target}.tmp.$$"
216
217 mkdir -p "$(dirname "$target")"
218
219 if [[ -f "$target" ]]; then
220 cp "$target" "$backup/"
221 fi
222
223 log "Fetching $remote_file -> $f ..."
224 if curl -fsSL "$url" -o "$tmp"; then
225 mv "$tmp" "$target"
226 else
227 rm -f "$tmp"
228 warn "Failed to download $remote_file"
229 fi
230 done
231
232 ok "Configs downloaded (Backup at $backup)"
233}
234
235update_zshrc() {
236 local zshrc="$HOME/.zshrc"
237 log "Checking .zshrc..."
238
239 if [[ ! -f "$zshrc" ]]; then
240 warn ".zshrc not found. Run option 9 first."
241 return 1
242 fi
243
244 ok ".zshrc already comes from the managed gist."
245 ok "Load order is built in: .sourcerc -> .func -> .pathrc -> .alias"
246}
247
248switch_shell() {
249 log "Starting Zsh session..."
250 echo -e "${YELLOW}Type 'exit' to return to this installer menu.${NC}"
251 echo "----------------------------------------"
252 zsh -l
253 echo "----------------------------------------"
254 ok "Returned from Zsh session"
255}
256
257# =============================
258# INTERACTIVE MENU
259# =============================
260show_menu() {
261 echo "==========================================="
262 echo "WSL Zsh Installer - Choose what to do"
263 echo "==========================================="
264 echo " 0) Run ALL steps (1-11)"
265 echo " 1) Update system packages"
266 echo " 2) Install core packages (zsh, git, vim, etc.)"
267 echo " 3) Set Timezone (best effort)"
268 echo " 4) Install Homebrew"
269 echo " 5) Configure shell (chsh - sets default shell)"
270 echo " 6) Install Oh My Zsh"
271 echo " 7) Install plugins (autosuggestions, syntax highlighting)"
272 echo " 8) Install/select prompt theme (Spaceship or Starship)"
273 echo " 9) Download custom configs (~/.alias, .vimrc, etc.)"
274 echo "10) Check ~/.zshrc load order"
275 echo "11) Switch to Zsh (Temporary Sub-shell)"
276 echo "12) Quit"
277 echo "==========================================="
278}
279
280run_choices() {
281 local input
282 read -p "Select: " input
283 input="${input//,/ }"
284
285 local -a to_run=()
286 local -a to_exclude=()
287
288 for item in $input; do
289 if [[ "$item" == !* ]]; then
290 to_exclude+=("${item:1}")
291 elif [[ "$item" == "0" ]]; then
292 to_run+=(1 2 3 4 5 6 7 8 9 10 11)
293 else
294 to_run+=("$item")
295 fi
296 done
297
298 for choice in "${to_run[@]}"; do
299 local skip=false
300
301 for ex in "${to_exclude[@]}"; do
302 if [[ "$choice" == "$ex" ]]; then
303 skip=true
304 break
305 fi
306 done
307
308 $skip && continue
309
310 case "$choice" in
311 1) update_system ;;
312 2) install_packages ;;
313 3) set_timezone ;;
314 4) install_homebrew ;;
315 5) configure_shell ;;
316 6) install_oh_my_zsh ;;
317 7) install_plugins ;;
318 8) install_theme ;;
319 9) download_configs ;;
320 10) update_zshrc ;;
321 11) switch_shell ;;
322 12) log "Exiting..."; exit 0 ;;
323 *) warn "Skipping invalid option: $choice" ;;
324 esac
325 echo
326 done
327}
328
329# =============================
330# MAIN
331# =============================
332main() {
333 check_requirements
334 while true; do
335 show_menu
336 run_choices
337 read -p "Do you want to run more options? (y/n): " again
338 [[ "$again" =~ ^[Yy]$ ]] || break
339 done
340 ok "WSL Zsh installation/configuration complete!"
341}
342
343main "$@"
344
zshrc Raw
1# =============================================================================
2# 1. ZSH THEME & PLUGINS (Must be defined before Oh My Zsh loads)
3# =============================================================================
4export ZSH="$HOME/.oh-my-zsh"
5
6source_if_readable() {
7 local file="$1"
8 if [[ -f "$file" && -r "$file" ]]; then
9 source "$file"
10 fi
11}
12
13ZSH_THEME_CHOICE="${ZSH_THEME_CHOICE:-}"
14if [[ -z "$ZSH_THEME_CHOICE" && -f "$HOME/.zsh_theme" ]]; then
15 ZSH_THEME_CHOICE="$(<"$HOME/.zsh_theme")"
16fi
17ZSH_THEME_CHOICE="${ZSH_THEME_CHOICE:-spaceship}"
18
19case "$ZSH_THEME_CHOICE" in
20 starship)
21 ZSH_THEME=""
22 ;;
23 spaceship|*)
24 ZSH_THEME="spaceship"
25
26 SPACESHIP_PROMPT_ORDER=(
27 time # Time stamps section
28 user # Username section
29 dir # Current directory section
30 git # Git section (git_branch + git_status)
31 node # Node.js section
32 dotnet # .NET section
33 java # Java section
34 kotlin # Kotlin section
35 ruby # Ruby section
36 xcode # Xcode section
37 swift # Swift section
38 golang # Go section
39 docker # Docker section
40 venv # virtualenv section
41 line_sep # Line break
42 char # Prompt character
43 )
44
45 SPACESHIP_USER_SHOW=always
46 SPACESHIP_PROMPT_SEPARATE_LINE=true
47 SPACESHIP_PROMPT_ADD_NEWLINE=true
48 SPACESHIP_CHAR_SYMBOL="❯"
49 SPACESHIP_CHAR_SUFFIX=" "
50 SPACESHIP_DOCKER_CONTEXT_SHOW=false
51
52 if [[ $(uname) == "Darwin" ]]; then
53 #  is the Apple logo in Nerd Fonts
54 SPACESHIP_USER_SUFFIX="%F{cyan} [  ]%f "
55 elif [[ $(uname) == "Linux" ]]; then
56 #  is the Ubuntu logo in Nerd Fonts
57 SPACESHIP_USER_SUFFIX="%F{yellow} [  ]%f "
58 else
59 SPACESHIP_USER_SUFFIX=" "
60 fi
61 ;;
62esac
63
64plugins=(git zsh-syntax-highlighting zsh-autosuggestions)
65
66# Initialize Oh My Zsh (Crucial for themes and plugins to work)
67source_if_readable "$ZSH/oh-my-zsh.sh"
68
69# =============================================================================
70# 2. THIRD-PARTY INITIALIZATION (SDKMAN, NVM, Oh My Zsh)
71# =============================================================================
72source_if_readable "$HOME/.sourcerc"
73
74# =============================================================================
75# 3. CUSTOM OVERRIDES (Functions must load before Path Management)
76# =============================================================================
77source_if_readable "$HOME/.func"
78
79# =============================================================================
80# 4. PATH MANAGEMENT (Relies on append_path from .func)
81# =============================================================================
82source_if_readable "$HOME/.pathrc"
83
84# =============================================================================
85# 5. ALIASES (Loaded dead last so YOUR code always wins over Oh My Zsh)
86# =============================================================================
87source_if_readable "$HOME/.alias"
88
89if [[ "$ZSH_THEME_CHOICE" == "starship" ]]; then
90 if [[ -z "${STARSHIP_CONFIG:-}" && -f "$HOME/.config/starship.toml" ]]; then
91 export STARSHIP_CONFIG="$HOME/.config/starship.toml"
92 fi
93
94 if command -v starship >/dev/null 2>&1; then
95 eval "$(starship init zsh)"
96 else
97 echo "Warning: Starship selected but starship is not installed."
98 fi
99fi
100