Zuletzt aktiv 2 weeks ago

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

Änderung a91e1f96d3f0aa7154f16179ddd4d9eb0ddea58b

README.md Originalformat

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)"
alias Originalformat
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'
func Originalformat
1# =============================================================================
2# CUSTOM FUNCTIONS
3# =============================================================================
4
5# -----------------------------------------------------------------------------
6# Function: clip
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 # Use native macOS open
50 command open "$target"
51 elif grep -qi "microsoft" /proc/version 2>/dev/null; then
52 # Use WSL Explorer
53 if command -v wslpath >/dev/null 2>&1 && command -v explorer.exe >/dev/null 2>&1; then
54 explorer.exe "$(wslpath -w "$target")"
55 else
56 printf "Error: 'wslpath' or 'explorer.exe' not found. Windows interop might be disabled.\n" >&2
57 return 1
58 fi
59 elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
60 # Use Linux xdg-open
61 if command -v xdg-open >/dev/null 2>&1; then
62 xdg-open "$target"
63 else
64 printf "Error: 'xdg-open' not found.\n" >&2
65 return 1
66 fi
67 fi
68}
69alias open='open_file'
70
71# -----------------------------------------------------------------------------
72# Function: clear_history
73# -----------------------------------------------------------------------------
74clear_history() {
75 # Clears the history file and reloads the current session's history for Zsh
76 >| "$HISTFILE" && fc -R
77 echo "History cleared."
78}
79
80# -----------------------------------------------------------------------------
81# Function: claude
82# -----------------------------------------------------------------------------
83claude() {
84 # Run the check in a subshell, unsetting the function first so it only finds the binary
85 if ! whence -p claude >/dev/null 2>&1; then
86 printf "Error: 'claude' CLI is not installed or not in your PATH.\n" >&2
87 return 1
88 fi
89
90 if [[ "$1" == "--yolo" ]]; then
91 shift
92 command claude --dangerously-skip-permissions "$@"
93 return $?
94 fi
95
96 command claude "$@"
97}
98
99# -----------------------------------------------------------------------------
100# Function: create
101# -----------------------------------------------------------------------------
102create() {
103 if ! command -v install >/dev/null 2>&1; then
104 printf "Error: 'install' coreutil is not available on this system.\n" >&2
105 return 1
106 fi
107
108 if [ $# -eq 0 ]; then
109 printf "Usage: create <file> [file ...]\n" >&2
110 return 2
111 fi
112
113 for p in "$@"; do
114 if [ "${p#\~}" != "$p" ]; then
115 p="${HOME}${p#\~}"
116 fi
117
118 if [ -z "$p" ] || [ "$p" = "/" ]; then
119 printf "create: refusing to operate on '%s'\n" "$p" >&2
120 return 1
121 fi
122
123 if [ -e "$p" ]; then
124 printf "create: '%s' already exists. Skipping.\n" "$p" >&2
125 continue
126 fi
127
128 if ! install -D /dev/null "$p"; then
129 printf "create: failed to create '%s'\n" "$p" >&2
130 return 1
131 fi
132 done
133 return 0
134}
135
136# -----------------------------------------------------------------------------
137# Function: check_port
138# -----------------------------------------------------------------------------
139check_port() {
140 local PORT=$1
141
142 if [ -z "$PORT" ]; then
143 printf "Usage: check_port <port_number>\n" >&2
144 return 1
145 fi
146
147 if [[ "$OSTYPE" == "darwin"* ]]; then
148 if lsof -i :"$PORT" >/dev/null 2>&1; then
149 echo "Port $PORT is IN USE"
150 lsof -i :"$PORT"
151 else
152 echo "Port $PORT is FREE"
153 fi
154 else
155 if ! command -v ss >/dev/null 2>&1; then
156 printf "Error: 'ss' command not found. This function requires Linux iproute2 utilities.\n" >&2
157 return 1
158 fi
159
160 if sudo ss -tulnp | grep -q ":$PORT "; then
161 echo "Port $PORT is IN USE"
162 sudo ss -tulnp | grep ":$PORT "
163 else
164 echo "Port $PORT is FREE"
165 fi
166 fi
167}
168
169# -----------------------------------------------------------------------------
170# Function: append_path
171# -----------------------------------------------------------------------------
172append_path() {
173 local dir="$1"
174 if [ -d "$dir" ]; then
175 case ":$PATH:" in
176 *":$dir:"*) ;; # Already in PATH
177 *) PATH="$PATH:$dir" ;;
178 esac
179 elif [ "${SUPPRESS_WARNINGS:-0}" -ne 1 ]; then
180 echo "Warning: $dir does not exist." >&2
181 fi
182}
183
184# -----------------------------------------------------------------------------
185# Function: add_path_to_config
186# -----------------------------------------------------------------------------
187add_path_to_config() {
188 local new_path="$1"
189 local config_file="$HOME/.bashrc"
190
191 if [[ "$SHELL" == *"zsh"* ]]; then
192 config_file="$HOME/.zshrc"
193 fi
194
195 if [ -z "$new_path" ]; then
196 printf "Usage: addpath <directory>\n" >&2
197 return 1
198 fi
199
200 new_path="${new_path/#\~/$HOME}"
201
202 if [ ! -d "$new_path" ]; then
203 printf "Warning: '%s' does not exist.\n" "$new_path" >&2
204 printf "Do you still want to add it to your config? (y/N) "
205 read -r -k 1 REPLY
206 echo
207 if [[ ! $REPLY =~ ^[Yy]$ ]]; then
208 return 1
209 fi
210 fi
211
212 if grep -Fq "append_path \"$new_path\"" "$config_file" || grep -Fq "append_path '$new_path'" "$config_file"; then
213 printf "Notice: '%s' is already in your %s.\n" "$new_path" "$config_file"
214 return 0
215 fi
216
217 if grep -q "^export PATH" "$config_file"; then
218 awk -v new_cmd="append_path \"$new_path\"" '/^export PATH/{print new_cmd}1' "$config_file" > "${config_file}.tmp" && mv "${config_file}.tmp" "$config_file"
219 else
220 echo "append_path \"$new_path\"" >> "$config_file"
221 echo "export PATH" >> "$config_file"
222 fi
223
224 printf "✅ Success: Added '%s' to %s\n" "$new_path" "$config_file"
225
226 if type append_path >/dev/null 2>&1; then
227 append_path "$new_path"
228 export PATH
229 printf "🚀 Path is now active in your current session!\n"
230 fi
231}
232
pathrc Originalformat
1# =============================================================================
2# CUSTOM FUNCTIONS
3# =============================================================================
4
5# -----------------------------------------------------------------------------
6# Function: clip
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 (Cross-platform file/directory opener)
44# -----------------------------------------------------------------------------
45open_file() {
46 local target="${1:-.}"
47
48 if [[ "$OSTYPE" == "darwin"* ]]; then
49 # Use native macOS open
50 command open "$target"
51 elif grep -qi "microsoft" /proc/version 2>/dev/null; then
52 # Use WSL Explorer
53 if command -v wslpath >/dev/null 2>&1 && command -v explorer.exe >/dev/null 2>&1; then
54 explorer.exe "$(wslpath -w "$target")"
55 else
56 printf "Error: 'wslpath' or 'explorer.exe' not found. Windows interop might be disabled.\n" >&2
57 return 1
58 fi
59 elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
60 # Use Linux xdg-open
61 if command -v xdg-open >/dev/null 2>&1; then
62 xdg-open "$target"
63 else
64 printf "Error: 'xdg-open' not found.\n" >&2
65 return 1
66 fi
67 fi
68}
69alias open='open_file'
70
71# -----------------------------------------------------------------------------
72# Function: clear_history
73# -----------------------------------------------------------------------------
74clear_history() {
75 history -p
76}
77
78# -----------------------------------------------------------------------------
79# Function: claude
80# -----------------------------------------------------------------------------
81claude() {
82 if ! command -v claude >/dev/null 2>&1; then
83 printf "Error: 'claude' CLI is not installed or not in your PATH.\n" >&2
84 return 1
85 fi
86
87 if [[ "$1" == "--yolo" ]]; then
88 shift
89 command claude --dangerously-skip-permissions "$@"
90 return $?
91 fi
92
93 command claude "$@"
94}
95
96# -----------------------------------------------------------------------------
97# Function: create
98# -----------------------------------------------------------------------------
99create() {
100 if ! command -v install >/dev/null 2>&1; then
101 printf "Error: 'install' coreutil is not available on this system.\n" >&2
102 return 1
103 fi
104
105 if [ $# -eq 0 ]; then
106 printf "Usage: create <file> [file ...]\n" >&2
107 return 2
108 fi
109
110 for p in "$@"; do
111 if [ "${p#\~}" != "$p" ]; then
112 p="${HOME}${p#\~}"
113 fi
114
115 if [ -z "$p" ] || [ "$p" = "/" ]; then
116 printf "create: refusing to operate on '%s'\n" "$p" >&2
117 return 1
118 fi
119
120 if [ -e "$p" ]; then
121 printf "create: '%s' already exists. Skipping.\n" "$p" >&2
122 continue
123 fi
124
125 if ! install -D /dev/null "$p"; then
126 printf "create: failed to create '%s'\n" "$p" >&2
127 return 1
128 fi
129 done
130 return 0
131}
132
133# -----------------------------------------------------------------------------
134# Function: check_port
135# -----------------------------------------------------------------------------
136check_port() {
137 local PORT=$1
138
139 if [ -z "$PORT" ]; then
140 printf "Usage: check_port <port_number>\n" >&2
141 return 1
142 fi
143
144 if [[ "$OSTYPE" == "darwin"* ]]; then
145 if lsof -i :"$PORT" >/dev/null 2>&1; then
146 echo "Port $PORT is IN USE"
147 lsof -i :"$PORT"
148 else
149 echo "Port $PORT is FREE"
150 fi
151 else
152 if ! command -v ss >/dev/null 2>&1; then
153 printf "Error: 'ss' command not found. This function requires Linux iproute2 utilities.\n" >&2
154 return 1
155 fi
156
157 if sudo ss -tulnp | grep -q ":$PORT "; then
158 echo "Port $PORT is IN USE"
159 sudo ss -tulnp | grep ":$PORT "
160 else
161 echo "Port $PORT is FREE"
162 fi
163 fi
164}
165
166# -----------------------------------------------------------------------------
167# Function: append_path
168# -----------------------------------------------------------------------------
169append_path() {
170 local dir="$1"
171 if [ -d "$dir" ]; then
172 case ":$PATH:" in
173 *":$dir:"*) ;; # Already in PATH
174 *) PATH="$PATH:$dir" ;;
175 esac
176 elif [ "${SUPPRESS_WARNINGS:-0}" -ne 1 ]; then
177 echo "Warning: $dir does not exist." >&2
178 fi
179}
180
181# -----------------------------------------------------------------------------
182# Function: add_path_to_config
183# -----------------------------------------------------------------------------
184add_path_to_config() {
185 local new_path="$1"
186 local config_file="$HOME/.bashrc"
187
188 if [[ "$SHELL" == *"zsh"* ]]; then
189 config_file="$HOME/.zshrc"
190 fi
191
192 if [ -z "$new_path" ]; then
193 printf "Usage: addpath <directory>\n" >&2
194 return 1
195 fi
196
197 new_path="${new_path/#\~/$HOME}"
198
199 if [ ! -d "$new_path" ]; then
200 printf "Warning: '%s' does not exist.\n" "$new_path" >&2
201 read -p "Do you still want to add it to your config? (y/N) " -n 1 -r
202 echo
203 if [[ ! $REPLY =~ ^[Yy]$ ]]; then
204 return 1
205 fi
206 fi
207
208 if grep -Fq "append_path \"$new_path\"" "$config_file" || grep -Fq "append_path '$new_path'" "$config_file"; then
209 printf "Notice: '%s' is already in your %s.\n" "$new_path" "$config_file"
210 return 0
211 fi
212
213 if grep -q "^export PATH" "$config_file"; then
214 awk -v new_cmd="append_path \"$new_path\"" '/^export PATH/{print new_cmd}1' "$config_file" > "${config_file}.tmp" && mv "${config_file}.tmp" "$config_file"
215 else
216 echo "append_path \"$new_path\"" >> "$config_file"
217 echo "export PATH" >> "$config_file"
218 fi
219
220 printf "✅ Success: Added '%s' to %s\n" "$new_path" "$config_file"
221
222 if type append_path >/dev/null 2>&1; then
223 append_path "$new_path"
224 export PATH
225 printf "🚀 Path is now active in your current session!\n"
226 fi
227}
228
229append_path "$HOME/.local/bin"
230export PATH
231
sourcerc Originalformat
1# =============================================================================
2# FILE: ~/.sourcerc
3# Description: Initializes third-party package managers and Oh My Zsh.
4# =============================================================================
5
6# Source the SDKMAN initialization script if it exists and is not empty
7if [[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]]; then
8 source "$HOME/.sdkman/bin/sdkman-init.sh"
9fi
10
11# Source the NVM initialization script if it exists and is not empty
12if [[ -s "$HOME/.nvm/nvm.sh" ]]; then
13 source "$HOME/.nvm/nvm.sh"
14fi
15
16# ==========================================
17# CLAUDE CODE / AI GATEWAY
18# ==========================================
19export ANTHROPIC_BASE_URL="https://gateway.ai.cloudflare.com/v1/9a71825e3842e918e0dff9ad84f50484/claude-code-gateway/anthropic"
20
21# Source Oh My Zsh if it exists and is not empty
22# NOTE: ZSH_THEME and plugins must be defined before this runs!
23if [[ -s "$HOME/.oh-my-zsh/oh-my-zsh.sh" ]]; then
24 source "$HOME/.oh-my-zsh/oh-my-zsh.sh"
25else
26 echo "Warning: Oh My Zsh not found or is empty."
27fi
28# ==========================================
29# NVM (Node Version Manager)
30# ==========================================
31export NVM_DIR="$HOME/.nvm"
32[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
33[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
34
vimrc Originalformat
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 Originalformat
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)
31
32# =============================
33# REQUIREMENTS
34# =============================
35check_requirements() {
36 if [[ $EUID -eq 0 ]]; then
37 err "Do not run as root on macOS"
38 exit 1
39 fi
40}
41
42# =============================
43# INSTALLATION FUNCTIONS
44# =============================
45install_oh_my_zsh() {
46 if [[ -d "$HOME/.oh-my-zsh" ]]; then
47 ok "Oh My Zsh already installed"
48 return
49 fi
50
51 log "Installing Oh My Zsh..."
52 RUNZSH=no CHSH=no KEEP_ZSHRC=yes \
53 sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
54 ok "Oh My Zsh installed"
55}
56
57install_plugins() {
58 log "Installing plugins..."
59 local dir="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins"
60 mkdir -p "$dir"
61
62 [[ -d "$dir/zsh-autosuggestions" ]] || \
63 git clone https://github.com/zsh-users/zsh-autosuggestions "$dir/zsh-autosuggestions"
64
65 [[ -d "$dir/zsh-syntax-highlighting" ]] || \
66 git clone https://github.com/zsh-users/zsh-syntax-highlighting "$dir/zsh-syntax-highlighting"
67
68 ok "Plugins installed"
69}
70
71install_theme() {
72 log "Installing Spaceship theme..."
73 local themes="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes"
74 local dir="$themes/spaceship-prompt"
75
76 mkdir -p "$themes"
77 [[ -d "$dir" ]] || \
78 git clone https://github.com/spaceship-prompt/spaceship-prompt.git "$dir" --depth=1
79
80 ln -sf "$dir/spaceship.zsh-theme" "$themes/spaceship.zsh-theme"
81 ok "Theme installed"
82}
83
84download_configs() {
85 log "Downloading custom config files..."
86 local backup="$HOME/.config_backup_$(date +%Y%m%d_%H%M%S)"
87 mkdir -p "$backup"
88
89 for f in "${CONFIG_FILES[@]}"; do
90 local url="$GIST_RAW_BASE/$f"
91 local target="$HOME/$f"
92 local tmp="${target}.tmp.$$"
93
94 if [[ -f "$target" ]]; then
95 cp "$target" "$backup/"
96 fi
97
98 log "Fetching $f ..."
99 if curl -fsSL "$url" -o "$tmp"; then
100 mv "$tmp" "$target"
101 else
102 rm -f "$tmp"
103 warn "Failed to download $f"
104 fi
105 done
106
107 ok "Configs downloaded (Backup at $backup)"
108}
109
110update_zshrc() {
111 local zshrc="$HOME/.zshrc"
112 log "Checking .zshrc..."
113
114 if [[ ! -f "$zshrc" ]]; then
115 warn ".zshrc not found. Run option 5 first."
116 return 1
117 fi
118
119 ok ".zshrc already comes from the managed gist."
120 ok "Load order is built in: .sourcerc -> .func -> .pathrc -> .alias"
121}
122
123switch_shell() {
124 log "Starting Zsh session..."
125 echo -e "${YELLOW}Type 'exit' to return to this installer menu.${NC}"
126 echo "----------------------------------------"
127 zsh -l
128 echo "----------------------------------------"
129 ok "Returned from Zsh session"
130}
131
132# =============================
133# INTERACTIVE MENU
134# =============================
135show_menu() {
136 echo "==========================================="
137 echo "macOS Zsh Setup - Choose what to do"
138 echo "==========================================="
139 echo " 0) Run ALL steps (1-7)"
140 echo " 1) Install Oh My Zsh"
141 echo " 2) Install plugins (autosuggestions, syntax highlighting)"
142 echo " 3) Install Spaceship theme"
143 echo " 4) Download custom configs (~/.alias, .func, .vimrc, etc.)"
144 echo " 5) Check ~/.zshrc load order"
145 echo " 6) Switch to Zsh (Temporary Sub-shell)"
146 echo " 7) Quit"
147 echo "==========================================="
148}
149
150run_choices() {
151 local input
152 read -p "Select: " input
153 input="${input//,/ }"
154
155 local -a to_run=()
156 local -a to_exclude=()
157
158 for item in $input; do
159 if [[ "$item" == !* ]]; then
160 to_exclude+=("${item:1}")
161 elif [[ "$item" == "0" ]]; then
162 to_run+=(1 2 3 4 5 6)
163 else
164 to_run+=("$item")
165 fi
166 done
167
168 if [[ ${#to_run[@]} -gt 0 ]]; then
169 for choice in "${to_run[@]}"; do
170 local skip=false
171
172 if [[ ${#to_exclude[@]} -gt 0 ]]; then
173 for ex in "${to_exclude[@]}"; do
174 if [[ "$choice" == "$ex" ]]; then
175 skip=true
176 break
177 fi
178 done
179 fi
180
181 $skip && continue
182
183 case "$choice" in
184 1) install_oh_my_zsh ;;
185 2) install_plugins ;;
186 3) install_theme ;;
187 4) download_configs ;;
188 5) update_zshrc ;;
189 6) switch_shell ;;
190 7) exit 0 ;;
191 *) warn "Skipping invalid option: $choice" ;;
192 esac
193 echo
194 done
195 fi
196}
197
198# =============================
199# MAIN
200# =============================
201main() {
202 check_requirements
203 while true; do
204 show_menu
205 run_choices
206 read -p "Do you want to run more options? (y/n): " again
207 [[ "$again" =~ ^[Yy]$ ]] || break
208 done
209 ok "macOS configuration complete!"
210}
211
212main "$@"
zsh_ubuntu.sh Originalformat
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)
34
35# =============================
36# OS DETECTION
37# =============================
38detect_os() {
39 if [ -f /etc/os-release ]; then
40 . /etc/os-release
41 echo "$ID"
42 else
43 echo "unknown"
44 fi
45}
46
47# =============================
48# REQUIREMENTS
49# =============================
50check_requirements() {
51 if [[ $EUID -eq 0 ]]; then
52 err "Do not run as root"
53 exit 1
54 fi
55 if ! command -v sudo >/dev/null 2>&1; then
56 err "sudo required"
57 exit 1
58 fi
59}
60
61# =============================
62# INSTALLATION FUNCTIONS
63# =============================
64update_system() {
65 $SKIP_PACKAGES && return
66 log "Updating system..."
67 sudo apt-get update -y
68 sudo apt-get upgrade -y
69 ok "System updated"
70}
71
72install_packages() {
73 $SKIP_PACKAGES && return
74 log "Installing core packages..."
75 sudo apt-get install -y \
76 zsh git vim curl wget unzip zip build-essential xz-utils
77 ok "Packages installed"
78}
79
80set_timezone() {
81 log "Setting timezone to Asia/Singapore..."
82 sudo timedatectl set-timezone Asia/Singapore
83 ok "Timezone set to Asia/Singapore"
84}
85
86install_homebrew() {
87 ! $INSTALL_HOMEBREW && return
88 command -v brew >/dev/null 2>&1 && ok "Homebrew already installed" && return
89 log "Installing Homebrew..."
90 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
91 ok "Homebrew installed"
92}
93
94configure_shell() {
95 $SKIP_SHELL_CHANGE && return
96 log "Changing default shell to zsh..."
97 local zsh_path
98 zsh_path="$(command -v zsh)"
99 grep -qx "$zsh_path" /etc/shells || echo "$zsh_path" | sudo tee -a /etc/shells >/dev/null
100 chsh -s "$zsh_path"
101 ok "Shell changed (requires logout/login to take effect)"
102}
103
104install_oh_my_zsh() {
105 [[ -d "$HOME/.oh-my-zsh" ]] && ok "Oh My Zsh already installed" && return
106 log "Installing Oh My Zsh..."
107 RUNZSH=no CHSH=no KEEP_ZSHRC=yes \
108 sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
109 ok "Oh My Zsh installed"
110}
111
112install_plugins() {
113 log "Installing plugins..."
114 local dir="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins"
115 mkdir -p "$dir"
116 [[ -d "$dir/zsh-autosuggestions" ]] || git clone https://github.com/zsh-users/zsh-autosuggestions "$dir/zsh-autosuggestions"
117 [[ -d "$dir/zsh-syntax-highlighting" ]] || git clone https://github.com/zsh-users/zsh-syntax-highlighting "$dir/zsh-syntax-highlighting"
118 ok "Plugins installed"
119}
120
121install_theme() {
122 log "Installing Spaceship theme..."
123 local themes="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes"
124 local dir="$themes/spaceship-prompt"
125 mkdir -p "$themes"
126 [[ -d "$dir" ]] || git clone https://github.com/spaceship-prompt/spaceship-prompt.git "$dir" --depth=1
127 ln -sf "$dir/spaceship.zsh-theme" "$themes/spaceship.zsh-theme"
128 ok "Theme installed"
129}
130
131download_configs() {
132 log "Downloading custom config files..."
133 local backup="$HOME/.config_backup_$(date +%Y%m%d_%H%M%S)"
134 mkdir -p "$backup"
135
136 for f in "${CONFIG_FILES[@]}"; do
137 local url="$GIST_RAW_BASE/$f"
138 local target="$HOME/$f"
139 local tmp="${target}.tmp.$$"
140
141 if [[ -f "$target" ]]; then
142 cp "$target" "$backup/"
143 fi
144
145 log "Fetching $f ..."
146 if curl -fsSL "$url" -o "$tmp"; then
147 mv "$tmp" "$target"
148 else
149 rm -f "$tmp"
150 warn "Failed to download $f"
151 fi
152 done
153
154 ok "Configs downloaded (Backup at $backup)"
155}
156
157update_zshrc() {
158 local zshrc="$HOME/.zshrc"
159 log "Checking .zshrc..."
160
161 if [[ ! -f "$zshrc" ]]; then
162 warn ".zshrc not found. Run option 9 first."
163 return 1
164 fi
165
166 ok ".zshrc already comes from the managed gist."
167 ok "Load order is built in: .sourcerc -> .func -> .pathrc -> .alias"
168}
169
170switch_shell() {
171 log "Starting Zsh session..."
172 echo -e "${YELLOW}Type 'exit' to return to this installer menu.${NC}"
173 echo "----------------------------------------"
174 zsh -l
175 echo "----------------------------------------"
176 ok "Returned from Zsh session"
177}
178
179# =============================
180# INTERACTIVE MENU
181# =============================
182show_menu() {
183 echo "==========================================="
184 echo "Zsh Installer - Choose what to do"
185 echo "==========================================="
186 echo " 0) Run ALL steps (1-11)"
187 echo " 1) Update system packages"
188 echo " 2) Install core packages (zsh, git, vim, etc.)"
189 echo " 3) Set Timezone (Asia/Singapore)"
190 echo " 4) Install Homebrew"
191 echo " 5) Configure shell (chsh - sets default shell)"
192 echo " 6) Install Oh My Zsh"
193 echo " 7) Install plugins (autosuggestions, syntax highlighting)"
194 echo " 8) Install Spaceship theme"
195 echo " 9) Download custom configs (~/.alias, .vimrc, etc.)"
196 echo "10) Check ~/.zshrc load order"
197 echo "11) Switch to Zsh (Temporary Sub-shell)"
198 echo "12) Quit"
199 echo "==========================================="
200}
201
202run_choices() {
203 local input
204 read -p "Select: " input
205 input="${input//,/ }"
206
207 local -a to_run=()
208 local -a to_exclude=()
209
210 for item in $input; do
211 if [[ "$item" == !* ]]; then
212 to_exclude+=("${item:1}")
213 elif [[ "$item" == "0" ]]; then
214 to_run+=(1 2 3 4 5 6 7 8 9 10 11)
215 else
216 to_run+=("$item")
217 fi
218 done
219
220 for choice in "${to_run[@]}"; do
221 local skip=false
222
223 for ex in "${to_exclude[@]}"; do
224 if [[ "$choice" == "$ex" ]]; then
225 skip=true
226 break
227 fi
228 done
229
230 $skip && continue
231
232 case "$choice" in
233 1) update_system ;;
234 2) install_packages ;;
235 3) set_timezone ;;
236 4) install_homebrew ;;
237 5) configure_shell ;;
238 6) install_oh_my_zsh ;;
239 7) install_plugins ;;
240 8) install_theme ;;
241 9) download_configs ;;
242 10) update_zshrc ;;
243 11) switch_shell ;;
244 12) log "Exiting..."; exit 0 ;;
245 *) warn "Skipping invalid option: $choice" ;;
246 esac
247 echo
248 done
249}
250
251# =============================
252# MAIN
253# =============================
254main() {
255 check_requirements
256 while true; do
257 show_menu
258 run_choices
259 read -p "Do you want to run more options? (y/n): " again
260 [[ "$again" =~ ^[Yy]$ ]] || break
261 done
262 ok "Zsh installation/configuration complete!"
263}
264
265main "$@"
zsh_wsl.sh Originalformat
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)
34
35# =============================
36# PLATFORM DETECTION
37# =============================
38detect_os() {
39 if [ -f /etc/os-release ]; then
40 . /etc/os-release
41 echo "$ID"
42 else
43 echo "unknown"
44 fi
45}
46
47is_wsl() {
48 grep -qi "microsoft" /proc/version 2>/dev/null
49}
50
51# =============================
52# REQUIREMENTS
53# =============================
54check_requirements() {
55 if [[ $EUID -eq 0 ]]; then
56 err "Do not run as root"
57 exit 1
58 fi
59 if ! command -v sudo >/dev/null 2>&1; then
60 err "sudo required"
61 exit 1
62 fi
63 if ! is_wsl; then
64 err "This installer is intended for WSL"
65 exit 1
66 fi
67}
68
69# =============================
70# INSTALLATION FUNCTIONS
71# =============================
72update_system() {
73 $SKIP_PACKAGES && return
74 log "Updating system..."
75 sudo apt-get update -y
76 sudo apt-get upgrade -y
77 ok "System updated"
78}
79
80install_packages() {
81 $SKIP_PACKAGES && return
82 log "Installing core packages..."
83 sudo apt-get install -y \
84 zsh git vim curl wget unzip zip build-essential xz-utils
85 ok "Packages installed"
86}
87
88set_timezone() {
89 log "Checking timezone configuration..."
90 if command -v timedatectl >/dev/null 2>&1 && timedatectl status >/dev/null 2>&1; then
91 sudo timedatectl set-timezone Asia/Singapore
92 ok "Timezone set to Asia/Singapore"
93 return
94 fi
95
96 warn "Skipping timezone change: timedatectl is not available in this WSL environment"
97}
98
99install_homebrew() {
100 ! $INSTALL_HOMEBREW && return
101 command -v brew >/dev/null 2>&1 && ok "Homebrew already installed" && return
102 log "Installing Homebrew..."
103 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
104 ok "Homebrew installed"
105}
106
107configure_shell() {
108 $SKIP_SHELL_CHANGE && return
109 log "Changing default shell to zsh..."
110 local zsh_path
111 zsh_path="$(command -v zsh)"
112 grep -qx "$zsh_path" /etc/shells || echo "$zsh_path" | sudo tee -a /etc/shells >/dev/null
113 chsh -s "$zsh_path"
114 ok "Shell changed (open a new WSL session for it to take effect)"
115}
116
117install_oh_my_zsh() {
118 [[ -d "$HOME/.oh-my-zsh" ]] && ok "Oh My Zsh already installed" && return
119 log "Installing Oh My Zsh..."
120 RUNZSH=no CHSH=no KEEP_ZSHRC=yes \
121 sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
122 ok "Oh My Zsh installed"
123}
124
125install_plugins() {
126 log "Installing plugins..."
127 local dir="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins"
128 mkdir -p "$dir"
129 [[ -d "$dir/zsh-autosuggestions" ]] || git clone https://github.com/zsh-users/zsh-autosuggestions "$dir/zsh-autosuggestions"
130 [[ -d "$dir/zsh-syntax-highlighting" ]] || git clone https://github.com/zsh-users/zsh-syntax-highlighting "$dir/zsh-syntax-highlighting"
131 ok "Plugins installed"
132}
133
134install_theme() {
135 log "Installing Spaceship theme..."
136 local themes="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes"
137 local dir="$themes/spaceship-prompt"
138 mkdir -p "$themes"
139 [[ -d "$dir" ]] || git clone https://github.com/spaceship-prompt/spaceship-prompt.git "$dir" --depth=1
140 ln -sf "$dir/spaceship.zsh-theme" "$themes/spaceship.zsh-theme"
141 ok "Theme installed"
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 local url="$GIST_RAW_BASE/$f"
151 local target="$HOME/$f"
152 local tmp="${target}.tmp.$$"
153
154 if [[ -f "$target" ]]; then
155 cp "$target" "$backup/"
156 fi
157
158 log "Fetching $f ..."
159 if curl -fsSL "$url" -o "$tmp"; then
160 mv "$tmp" "$target"
161 else
162 rm -f "$tmp"
163 warn "Failed to download $f"
164 fi
165 done
166
167 ok "Configs downloaded (Backup at $backup)"
168}
169
170update_zshrc() {
171 local zshrc="$HOME/.zshrc"
172 log "Checking .zshrc..."
173
174 if [[ ! -f "$zshrc" ]]; then
175 warn ".zshrc not found. Run option 9 first."
176 return 1
177 fi
178
179 ok ".zshrc already comes from the managed gist."
180 ok "Load order is built in: .sourcerc -> .func -> .pathrc -> .alias"
181}
182
183switch_shell() {
184 log "Starting Zsh session..."
185 echo -e "${YELLOW}Type 'exit' to return to this installer menu.${NC}"
186 echo "----------------------------------------"
187 zsh -l
188 echo "----------------------------------------"
189 ok "Returned from Zsh session"
190}
191
192# =============================
193# INTERACTIVE MENU
194# =============================
195show_menu() {
196 echo "==========================================="
197 echo "WSL Zsh Installer - Choose what to do"
198 echo "==========================================="
199 echo " 0) Run ALL steps (1-11)"
200 echo " 1) Update system packages"
201 echo " 2) Install core packages (zsh, git, vim, etc.)"
202 echo " 3) Set Timezone (best effort)"
203 echo " 4) Install Homebrew"
204 echo " 5) Configure shell (chsh - sets default shell)"
205 echo " 6) Install Oh My Zsh"
206 echo " 7) Install plugins (autosuggestions, syntax highlighting)"
207 echo " 8) Install Spaceship theme"
208 echo " 9) Download custom configs (~/.alias, .vimrc, etc.)"
209 echo "10) Check ~/.zshrc load order"
210 echo "11) Switch to Zsh (Temporary Sub-shell)"
211 echo "12) 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 7 8 9 10 11)
228 else
229 to_run+=("$item")
230 fi
231 done
232
233 for choice in "${to_run[@]}"; do
234 local skip=false
235
236 for ex in "${to_exclude[@]}"; do
237 if [[ "$choice" == "$ex" ]]; then
238 skip=true
239 break
240 fi
241 done
242
243 $skip && continue
244
245 case "$choice" in
246 1) update_system ;;
247 2) install_packages ;;
248 3) set_timezone ;;
249 4) install_homebrew ;;
250 5) configure_shell ;;
251 6) install_oh_my_zsh ;;
252 7) install_plugins ;;
253 8) install_theme ;;
254 9) download_configs ;;
255 10) update_zshrc ;;
256 11) switch_shell ;;
257 12) log "Exiting..."; exit 0 ;;
258 *) warn "Skipping invalid option: $choice" ;;
259 esac
260 echo
261 done
262}
263
264# =============================
265# MAIN
266# =============================
267main() {
268 check_requirements
269 while true; do
270 show_menu
271 run_choices
272 read -p "Do you want to run more options? (y/n): " again
273 [[ "$again" =~ ^[Yy]$ ]] || break
274 done
275 ok "WSL Zsh installation/configuration complete!"
276}
277
278main "$@"
zshrc Originalformat
1# =============================================================================
2# 1. ZSH THEME & PLUGINS (Must be defined before Oh My Zsh loads)
3# =============================================================================
4export ZSH="$HOME/.oh-my-zsh"
5ZSH_THEME="spaceship"
6
7SPACESHIP_PROMPT_ORDER=( user dir git exec_time line_sep jobs exit_code char )
8SPACESHIP_USER_SHOW=always
9SPACESHIP_PROMPT_SEPARATE_LINE=true
10SPACESHIP_PROMPT_ADD_NEWLINE=true
11SPACESHIP_CHAR_SYMBOL="❯"
12SPACESHIP_CHAR_SUFFIX=" "
13
14plugins=(git zsh-syntax-highlighting zsh-autosuggestions)
15
16# =============================================================================
17# 2. THIRD-PARTY INITIALIZATION (SDKMAN, NVM, Oh My Zsh)
18# =============================================================================
19[[ -s "$HOME/.sourcerc" ]] && source "$HOME/.sourcerc"
20
21# =============================================================================
22# 3. CUSTOM OVERRIDES (Functions must load before Path Management)
23# =============================================================================
24[[ -s "$HOME/.func" ]] && source "$HOME/.func"
25
26# =============================================================================
27# 4. PATH MANAGEMENT (Relies on append_path from .func)
28# =============================================================================
29[[ -s "$HOME/.pathrc" ]] && source "$HOME/.pathrc"
30
31# =============================================================================
32# 5. ALIASES (Loaded dead last so YOUR code always wins over Oh My Zsh)
33# =============================================================================
34[[ -s "$HOME/.alias" ]] && source "$HOME/.alias"
35