Compare commits
10 Commits
74d5f7cbe5
...
3cdd079e2e
| Author | SHA1 | Date | |
|---|---|---|---|
| 3cdd079e2e | |||
| 789ef71771 | |||
| ec8d41b396 | |||
| b62a6c00f9 | |||
| 4324a3f449 | |||
| a2b82b6aef | |||
| ffd26e06d6 | |||
| 53897ed9e9 | |||
| 440b5b9829 | |||
| f07a524dc6 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -22,3 +22,4 @@ home/.vim/pack
|
|||||||
# compiled binaries
|
# compiled binaries
|
||||||
home/.tmux/donut
|
home/.tmux/donut
|
||||||
|
|
||||||
|
*.zwc
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ _copilot_tmux_wrap() {
|
|||||||
trap - EXIT INT TERM
|
trap - EXIT INT TERM
|
||||||
[[ -n "$TMUX" ]] && (tmux set automatic-rename on &)
|
[[ -n "$TMUX" ]] && (tmux set automatic-rename on &)
|
||||||
}
|
}
|
||||||
colby() { _copilot_tmux_wrap gh copilot --allow-all-tools --allow-all-paths "$@"; }
|
|
||||||
alias gs='git s'
|
alias gs='git s'
|
||||||
alias gd='git d'
|
alias gd='git d'
|
||||||
alias gdc='git dc'
|
alias gdc='git dc'
|
||||||
|
|||||||
@@ -1,3 +1,12 @@
|
|||||||
|
# Switch to zsh if available (chsh doesn't persist in containers/Codespaces)
|
||||||
|
if [[ -z "${ZSH_VERSION:-}" ]]; then
|
||||||
|
if command -v zsh &>/dev/null; then
|
||||||
|
exec zsh -l
|
||||||
|
else
|
||||||
|
printf '\033[38;2;248;140;20m[dots] zsh not found — falling back to bash\033[0m\n' >&2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Load .profile, containing login, non-bash related initializations.
|
# Load .profile, containing login, non-bash related initializations.
|
||||||
[ -f "$HOME/.profile" ] && source "$HOME/.profile"
|
[ -f "$HOME/.profile" ] && source "$HOME/.profile"
|
||||||
|
|
||||||
|
|||||||
2
home/.bashrc
Normal file
2
home/.bashrc
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# Non-login shells read .bashrc; source .bash_profile for unified setup
|
||||||
|
[ -f "$HOME/.bash_profile" ] && source "$HOME/.bash_profile"
|
||||||
@@ -25,7 +25,6 @@ set -g allow-passthrough on
|
|||||||
# Mouse
|
# Mouse
|
||||||
set -g mouse on
|
set -g mouse on
|
||||||
set -g set-clipboard on
|
set -g set-clipboard on
|
||||||
set-hook -g client-focus-in 'set -g mouse off ; set -g mouse on'
|
|
||||||
bind -T root MouseDown1StatusRight lock-session
|
bind -T root MouseDown1StatusRight lock-session
|
||||||
|
|
||||||
# Copy mode — OSC52 via set-clipboard handles system clipboard automatically
|
# Copy mode — OSC52 via set-clipboard handles system clipboard automatically
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
# Prompt
|
# Prompt
|
||||||
(( ${+PROMPT_MIN_DURATION} )) || typeset -gi PROMPT_MIN_DURATION=2 # show duration after N seconds
|
(( ${+PROMPT_MIN_DURATION} )) || typeset -gi PROMPT_MIN_DURATION=2 # show duration after N seconds
|
||||||
(( ${+PROMPT_FLASH_DELAY} )) || typeset -gi PROMPT_FLASH_DELAY=4 # flash prompt for N centiseconds
|
|
||||||
|
|
||||||
typeset -gi _dots_prompt_cmd_start=0
|
typeset -gi _dots_prompt_cmd_start=0
|
||||||
typeset -gi _dots_prompt_cmd_ran=0
|
typeset -gi _dots_prompt_cmd_ran=0
|
||||||
typeset -gi _dots_prompt_flashing=0
|
|
||||||
typeset -g _dots_prompt_symbol="λ"
|
typeset -g _dots_prompt_symbol="λ"
|
||||||
typeset -g _dots_prompt_base=""
|
typeset -g _dots_prompt_base=""
|
||||||
|
typeset -g _dots_session_cache=""
|
||||||
typeset -gA _dots_pc
|
typeset -gA _dots_pc
|
||||||
|
|
||||||
_dots_init_colors() {
|
_dots_init_colors() {
|
||||||
@@ -59,14 +58,17 @@ _dots_abbrev_path() {
|
|||||||
local -a parts=( "${(@s:/:)dir}" )
|
local -a parts=( "${(@s:/:)dir}" )
|
||||||
local count=${#parts[@]}
|
local count=${#parts[@]}
|
||||||
|
|
||||||
(( count <= 3 )) && { print -r -- "$dir"; return }
|
if (( count <= 3 )); then
|
||||||
|
REPLY="$dir"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
local result=""
|
local result=""
|
||||||
local i
|
local i
|
||||||
for (( i=1; i <= count-3; i++ )); do
|
for (( i=1; i <= count-3; i++ )); do
|
||||||
result+="${parts[i][1]}/"
|
result+="${parts[i][1]}/"
|
||||||
done
|
done
|
||||||
print -r -- "${result}${parts[-3]}/${parts[-2]}/${parts[-1]}"
|
REPLY="${result}${parts[-3]}/${parts[-2]}/${parts[-1]}"
|
||||||
}
|
}
|
||||||
|
|
||||||
_dots_session() {
|
_dots_session() {
|
||||||
@@ -189,18 +191,15 @@ typeset -g _dots_git_async_fd=""
|
|||||||
_dots_git_async_callback() {
|
_dots_git_async_callback() {
|
||||||
local fd=$1
|
local fd=$1
|
||||||
local result=""
|
local result=""
|
||||||
# Use sysread for efficient non-blocking read from fd
|
|
||||||
if [[ -n "$fd" ]] && sysread -i "$fd" result 2>/dev/null; then
|
if [[ -n "$fd" ]] && sysread -i "$fd" result 2>/dev/null; then
|
||||||
result="${result%$'\n'}" # trim trailing newline
|
result="${result%$'\n'}"
|
||||||
_dots_git_info_result="$result"
|
_dots_git_info_result="$result"
|
||||||
_dots_build_dots_prompt_base
|
_dots_build_dots_prompt_base
|
||||||
PROMPT="$_dots_prompt_base"
|
PROMPT="$_dots_prompt_base"
|
||||||
# Only reset prompt if not in a special ZLE widget (e.g. fzf)
|
|
||||||
if zle && [[ "${WIDGET:-}" != _dots_* ]]; then
|
if zle && [[ "${WIDGET:-}" != _dots_* ]]; then
|
||||||
zle reset-prompt 2>/dev/null
|
zle reset-prompt 2>/dev/null
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
# Clean up
|
|
||||||
exec {fd}<&-
|
exec {fd}<&-
|
||||||
zle -F "$fd" 2>/dev/null
|
zle -F "$fd" 2>/dev/null
|
||||||
_dots_git_async_fd=""
|
_dots_git_async_fd=""
|
||||||
@@ -226,7 +225,8 @@ _dots_git_async_start() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_dots_build_dots_prompt_base() {
|
_dots_build_dots_prompt_base() {
|
||||||
local dir_path="$(_dots_abbrev_path)"
|
_dots_abbrev_path
|
||||||
|
local dir_path="$REPLY"
|
||||||
local symbol="${_dots_pc[grey]}${_dots_prompt_symbol}${_dots_pc[reset]}"
|
local symbol="${_dots_pc[grey]}${_dots_prompt_symbol}${_dots_pc[reset]}"
|
||||||
(( EUID == 0 )) && symbol="${_dots_pc[orange]}${_dots_pc[bold]}#${_dots_pc[reset]}"
|
(( EUID == 0 )) && symbol="${_dots_pc[orange]}${_dots_pc[bold]}#${_dots_pc[reset]}"
|
||||||
|
|
||||||
@@ -264,7 +264,7 @@ _dots_precmd() {
|
|||||||
|
|
||||||
(( e )) && rp_parts+=("${_dots_pc[orange]}[${e}]${_dots_pc[reset]}")
|
(( e )) && rp_parts+=("${_dots_pc[orange]}[${e}]${_dots_pc[reset]}")
|
||||||
|
|
||||||
local session="$(_dots_session)"
|
local session="$_dots_session_cache"
|
||||||
[[ -n "$session" ]] && rp_parts+=("${_dots_pc[dark_bg]}${_dots_pc[dark]}[${_dots_pc[orange]}${session}${_dots_pc[reset]}${_dots_pc[dark_bg]}${_dots_pc[dark]}]${_dots_pc[reset]}")
|
[[ -n "$session" ]] && rp_parts+=("${_dots_pc[dark_bg]}${_dots_pc[dark]}[${_dots_pc[orange]}${session}${_dots_pc[reset]}${_dots_pc[dark_bg]}${_dots_pc[dark]}]${_dots_pc[reset]}")
|
||||||
|
|
||||||
RPROMPT="${(j: :)rp_parts}"
|
RPROMPT="${(j: :)rp_parts}"
|
||||||
@@ -282,36 +282,11 @@ _dots_precmd() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
TRAPINT() {
|
|
||||||
# Only customize when ZLE is active (at prompt, not during command)
|
|
||||||
if [[ -o zle ]] && [[ -o interactive ]] && (( ${+WIDGET} )); then
|
|
||||||
if [[ -z "$BUFFER" ]] && (( ! _dots_prompt_flashing )); then
|
|
||||||
# Empty buffer: flash the prompt symbol
|
|
||||||
_dots_prompt_flashing=1
|
|
||||||
local git_part=""
|
|
||||||
[[ -n "$_dots_git_info_result" ]] && git_part=" ${_dots_git_info_result}"
|
|
||||||
local flash_prompt=$'\n'"${_dots_pc[dark_bg]}${_dots_pc[dark]}#${_dots_pc[teal]}$(_dots_abbrev_path)${_dots_pc[reset]}${_dots_pc[dark_bg]}${_dots_pc[dark]}#${_dots_pc[reset]}${git_part}"$'\n'$'%{\e[48;2;248;140;20m\e[30m%}'"${_dots_prompt_symbol}"$' %{\e[0m%}'
|
|
||||||
PROMPT="$flash_prompt"
|
|
||||||
zle reset-prompt
|
|
||||||
zselect -t $PROMPT_FLASH_DELAY
|
|
||||||
_dots_prompt_flashing=0
|
|
||||||
PROMPT="$_dots_prompt_base"
|
|
||||||
zle reset-prompt
|
|
||||||
return 0
|
|
||||||
elif [[ -n "$BUFFER" ]]; then
|
|
||||||
# Buffer has content: clear autosuggest, then default behavior
|
|
||||||
zle autosuggest-clear 2>/dev/null
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
# Propagate signal: use special return code -1 to let zsh handle normally
|
|
||||||
return $((128 + ${1:-2}))
|
|
||||||
}
|
|
||||||
|
|
||||||
_dots_prompt_init() {
|
_dots_prompt_init() {
|
||||||
zmodload zsh/datetime 2>/dev/null
|
zmodload zsh/datetime 2>/dev/null
|
||||||
zmodload zsh/zselect 2>/dev/null
|
|
||||||
zmodload zsh/system 2>/dev/null
|
zmodload zsh/system 2>/dev/null
|
||||||
_dots_init_colors
|
_dots_init_colors
|
||||||
|
_dots_session_cache="$(_dots_session)"
|
||||||
_dots_build_dots_prompt_base
|
_dots_build_dots_prompt_base
|
||||||
|
|
||||||
setopt PROMPT_SUBST EXTENDED_HISTORY INC_APPEND_HISTORY_TIME
|
setopt PROMPT_SUBST EXTENDED_HISTORY INC_APPEND_HISTORY_TIME
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
_dots_load_keybindings() {
|
_dots_load_keybindings() {
|
||||||
bindkey -e
|
bindkey -e
|
||||||
stty -ixon 2>/dev/null
|
|
||||||
|
# Ctrl+D: delete char (suppress IGNORE_EOF logout warning)
|
||||||
|
bindkey '^D' delete-char
|
||||||
|
|
||||||
# Ctrl+J: zoxide jump
|
# Ctrl+J: zoxide jump
|
||||||
_dots_zoxide_widget() {
|
_dots_zoxide_widget() {
|
||||||
@@ -45,7 +47,13 @@ _dots_load_keybindings() {
|
|||||||
if (st !~ /D/) git[f] = st
|
if (st !~ /D/) git[f] = st
|
||||||
}
|
}
|
||||||
close(cmd)
|
close(cmd)
|
||||||
|
# Build index of local files for filtering history entries
|
||||||
|
fcmd = "rg --files --hidden --glob \"!.git\" 2>/dev/null"
|
||||||
|
while ((fcmd | getline line) > 0) local_files[line] = 1
|
||||||
|
close(fcmd)
|
||||||
for (f in cnt) {
|
for (f in cnt) {
|
||||||
|
# Only include history entries that exist in current directory
|
||||||
|
if (!(f in local_files)) continue
|
||||||
s = cnt[f] * 1000 + ts[f]
|
s = cnt[f] * 1000 + ts[f]
|
||||||
if (f in git) { s += 100000; printf "%d\t%s\t%s\n", s, clr(git[f]), f; delete git[f] }
|
if (f in git) { s += 100000; printf "%d\t%s\t%s\n", s, clr(git[f]), f; delete git[f] }
|
||||||
else printf "%d\t \t%s\n", s, f
|
else printf "%d\t \t%s\n", s, f
|
||||||
@@ -62,9 +70,10 @@ _dots_load_keybindings() {
|
|||||||
rg --files --hidden --glob '!.git' 2>/dev/null | awk '{print " \t" $0}'
|
rg --files --hidden --glob '!.git' 2>/dev/null | awk '{print " \t" $0}'
|
||||||
} | awk -F'\t' '!seen[$2]++' \
|
} | awk -F'\t' '!seen[$2]++' \
|
||||||
| fzf --ansi --delimiter='\t' --nth=2 \
|
| fzf --ansi --delimiter='\t' --nth=2 \
|
||||||
--header 'enter=edit | ^v=preview' \
|
--header 'enter=edit | ^v=preview | ^z=zen' \
|
||||||
--preview 'preview {2}' \
|
--preview 'preview {2}' \
|
||||||
--bind 'ctrl-v:execute(preview {2})')" \
|
--bind 'ctrl-v:execute(preview {2})' \
|
||||||
|
--bind 'ctrl-z:execute(preview --zen {2})')" \
|
||||||
|| { zle reset-prompt; return; }
|
|| { zle reset-prompt; return; }
|
||||||
file="$(printf '%s' "$file" | cut -f2)"
|
file="$(printf '%s' "$file" | cut -f2)"
|
||||||
[[ -z "$file" ]] && { zle reset-prompt; return; }
|
[[ -z "$file" ]] && { zle reset-prompt; return; }
|
||||||
@@ -81,14 +90,6 @@ _dots_load_keybindings() {
|
|||||||
if [[ -z "${CODESPACES:-}" ]]; then
|
if [[ -z "${CODESPACES:-}" ]]; then
|
||||||
_dots_ssh_hosts() {
|
_dots_ssh_hosts() {
|
||||||
local ssh_log="${XDG_DATA_HOME:-$HOME/.local/share}/ssh/log"
|
local ssh_log="${XDG_DATA_HOME:-$HOME/.local/share}/ssh/log"
|
||||||
local cs_cache="$_dots_cache_dir/codespaces"
|
|
||||||
|
|
||||||
# Background refresh if cache is stale (>5 min)
|
|
||||||
if [[ -f "$cs_cache" ]] && [[ -n "$(find "$cs_cache" -mmin +5 2>/dev/null)" ]]; then
|
|
||||||
{ gh cs list --json name,repository,gitStatus \
|
|
||||||
-q '.[] | "cs:\(.name)\t\(.repository)\t\(.gitStatus.ref // "")"' \
|
|
||||||
2>/dev/null > "$cs_cache.tmp" && mv "$cs_cache.tmp" "$cs_cache"; } &!
|
|
||||||
fi
|
|
||||||
|
|
||||||
{
|
{
|
||||||
if [[ -f "$ssh_log" ]]; then
|
if [[ -f "$ssh_log" ]]; then
|
||||||
@@ -96,13 +97,9 @@ _dots_load_keybindings() {
|
|||||||
fi
|
fi
|
||||||
awk '/^Host / && !/\*/ {print $2}' ~/.ssh/config ~/.ssh/config.d/* 2>/dev/null
|
awk '/^Host / && !/\*/ {print $2}' ~/.ssh/config ~/.ssh/config.d/* 2>/dev/null
|
||||||
awk '{print $1}' ~/.ssh/known_hosts 2>/dev/null | tr ',' '\n' | sed 's/\[//;s/\]:.*//'
|
awk '{print $1}' ~/.ssh/known_hosts 2>/dev/null | tr ',' '\n' | sed 's/\[//;s/\]:.*//'
|
||||||
if [[ -f "$cs_cache" ]]; then
|
|
||||||
cat "$cs_cache"
|
|
||||||
else
|
|
||||||
gh cs list --json name,repository,gitStatus \
|
gh cs list --json name,repository,gitStatus \
|
||||||
-q '.[] | "cs:\(.name)\t\(.repository)\t\(.gitStatus.ref // "")"' \
|
-q '.[] | "cs:\(.name)\t\(.repository)\t\(.gitStatus.ref // "")"' \
|
||||||
2>/dev/null | tee "$cs_cache"
|
2>/dev/null
|
||||||
fi
|
|
||||||
} | awk -F'\t' '
|
} | awk -F'\t' '
|
||||||
BEGIN {
|
BEGIN {
|
||||||
teal = "\033[38;2;44;180;148m"
|
teal = "\033[38;2;44;180;148m"
|
||||||
@@ -323,8 +320,8 @@ for line in sys.stdin:
|
|||||||
except: pass
|
except: pass
|
||||||
" 2>/dev/null
|
" 2>/dev/null
|
||||||
' --delimiter="|" --with-nth=1,3 \
|
' --delimiter="|" --with-nth=1,3 \
|
||||||
--header 'enter=resume | ^r=restricted | ^s=latest | ^n=new' \
|
--header 'enter=resume | ^r=restricted | ^s=latest | ^n=new | ^d=delete' \
|
||||||
--expect=ctrl-r,ctrl-s,ctrl-n)"
|
--expect=ctrl-r,ctrl-s,ctrl-n,ctrl-d)"
|
||||||
local fzf_rc=$?
|
local fzf_rc=$?
|
||||||
[[ $fzf_rc -ne 0 && "$session" != ctrl-s* && "$session" != ctrl-n* ]] && { zle reset-prompt; return; }
|
[[ $fzf_rc -ne 0 && "$session" != ctrl-s* && "$session" != ctrl-n* ]] && { zle reset-prompt; return; }
|
||||||
local key=$(echo "$session" | head -1)
|
local key=$(echo "$session" | head -1)
|
||||||
@@ -344,6 +341,13 @@ for line in sys.stdin:
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
local id=$(echo "$line" | cut -d'|' -f2 | tr -d ' ')
|
local id=$(echo "$line" | cut -d'|' -f2 | tr -d ' ')
|
||||||
|
[[ -n "$id" ]] || { zle reset-prompt; return; }
|
||||||
|
# Ctrl+D — delete session
|
||||||
|
if [[ "$key" == "ctrl-d" ]]; then
|
||||||
|
rm -rf "${session_dir:?}/$id" "${session_dir:?}/${id}.jsonl"
|
||||||
|
zle reset-prompt
|
||||||
|
return
|
||||||
|
fi
|
||||||
if [[ "$key" == "ctrl-r" ]]; then
|
if [[ "$key" == "ctrl-r" ]]; then
|
||||||
BUFFER="gh copilot --resume $id"
|
BUFFER="gh copilot --resume $id"
|
||||||
else
|
else
|
||||||
@@ -383,5 +387,22 @@ for line in sys.stdin:
|
|||||||
}
|
}
|
||||||
zle -N _dots_stash_widget
|
zle -N _dots_stash_widget
|
||||||
bindkey '^Y' _dots_stash_widget
|
bindkey '^Y' _dots_stash_widget
|
||||||
|
|
||||||
|
# Restore Tab after bindkey -e
|
||||||
|
if (( ${+widgets[fzf-completion]} )); then
|
||||||
|
bindkey '^I' fzf-completion
|
||||||
|
elif (( ${+widgets[_dots_lazy_comp_widget]} )); then
|
||||||
|
bindkey '^I' _dots_lazy_comp_widget
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Enter: expand colby → full copilot invocation (visible in terminal history)
|
||||||
|
_dots_enter_handler() {
|
||||||
|
if [[ "$BUFFER" == "colby" || "$BUFFER" == "colby "* ]]; then
|
||||||
|
BUFFER="${BUFFER/#colby/copilot --allow-all-tools --allow-all-paths}"
|
||||||
|
fi
|
||||||
|
zle accept-line
|
||||||
|
}
|
||||||
|
zle -N _dots_enter_handler
|
||||||
|
bindkey '^M' _dots_enter_handler
|
||||||
}
|
}
|
||||||
_dots_load_keybindings
|
_dots_load_keybindings
|
||||||
|
|||||||
128
home/.zshrc
128
home/.zshrc
@@ -1,19 +1,38 @@
|
|||||||
# Profiling: ZSH_BENCH=1 zsh
|
# Profiling: ZSH_BENCH=1 zsh
|
||||||
[[ -n "$ZSH_BENCH" ]] && zmodload zsh/zprof
|
[[ -n "$ZSH_BENCH" ]] && zmodload zsh/zprof
|
||||||
|
|
||||||
# Upgrade xterm-color to xterm-256color (gh cs ssh sets the weaker value)
|
# Terminal capabilities
|
||||||
[[ "$TERM" == "xterm-color" ]] && export TERM=xterm-256color
|
[[ "$TERM" == "xterm-color" ]] && export TERM=xterm-256color
|
||||||
|
|
||||||
# Assume truecolor support if terminal advertises 256color (covers SSH, tmux)
|
|
||||||
[[ -z "$COLORTERM" && "$TERM" == *256color* ]] && export COLORTERM=truecolor
|
[[ -z "$COLORTERM" && "$TERM" == *256color* ]] && export COLORTERM=truecolor
|
||||||
|
|
||||||
_dots_cache_dir="${XDG_CACHE_HOME:-$HOME/.cache}/dots"
|
_dots_cache_dir="${XDG_CACHE_HOME:-$HOME/.cache}/dots"
|
||||||
|
|
||||||
|
# Cache eval output keyed on binary mtime — busts on brew upgrade / tool update
|
||||||
|
_dots_cached_eval() {
|
||||||
|
local name="$1" bin="$2"; shift 2
|
||||||
|
local cache="$_dots_cache_dir/${name}.zsh"
|
||||||
|
if [[ -f "$cache" && "$cache" -nt "$bin" ]]; then
|
||||||
|
source "$cache"
|
||||||
|
else
|
||||||
|
"$@" > "$cache" 2>/dev/null
|
||||||
|
if [[ -s "$cache" ]]; then
|
||||||
|
zcompile "$cache" 2>/dev/null
|
||||||
|
source "$cache"
|
||||||
|
else
|
||||||
|
rm -f "$cache"; return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Environment ---
|
||||||
|
|
||||||
_dots_load_profile() { source "$HOME/.profile" }
|
_dots_load_profile() { source "$HOME/.profile" }
|
||||||
_dots_load_profile
|
_dots_load_profile
|
||||||
|
|
||||||
_dots_setup_dirs() {
|
_dots_setup_dirs() {
|
||||||
mkdir -p "$XDG_DATA_HOME" "$XDG_CONFIG_HOME" "$HOME/.local/bin" "$WORKSPACE" "$_dots_cache_dir"
|
local d; for d in "$XDG_DATA_HOME" "$XDG_CONFIG_HOME" "$HOME/.local/bin" "$WORKSPACE" "$_dots_cache_dir"; do
|
||||||
|
[[ -d "$d" ]] || mkdir -p "$d"
|
||||||
|
done
|
||||||
}
|
}
|
||||||
_dots_setup_dirs
|
_dots_setup_dirs
|
||||||
|
|
||||||
@@ -37,12 +56,13 @@ _dots_cache_ls_colors
|
|||||||
|
|
||||||
[[ -f ~/.aliases ]] && source ~/.aliases
|
[[ -f ~/.aliases ]] && source ~/.aliases
|
||||||
|
|
||||||
|
# --- Completion (lazy — deferred until first Tab press) ---
|
||||||
|
|
||||||
_dots_init_completion() {
|
_dots_init_completion() {
|
||||||
local comp_dir="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/completions"
|
local comp_dir="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/completions"
|
||||||
[[ -d "$comp_dir" ]] && fpath=("$comp_dir" $fpath)
|
[[ -d "$comp_dir" ]] && fpath=("$comp_dir" $fpath)
|
||||||
|
|
||||||
autoload -Uz compinit
|
autoload -Uz compinit
|
||||||
# Daily cache invalidation
|
|
||||||
local dump="$HOME/.zcompdump"
|
local dump="$HOME/.zcompdump"
|
||||||
if [[ -f "$dump" ]]; then
|
if [[ -f "$dump" ]]; then
|
||||||
zmodload -F zsh/stat b:zstat 2>/dev/null
|
zmodload -F zsh/stat b:zstat 2>/dev/null
|
||||||
@@ -57,7 +77,6 @@ _dots_init_completion() {
|
|||||||
compinit
|
compinit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Completion styling
|
|
||||||
zstyle ':completion:*' menu select
|
zstyle ':completion:*' menu select
|
||||||
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
|
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
|
||||||
zstyle ':completion:*' group-name ''
|
zstyle ':completion:*' group-name ''
|
||||||
@@ -65,40 +84,25 @@ _dots_init_completion() {
|
|||||||
zstyle ':completion:*:warnings' format $'\e[38;2;248;140;20m-- no matches --\e[0m'
|
zstyle ':completion:*:warnings' format $'\e[38;2;248;140;20m-- no matches --\e[0m'
|
||||||
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
|
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
|
||||||
}
|
}
|
||||||
_dots_init_completion
|
|
||||||
|
|
||||||
_dots_load_plugins() {
|
# Stub that loads real completion on first Tab, then replays the keypress
|
||||||
local plugin_dir="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/plugins"
|
_dots_lazy_comp_widget() {
|
||||||
|
_dots_init_completion
|
||||||
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=#3C3C3C'
|
# Point fzf fallback to real completion before removing this widget
|
||||||
|
fzf_default_completion=expand-or-complete
|
||||||
local f="$plugin_dir/zsh-autosuggestions/zsh-autosuggestions.zsh"
|
zle -D _dots_lazy_comp_widget
|
||||||
[[ -f "$f" ]] && source "$f"
|
if (( ${+widgets[fzf-completion]} )); then
|
||||||
|
bindkey '^I' fzf-completion
|
||||||
# syntax-highlighting must be sourced last
|
zle fzf-completion "$@"
|
||||||
f="$plugin_dir/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"
|
else
|
||||||
[[ -f "$f" ]] && source "$f"
|
bindkey '^I' expand-or-complete
|
||||||
|
zle expand-or-complete "$@"
|
||||||
# Syntax highlighting theme
|
fi
|
||||||
typeset -gA ZSH_HIGHLIGHT_STYLES
|
|
||||||
ZSH_HIGHLIGHT_STYLES[command]='fg=#2CB494'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[builtin]='fg=#2CB494'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[alias]='fg=#2CB494'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[function]='fg=#2CB494'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[unknown-token]='fg=#F88C14'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[path]='fg=#CCE0D0,underline'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[globbing]='fg=#F88C14'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[single-quoted-argument]='fg=#7290B8'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[double-quoted-argument]='fg=#7290B8'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[dollar-quoted-argument]='fg=#7290B8'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[comment]='fg=#808080'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[arg0]='fg=#2CB494'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[default]='fg=#CCE0D0'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[commandseparator]='fg=#808080'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[redirection]='fg=#F88C14'
|
|
||||||
ZSH_HIGHLIGHT_STYLES[option]='fg=#7290B8'
|
|
||||||
}
|
}
|
||||||
_dots_load_plugins
|
zle -N _dots_lazy_comp_widget
|
||||||
|
bindkey '^I' _dots_lazy_comp_widget
|
||||||
|
|
||||||
|
# --- History & options ---
|
||||||
|
|
||||||
_dots_load_history() {
|
_dots_load_history() {
|
||||||
HISTFILE="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/history"
|
HISTFILE="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/history"
|
||||||
@@ -109,24 +113,33 @@ _dots_load_history() {
|
|||||||
}
|
}
|
||||||
_dots_load_history
|
_dots_load_history
|
||||||
|
|
||||||
setopt IGNORE_EOF
|
stty -ixon 2>/dev/null
|
||||||
|
|
||||||
source "$HOME/.zsh/widgets.zsh"
|
# --- Tool init (cached) ---
|
||||||
|
|
||||||
_dots_load_fzf() {
|
_dots_load_mise() {
|
||||||
command -v fzf &>/dev/null || return
|
local bin="${commands[mise]:-}"
|
||||||
|
[[ -n "$bin" ]] || return
|
||||||
|
_dots_cached_eval mise "$bin" mise activate --shims zsh
|
||||||
|
}
|
||||||
|
|
||||||
|
# fzf env vars (needed by widgets and zoxide before fzf init loads)
|
||||||
|
if [[ -n "${commands[fzf]:-}" ]]; then
|
||||||
export FZF_DEFAULT_COMMAND='rg --files --hidden --glob "!.git"'
|
export FZF_DEFAULT_COMMAND='rg --files --hidden --glob "!.git"'
|
||||||
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
|
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
|
||||||
export FZF_DEFAULT_OPTS='--style=minimal --layout=reverse --height=40% --border=none --no-scrollbar --prompt="> " --info=inline-right --no-separator --margin=1,0,0,0 --color=fg:#808080,fg+:#CCE0D0,bg:-1,bg+:#1A1A1A --color=hl:#2CB494,hl+:#2CB494,info:#808080,marker:#2CB494 --color=prompt:#2CB494,spinner:#88409C,pointer:#2CB494,header:#808080 --color=border:#3C3C3C,preview-border:#3C3C3C,gutter:#1A1A1A,preview-fg:#CCE0D0'
|
export FZF_DEFAULT_OPTS='--style=minimal --layout=reverse --height=40% --border=none --no-scrollbar --prompt="> " --info=inline-right --no-separator --margin=1,0,0,0 --color=fg:#808080,fg+:#CCE0D0,bg:-1,bg+:#1A1A1A --color=hl:#2CB494,hl+:#2CB494,info:#808080,marker:#2CB494 --color=prompt:#2CB494,spinner:#88409C,pointer:#2CB494,header:#808080 --color=border:#3C3C3C,preview-border:#3C3C3C,gutter:#1A1A1A,preview-fg:#CCE0D0'
|
||||||
# fzf --zsh requires v0.48+
|
fi
|
||||||
if fzf --zsh &>/dev/null; then
|
|
||||||
source <(fzf --zsh)
|
_dots_load_fzf() {
|
||||||
else
|
local bin="${commands[fzf]:-}"
|
||||||
|
[[ -n "$bin" ]] || return
|
||||||
|
if ! _dots_cached_eval fzf "$bin" fzf --zsh; then
|
||||||
local -a fzf_paths=(
|
local -a fzf_paths=(
|
||||||
"${HOMEBREW_PREFIX:-/opt/homebrew}/opt/fzf/shell"
|
"${HOMEBREW_PREFIX:-/opt/homebrew}/opt/fzf/shell"
|
||||||
"/usr/share/fzf"
|
"/usr/share/fzf"
|
||||||
"${XDG_DATA_HOME:-$HOME/.local/share}/fzf/shell"
|
"${XDG_DATA_HOME:-$HOME/.local/share}/fzf/shell"
|
||||||
)
|
)
|
||||||
|
local dir
|
||||||
for dir in "${fzf_paths[@]}"; do
|
for dir in "${fzf_paths[@]}"; do
|
||||||
[[ -f "$dir/key-bindings.zsh" ]] && source "$dir/key-bindings.zsh" && break
|
[[ -f "$dir/key-bindings.zsh" ]] && source "$dir/key-bindings.zsh" && break
|
||||||
done
|
done
|
||||||
@@ -136,21 +149,28 @@ _dots_load_fzf() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
_dots_load_zoxide() {
|
_dots_load_zoxide() {
|
||||||
command -v zoxide &>/dev/null || return
|
local bin="${commands[zoxide]:-}"
|
||||||
|
[[ -n "$bin" ]] || return
|
||||||
export _ZO_FZF_OPTS="$FZF_DEFAULT_OPTS"
|
export _ZO_FZF_OPTS="$FZF_DEFAULT_OPTS"
|
||||||
export _ZO_ECHO=0
|
export _ZO_ECHO=0
|
||||||
eval "$(zoxide init zsh)"
|
_dots_cached_eval zoxide "$bin" zoxide init zsh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_dots_load_mise
|
||||||
|
_dots_load_zoxide
|
||||||
|
|
||||||
|
# --- Interactive shell ---
|
||||||
|
|
||||||
source "$HOME/.zsh/prompt.zsh"
|
source "$HOME/.zsh/prompt.zsh"
|
||||||
|
|
||||||
_dots_load_mise() {
|
# Load fzf + widgets after first prompt renders (zle-line-init fires before first keystroke)
|
||||||
command -v mise &>/dev/null && eval "$(mise activate zsh)"
|
autoload -Uz add-zle-hook-widget
|
||||||
|
_dots_lazy_widgets() {
|
||||||
|
_dots_load_fzf
|
||||||
|
source "$HOME/.zsh/widgets.zsh"
|
||||||
|
add-zle-hook-widget -d zle-line-init _dots_lazy_widgets
|
||||||
}
|
}
|
||||||
_dots_load_mise
|
add-zle-hook-widget zle-line-init _dots_lazy_widgets
|
||||||
_dots_load_fzf
|
|
||||||
_dots_load_zoxide
|
|
||||||
|
|
||||||
[[ -n "$ZSH_BENCH" ]] && zprof || true
|
[[ -n "$ZSH_BENCH" ]] && zprof || true
|
||||||
|
|||||||
@@ -15,5 +15,5 @@ if ! command -v brew &> /dev/null; then
|
|||||||
else
|
else
|
||||||
log_skip "Homebrew already installed"
|
log_skip "Homebrew already installed"
|
||||||
fi
|
fi
|
||||||
brew --version | log_quote
|
|
||||||
log_pass "Homebrew installed"
|
log_pass "Homebrew installed"
|
||||||
|
echo "Homebrew $(cat "$(brew --repository 2>/dev/null)"/.git/describe-cache/* 2>/dev/null || brew --version | head -1)" | log_quote
|
||||||
|
|||||||
@@ -29,6 +29,6 @@ sudo apt-get install -qq "${apt_packages[@]}"
|
|||||||
|
|
||||||
unset apt_packages
|
unset apt_packages
|
||||||
|
|
||||||
apt --version | log_quote
|
|
||||||
log_pass "apt packages installed"
|
log_pass "apt packages installed"
|
||||||
|
apt --version | log_quote
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,6 @@ if ! command -v yay &>/dev/null; then
|
|||||||
rm -rf /tmp/yay
|
rm -rf /tmp/yay
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
log_pass "pacman packages installed"
|
||||||
pacman --version | log_quote
|
pacman --version | log_quote
|
||||||
yay --version | log_quote
|
yay --version | log_quote
|
||||||
log_pass "pacman packages installed"
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ if [ ! -f "$ssh_key" ]; then
|
|||||||
-C "$(whoami)@$(hostname)-$(date -I)"
|
-C "$(whoami)@$(hostname)-$(date -I)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
log_pass "SSH key configured"
|
||||||
cat "$ssh_pub" | log_quote
|
cat "$ssh_pub" | log_quote
|
||||||
|
|
||||||
unset ssh_method ssh_target ssh_key ssh_pub
|
unset ssh_method ssh_target ssh_key ssh_pub
|
||||||
log_pass "SSH key configured"
|
|
||||||
|
|||||||
@@ -26,5 +26,5 @@ if ! command -v git &> /dev/null; then
|
|||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
git --version | log_quote
|
|
||||||
log_pass "git configured"
|
log_pass "git configured"
|
||||||
|
git --version | log_quote
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
# Description:
|
# Description:
|
||||||
# Configure zsh shell with direct plugin management.
|
# Configure zsh shell.
|
||||||
#
|
#
|
||||||
|
|
||||||
# install zsh
|
# install zsh
|
||||||
@@ -24,26 +24,6 @@ if ! command -v zsh &> /dev/null; then
|
|||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
zsh --version | log_quote
|
|
||||||
|
|
||||||
# plugin directory (XDG compliant)
|
|
||||||
PLUGIN_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/plugins"
|
|
||||||
mkdir -p "$PLUGIN_DIR"
|
|
||||||
|
|
||||||
# install zsh-autosuggestions
|
|
||||||
if [ ! -d "$PLUGIN_DIR/zsh-autosuggestions" ]; then
|
|
||||||
git clone -q \
|
|
||||||
https://github.com/zsh-users/zsh-autosuggestions.git \
|
|
||||||
"$PLUGIN_DIR/zsh-autosuggestions"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# install zsh-syntax-highlighting
|
|
||||||
if [ ! -d "$PLUGIN_DIR/zsh-syntax-highlighting" ]; then
|
|
||||||
git clone -q \
|
|
||||||
https://github.com/zsh-users/zsh-syntax-highlighting.git \
|
|
||||||
"$PLUGIN_DIR/zsh-syntax-highlighting"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# change default shell to zsh
|
# change default shell to zsh
|
||||||
if [[ "$SHELL" != *zsh ]]; then
|
if [[ "$SHELL" != *zsh ]]; then
|
||||||
sudo chsh -s "$(command -v zsh)" "$(whoami)"
|
sudo chsh -s "$(command -v zsh)" "$(whoami)"
|
||||||
@@ -51,4 +31,5 @@ if [[ "$SHELL" != *zsh ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
log_pass "zsh configured"
|
log_pass "zsh configured"
|
||||||
|
zsh --version | log_quote
|
||||||
|
|
||||||
|
|||||||
@@ -23,8 +23,6 @@ if ! command -v stow &> /dev/null; then
|
|||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
stow --version | log_quote
|
|
||||||
|
|
||||||
root_dir=${DOTFILES:-$(dirname "$(dirname "$(dirname "$(realpath "$0")")")")}
|
root_dir=${DOTFILES:-$(dirname "$(dirname "$(dirname "$(realpath "$0")")")")}
|
||||||
|
|
||||||
rm -f "$HOME/.bash_profile"
|
rm -f "$HOME/.bash_profile"
|
||||||
@@ -49,5 +47,18 @@ fi
|
|||||||
# Bust PATH cache to force rebuild with new profile
|
# Bust PATH cache to force rebuild with new profile
|
||||||
rm -f "${XDG_CACHE_HOME:-$HOME/.cache}/dots/path"
|
rm -f "${XDG_CACHE_HOME:-$HOME/.cache}/dots/path"
|
||||||
|
|
||||||
log_pass "stow linked"
|
# Compile zsh dotfiles for faster shell startup
|
||||||
|
if command -v zsh &>/dev/null; then
|
||||||
|
zsh -c '
|
||||||
|
for f in ~/.zsh/*.zsh ~/.aliases ~/.profile(N); do
|
||||||
|
[[ $f.zwc -nt $f ]] || zcompile "$f" 2>/dev/null
|
||||||
|
done
|
||||||
|
'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Bust tool init caches so they regenerate with new PATH/tools
|
||||||
|
rm -f "${XDG_CACHE_HOME:-$HOME/.cache}"/dots/{fzf,mise,zoxide}.zsh{,.zwc}
|
||||||
|
|
||||||
|
log_pass "stow linked"
|
||||||
|
stow --version | log_quote
|
||||||
|
|
||||||
|
|||||||
@@ -23,11 +23,13 @@ if ! command -v tmux &> /dev/null; then
|
|||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
tmux -V | log_quote
|
# Compile screensaver (skip if binary is newer than source)
|
||||||
|
|
||||||
# Compile screensaver
|
|
||||||
if command -v cc &> /dev/null && [ -f "$HOME/.tmux/donut.c" ]; then
|
if command -v cc &> /dev/null && [ -f "$HOME/.tmux/donut.c" ]; then
|
||||||
|
if [ ! -f "$HOME/.tmux/donut" ] || [ "$HOME/.tmux/donut.c" -nt "$HOME/.tmux/donut" ]; then
|
||||||
cc -O2 -o "$HOME/.tmux/donut" "$HOME/.tmux/donut.c" -lm
|
cc -O2 -o "$HOME/.tmux/donut" "$HOME/.tmux/donut.c" -lm
|
||||||
log_pass "Compiled donut screensaver"
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
log_pass "tmux configured"
|
||||||
|
tmux -V | log_quote
|
||||||
|
|
||||||
|
|||||||
@@ -18,11 +18,12 @@ for url in "${vim_plugins[@]}"; do
|
|||||||
name=$(basename "$url" .git)
|
name=$(basename "$url" .git)
|
||||||
dest="$vim_pack_dir/$name"
|
dest="$vim_pack_dir/$name"
|
||||||
if [[ -d "$dest" ]]; then
|
if [[ -d "$dest" ]]; then
|
||||||
git -C "$dest" pull --quiet
|
git -C "$dest" pull --quiet &
|
||||||
log_pass "$name updated"
|
|
||||||
else
|
else
|
||||||
git clone --depth 1 --quiet "$url" "$dest"
|
git clone --depth 1 --quiet "$url" "$dest" &
|
||||||
log_pass "$name installed"
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
wait
|
||||||
|
|
||||||
log_pass "vim plugins configured"
|
log_pass "vim plugins configured"
|
||||||
|
vim --version 2>/dev/null | sed -n '1p' | log_quote
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ if ! command -v chafa &> /dev/null; then
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
command -v chafa &> /dev/null && chafa --version | sed -n '1p' | log_quote
|
|
||||||
|
|
||||||
# pdftotext — PDF text extraction (part of poppler)
|
# pdftotext — PDF text extraction (part of poppler)
|
||||||
if ! command -v pdftotext &> /dev/null; then
|
if ! command -v pdftotext &> /dev/null; then
|
||||||
@@ -41,6 +40,6 @@ if ! command -v pdftotext &> /dev/null; then
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
command -v pdftotext &> /dev/null && pdftotext -v 2>&1 | sed -n '1p' | log_quote
|
|
||||||
|
|
||||||
log_pass "preview dependencies"
|
log_pass "preview dependencies"
|
||||||
|
command -v chafa &> /dev/null && chafa --version | sed -n '1p' | log_quote
|
||||||
|
command -v pdftotext &> /dev/null && pdftotext -v 2>&1 | sed -n '1p' | log_quote
|
||||||
@@ -43,13 +43,13 @@ if [[ "$DOTS_ENV" != "codespaces" ]]; then
|
|||||||
typeset -a MISE_RUNTIMES=(
|
typeset -a MISE_RUNTIMES=(
|
||||||
"python@3.14.2"
|
"python@3.14.2"
|
||||||
"node@25.5.0"
|
"node@25.5.0"
|
||||||
|
"bun@latest"
|
||||||
|
"rust@latest"
|
||||||
)
|
)
|
||||||
|
|
||||||
log_info "Installing runtimes..."
|
log_info "Installing runtimes..."
|
||||||
MISE_QUIET=1 mise install "${MISE_RUNTIMES[@]}" 2>&1 | log_quote
|
MISE_QUIET=1 mise install "${MISE_RUNTIMES[@]}" 2>&1 | log_quote || true
|
||||||
for tool in "${MISE_RUNTIMES[@]}"; do
|
MISE_QUIET=1 mise use -g "${MISE_RUNTIMES[@]}" 2>&1 | log_quote || true
|
||||||
MISE_QUIET=1 mise use -g "$tool" 2>&1 | log_quote
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Activate mise shims so runtimes (e.g. python3) are available for app installers
|
# Activate mise shims so runtimes (e.g. python3) are available for app installers
|
||||||
@@ -62,6 +62,12 @@ typeset -a MISE_APPS=(
|
|||||||
"zoxide@latest"
|
"zoxide@latest"
|
||||||
"ripgrep@latest"
|
"ripgrep@latest"
|
||||||
"delta@latest"
|
"delta@latest"
|
||||||
|
"eza@latest"
|
||||||
|
"fd@latest"
|
||||||
|
"sd@latest"
|
||||||
|
"bottom@latest"
|
||||||
|
"ubi:dalance/procs@latest"
|
||||||
|
"cargo:tealdeer@latest"
|
||||||
)
|
)
|
||||||
|
|
||||||
if [[ "$DOTS_ENV" != "codespaces" ]]; then
|
if [[ "$DOTS_ENV" != "codespaces" ]]; then
|
||||||
@@ -76,12 +82,10 @@ if [[ "$DOTS_ENV" != "codespaces" ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
log_info "Installing apps..."
|
log_info "Installing apps..."
|
||||||
for tool in "${MISE_APPS[@]}"; do
|
MISE_QUIET=1 mise use -g "${MISE_APPS[@]}" 2>&1 | log_quote || true
|
||||||
MISE_QUIET=1 mise use -g "$tool" 2>&1 | tail -1 | log_quote
|
|
||||||
done
|
|
||||||
|
|
||||||
# Rebuild bat theme cache with mise-installed bat (must match delta's syntect version)
|
# Rebuild bat theme cache with mise-installed bat (must match delta's syntect version)
|
||||||
bat cache --build &>/dev/null
|
bat cache --build &>/dev/null || true
|
||||||
|
|
||||||
if [[ "$DOTS_ENV" != "codespaces" ]]; then
|
if [[ "$DOTS_ENV" != "codespaces" ]]; then
|
||||||
# Setup Poetry ZSH completions (XDG compliant)
|
# Setup Poetry ZSH completions (XDG compliant)
|
||||||
@@ -92,24 +96,5 @@ if [[ "$DOTS_ENV" != "codespaces" ]]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Verify installations
|
|
||||||
log_info "Verifying installations..."
|
|
||||||
{
|
|
||||||
if [[ "$DOTS_ENV" != "codespaces" ]]; then
|
|
||||||
mise exec -- python --version
|
|
||||||
mise exec -- poetry --version
|
|
||||||
echo "node $(mise exec -- node --version)"
|
|
||||||
echo "npm $(mise exec -- npm --version)"
|
|
||||||
mise exec -- gh --version
|
|
||||||
mise exec -- terraform --version | sed -n '1p'
|
|
||||||
echo "firebase: $(mise exec -- firebase --version)"
|
|
||||||
echo "fastfetch: $(mise exec -- fastfetch --version 2>&1 | sed -n '1p')"
|
|
||||||
mise exec -- glow --version | sed -n '1p'
|
|
||||||
fi
|
|
||||||
echo "fzf $(fzf --version)"
|
|
||||||
bat --version | sed -n '1p'
|
|
||||||
zoxide --version
|
|
||||||
rg --version | sed -n '1p'
|
|
||||||
delta --version 2>/dev/null | sed -n '1p' || echo "delta: installed (version check failed)"
|
|
||||||
} | log_quote
|
|
||||||
log_pass "mise tools installed"
|
log_pass "mise tools installed"
|
||||||
|
mise ls --current 2>/dev/null | awk '{printf "%s %s\n", $1, $2}' | log_quote
|
||||||
|
|||||||
@@ -56,5 +56,5 @@ if ! groups "$USER" | grep -q "\b$docker_group\b"; then
|
|||||||
sudo usermod -aG docker "$USER"
|
sudo usermod -aG docker "$USER"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
docker --version | log_quote
|
|
||||||
log_pass "Docker configured"
|
log_pass "Docker configured"
|
||||||
|
docker --version | log_quote
|
||||||
|
|||||||
@@ -26,5 +26,5 @@ if ! command -v az &>/dev/null; then
|
|||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
az --version | log_quote
|
|
||||||
log_pass "Azure CLI installed"
|
log_pass "Azure CLI installed"
|
||||||
|
echo "$BREW_FORMULA_VERSIONS" | grep "^azure-cli " | log_quote
|
||||||
|
|||||||
@@ -31,5 +31,5 @@ if ! command -v redis-cli &>/dev/null; then
|
|||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
redis-cli --version | log_quote
|
|
||||||
log_pass "Redis installed"
|
log_pass "Redis installed"
|
||||||
|
redis-cli --version | log_quote
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
if ! echo "$BREW_CASKS" | grep -q "^colour-contrast-analyser$"; then
|
if ! echo "$BREW_CASKS" | grep -q "^colour-contrast-analyser$"; then
|
||||||
brew install --cask colour-contrast-analyser
|
brew install --cask colour-contrast-analyser
|
||||||
else
|
|
||||||
log_skip "CCA already installed"
|
|
||||||
fi
|
fi
|
||||||
log_pass "CCA installed"
|
log_pass "CCA installed"
|
||||||
|
echo "$BREW_CASK_VERSIONS" | grep "^colour-contrast-analyser " | log_quote
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
if ! echo "$BREW_CASKS" | grep -q "^rectangle$"; then
|
if ! echo "$BREW_CASKS" | grep -q "^rectangle$"; then
|
||||||
brew install --cask rectangle
|
brew install --cask rectangle
|
||||||
else
|
|
||||||
log_skip "Rectangle already installed"
|
|
||||||
fi
|
fi
|
||||||
log_pass "Rectangle installed"
|
log_pass "Rectangle installed"
|
||||||
|
echo "$BREW_CASK_VERSIONS" | grep "^rectangle " | log_quote
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
if ! echo "$BREW_CASKS" | grep -q "^betterdisplay$"; then
|
if ! echo "$BREW_CASKS" | grep -q "^betterdisplay$"; then
|
||||||
brew install --cask betterdisplay
|
brew install --cask betterdisplay
|
||||||
else
|
|
||||||
log_skip "BetterDisplay already installed"
|
|
||||||
fi
|
fi
|
||||||
log_pass "BetterDisplay installed"
|
log_pass "BetterDisplay installed"
|
||||||
|
echo "$BREW_CASK_VERSIONS" | grep "^betterdisplay " | log_quote
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# Description:
|
|
||||||
# (macOS only) Install MeetingBar.
|
|
||||||
#
|
|
||||||
|
|
||||||
# macOS only
|
|
||||||
[[ "$DOTS_OS" != "macos" ]] && { log_skip "Not macOS"; return 0; }
|
|
||||||
|
|
||||||
if ! echo "$BREW_CASKS" | grep -q "^meetingbar$"; then
|
|
||||||
brew install --cask meetingbar
|
|
||||||
else
|
|
||||||
log_skip "MeetingBar already installed"
|
|
||||||
fi
|
|
||||||
log_pass "MeetingBar installed"
|
|
||||||
@@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
if ! echo "$BREW_FORMULAE" | grep -q "^dockutil$"; then
|
if ! echo "$BREW_FORMULAE" | grep -q "^dockutil$"; then
|
||||||
brew install dockutil
|
brew install dockutil
|
||||||
else
|
|
||||||
log_skip "dockutil already installed"
|
|
||||||
fi
|
fi
|
||||||
log_pass "dockutil installed"
|
log_pass "dockutil installed"
|
||||||
|
echo "$BREW_FORMULA_VERSIONS" | grep "^dockutil " | log_quote
|
||||||
15
install.d/74-vscode.sh
Executable file
15
install.d/74-vscode.sh
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Description:
|
||||||
|
# (macOS only) Install Visual Studio Code.
|
||||||
|
#
|
||||||
|
|
||||||
|
# macOS only
|
||||||
|
[[ "$DOTS_OS" != "macos" ]] && { log_skip "Not macOS"; return 0; }
|
||||||
|
|
||||||
|
if ! echo "$BREW_CASKS" | grep -q "^visual-studio-code$"; then
|
||||||
|
brew install --cask visual-studio-code
|
||||||
|
fi
|
||||||
|
log_pass "VSCode installed"
|
||||||
|
echo "$BREW_CASK_VERSIONS" | grep "^visual-studio-code " | log_quote
|
||||||
@@ -24,5 +24,5 @@ if ! command -v cmatrix &> /dev/null; then
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
command -v cmatrix &> /dev/null && cmatrix -V 2>&1 | sed -n '1p' | log_quote
|
|
||||||
log_pass "cmatrix installed"
|
log_pass "cmatrix installed"
|
||||||
|
command -v cmatrix &> /dev/null && cmatrix -V 2>&1 | sed -n '1p' | log_quote
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# Description:
|
|
||||||
# (macOS only) Install Wispr Flow.
|
|
||||||
#
|
|
||||||
|
|
||||||
# macOS only
|
|
||||||
[[ "$DOTS_OS" != "macos" ]] && { log_skip "Not macOS"; return 0; }
|
|
||||||
|
|
||||||
if ! echo "$BREW_CASKS" | grep -q "^wispr-flow$"; then
|
|
||||||
brew install --cask wispr-flow
|
|
||||||
else
|
|
||||||
log_skip "Wispr Flow already installed"
|
|
||||||
fi
|
|
||||||
log_pass "Wispr Flow installed"
|
|
||||||
@@ -8,129 +8,63 @@
|
|||||||
# macOS only
|
# macOS only
|
||||||
[[ "$DOTS_OS" != "macos" ]] && { log_skip "Not macOS"; return 0; }
|
[[ "$DOTS_OS" != "macos" ]] && { log_skip "Not macOS"; return 0; }
|
||||||
|
|
||||||
|
# Only write if value differs from desired
|
||||||
|
_defaults_set() {
|
||||||
|
local domain="$1" key="$2" type="$3" value="$4"
|
||||||
|
local current
|
||||||
|
current=$(defaults read "$domain" "$key" 2>/dev/null) || current=""
|
||||||
|
[[ "$current" == "$value" ]] && return 0
|
||||||
|
defaults write "$domain" "$key" "$type" "$value"
|
||||||
|
}
|
||||||
|
|
||||||
# Keyboard
|
# Keyboard
|
||||||
# --------
|
_defaults_set -globalDomain NSAutomaticCapitalizationEnabled -bool false
|
||||||
# off -- Keyboard: Capitalize words automatically
|
_defaults_set -globalDomain NSAutomaticPeriodSubstitutionEnabled -bool false
|
||||||
defaults write -globalDomain NSAutomaticCapitalizationEnabled -bool false
|
_defaults_set -globalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
|
||||||
|
_defaults_set NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
|
||||||
# off -- Keyboard: Add period with double-space
|
_defaults_set NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false
|
||||||
defaults write -globalDomain NSAutomaticPeriodSubstitutionEnabled -bool false
|
_defaults_set NSGlobalDomain WebAutomaticSpellingCorrectionEnabled -bool false
|
||||||
|
|
||||||
# off -- Keyboard: Quote substitution
|
|
||||||
defaults write -globalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
|
|
||||||
|
|
||||||
# off -- Keyboard: Dash substitution
|
|
||||||
defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
|
|
||||||
|
|
||||||
# off -- Keyboard: Auto-correct
|
|
||||||
defaults write NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false
|
|
||||||
defaults write NSGlobalDomain WebAutomaticSpellingCorrectionEnabled -bool false
|
|
||||||
|
|
||||||
# Appearance
|
# Appearance
|
||||||
# ----------
|
_defaults_set -globalDomain AppleAquaColorVariant -int 6
|
||||||
# Graphite -- Appearance (prevent top-left window colours)
|
_defaults_set -globalDomain AppleInterfaceStyle -string Dark
|
||||||
defaults write -globalDomain AppleAquaColorVariant -int 6
|
_defaults_set -globalDomain AppleHighlightColor -string "0.172549 0.705882 0.580392"
|
||||||
|
|
||||||
# on -- Appearance: Dark mode
|
|
||||||
defaults write -globalDomain AppleInterfaceStyle -string "Dark"
|
|
||||||
|
|
||||||
# #2CB494 -- Highlight color
|
|
||||||
defaults write -globalDomain AppleHighlightColor -string "0.172549 0.705882 0.580392"
|
|
||||||
|
|
||||||
# Control Center
|
# Control Center
|
||||||
# --------------
|
_defaults_set ~/Library/Preferences/ByHost/com.apple.controlcenter.plist Bluetooth -int 24
|
||||||
# off -- Control Center: Show Bluetooth icon in menu bar
|
_defaults_set ~/Library/Preferences/ByHost/com.apple.controlcenter.plist WiFi -int 24
|
||||||
defaults write \
|
_defaults_set ~/Library/Preferences/ByHost/com.apple.controlcenter.plist NowPlaying -int 24
|
||||||
~/Library/Preferences/ByHost/com.apple.controlcenter.plist \
|
_defaults_set ~/Library/Preferences/ByHost/com.apple.controlcenter.plist Battery -int 24
|
||||||
Bluetooth \
|
|
||||||
-int 24
|
|
||||||
|
|
||||||
# off -- Control Center: Show Wi-Fi icon in menu bar
|
|
||||||
defaults write \
|
|
||||||
~/Library/Preferences/ByHost/com.apple.controlcenter.plist \
|
|
||||||
WiFi \
|
|
||||||
-int 24
|
|
||||||
|
|
||||||
# off -- Control Center: Show Now Playing icon in menu bar
|
|
||||||
defaults write \
|
|
||||||
~/Library/Preferences/ByHost/com.apple.controlcenter.plist \
|
|
||||||
NowPlaying \
|
|
||||||
-int 24
|
|
||||||
|
|
||||||
# off -- Control Center: Show Battery icon in menu bar
|
|
||||||
defaults write \
|
|
||||||
~/Library/Preferences/ByHost/com.apple.controlcenter.plist \
|
|
||||||
Battery \
|
|
||||||
-int 24
|
|
||||||
|
|
||||||
# Finder
|
# Finder
|
||||||
# ------
|
_defaults_set com.apple.finder QuitMenuItem -bool true
|
||||||
# on -- Finder: Add quit option
|
_defaults_set com.apple.finder AppleShowAllFiles -bool true
|
||||||
defaults write com.apple.finder QuitMenuItem -bool true
|
_defaults_set NSGlobalDomain AppleShowAllExtensions -bool true
|
||||||
|
_defaults_set com.apple.finder FXEnableExtensionChangeWarning -bool false
|
||||||
# on -- Finder: Show hidden files
|
_defaults_set com.apple.finder ShowPathbar -bool true
|
||||||
defaults write com.apple.finder AppleShowAllFiles -bool true
|
_defaults_set com.apple.finder ShowStatusBar -bool true
|
||||||
|
_defaults_set com.apple.finder _FXSortFoldersFirst -bool true
|
||||||
# on -- Finder: Show all filename extensions
|
_defaults_set com.apple.CrashReporter DialogType -string none
|
||||||
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
|
_defaults_set com.apple.dashboard mcx-disabled -bool true
|
||||||
|
_defaults_set com.apple.finder ShowHardDrivesOnDesktop -bool true
|
||||||
# off -- Finder: Show warning before changing an extension
|
_defaults_set com.apple.finder ShowExternalHardDrivesOnDesktop -bool true
|
||||||
defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false
|
_defaults_set com.apple.finder ShowRemovableMediaOnDesktop -bool true
|
||||||
|
_defaults_set com.apple.finder ShowMountedServersOnDesktop -bool true
|
||||||
# on -- Finder: Show path bar
|
_defaults_set com.apple.finder ShowRecentTags -bool false
|
||||||
defaults write com.apple.finder ShowPathbar -bool true
|
_defaults_set com.apple.desktopservices DSDontWriteUSBStores -bool true
|
||||||
|
_defaults_set com.apple.desktopservices DSDontWriteNetworkStores -bool true
|
||||||
# on -- Finder: Show status bar
|
_defaults_set com.apple.finder NewWindowTargetPath -string "file://${HOME}/"
|
||||||
defaults write com.apple.finder ShowStatusBar -bool true
|
_defaults_set com.apple.finder FXPreferredViewStyle -string nlsv
|
||||||
|
|
||||||
# on -- Finder: Keep folders on top
|
|
||||||
defaults write com.apple.finder _FXSortFoldersFirst -bool true
|
|
||||||
|
|
||||||
# off -- Finder: Use macOS Crash Reporter
|
|
||||||
defaults write com.apple.CrashReporter DialogType -string "none"
|
|
||||||
|
|
||||||
# off -- Finder: Enable dashboard widgets
|
|
||||||
defaults write com.apple.dashboard mcx-disabled -bool true
|
|
||||||
|
|
||||||
# on -- Finder: Show hard drives on desktop
|
|
||||||
defaults write com.apple.finder ShowHardDrivesOnDesktop -bool true
|
|
||||||
|
|
||||||
# on -- Finder: Show external hard drives on desktop
|
|
||||||
defaults write com.apple.finder ShowExternalHardDrivesOnDesktop -bool true
|
|
||||||
|
|
||||||
# on -- Finder: Show removable media on desktop
|
|
||||||
defaults write com.apple.finder ShowRemovableMediaOnDesktop -bool true
|
|
||||||
|
|
||||||
# on -- Finder: Show mounted servers on desktop
|
|
||||||
defaults write com.apple.finder ShowMountedServersOnDesktop -bool true
|
|
||||||
|
|
||||||
# off -- Finder: Show recent tags
|
|
||||||
defaults write com.apple.finder ShowRecentTags -bool false
|
|
||||||
|
|
||||||
# off -- Finder: Create .DS_Store files
|
|
||||||
defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true
|
|
||||||
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
|
|
||||||
|
|
||||||
# home -- Finder: New Finder windows show
|
|
||||||
defaults write com.apple.finder NewWindowTargetPath -string "file://${HOME}/"
|
|
||||||
|
|
||||||
# list -- Finder: Preferred view style
|
|
||||||
defaults write com.apple.finder FXPreferredViewStyle -string "nlsv"
|
|
||||||
|
|
||||||
# Spotlight
|
# Spotlight
|
||||||
# ---------
|
_defaults_set com.apple.Spotlight MenuItemHidden -int 1
|
||||||
# on -- Spotlight: Hide menu bar icon
|
|
||||||
defaults write com.apple.Spotlight MenuItemHidden -int 1
|
|
||||||
|
|
||||||
# Dock
|
# Dock
|
||||||
# ----
|
_defaults_set com.apple.dock show-recents -bool false
|
||||||
# off -- Dock: Show recent applications
|
_defaults_set com.apple.dock scroll-to-open -bool true
|
||||||
defaults write com.apple.dock show-recents -bool false
|
|
||||||
|
|
||||||
# on -- Dock: Use scroll gestures
|
|
||||||
defaults write com.apple.dock scroll-to-open -bool true
|
|
||||||
|
|
||||||
# Remove default apps from the dock
|
# Remove default apps from the dock
|
||||||
|
dock_state=$(defaults read com.apple.dock persistent-apps 2>/dev/null || echo "")
|
||||||
default_apps=(
|
default_apps=(
|
||||||
"Messages"
|
"Messages"
|
||||||
"Mail"
|
"Mail"
|
||||||
@@ -149,7 +83,7 @@ default_apps=(
|
|||||||
"Pages"
|
"Pages"
|
||||||
)
|
)
|
||||||
for default_app in "${default_apps[@]}"; do
|
for default_app in "${default_apps[@]}"; do
|
||||||
dockutil --remove "$default_app" --no-restart 1>/dev/null 2>&1 || true
|
[[ $dock_state == *"$default_app"* ]] && dockutil --remove "$default_app" --no-restart 1>/dev/null 2>&1 || true
|
||||||
done
|
done
|
||||||
|
|
||||||
# Set up apps in the dock
|
# Set up apps in the dock
|
||||||
@@ -161,7 +95,6 @@ dock_order=(
|
|||||||
"/System/Applications/Utilities/Activity Monitor.app"
|
"/System/Applications/Utilities/Activity Monitor.app"
|
||||||
"/Applications/iTerm.app"
|
"/Applications/iTerm.app"
|
||||||
)
|
)
|
||||||
dock_state=$(defaults read com.apple.dock persistent-apps 2>/dev/null || echo "")
|
|
||||||
for i in "${!dock_order[@]}"; do
|
for i in "${!dock_order[@]}"; do
|
||||||
if [[ $i -ne 0 ]]; then
|
if [[ $i -ne 0 ]]; then
|
||||||
path="${dock_order[$i]}"
|
path="${dock_order[$i]}"
|
||||||
|
|||||||
@@ -31,9 +31,10 @@ log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
|||||||
log_error() { echo -e "${RED}[FAIL]${NC} $*"; }
|
log_error() { echo -e "${RED}[FAIL]${NC} $*"; }
|
||||||
log_debug() { echo -e "${TEAL}$*${NC}"; }
|
log_debug() { echo -e "${TEAL}$*${NC}"; }
|
||||||
log_quote() { sed "s/^/ ${GREY}│ /" | sed "s/$/${NC}/"; }
|
log_quote() { sed "s/^/ ${GREY}│ /" | sed "s/$/${NC}/"; }
|
||||||
|
log_indent() { sed "s/^/ │ /"; }
|
||||||
|
|
||||||
# Export log functions
|
# Export log functions
|
||||||
export -f log_info log_pass log_skip log_warn log_error log_debug log_quote
|
export -f log_info log_pass log_skip log_warn log_error log_debug log_quote log_indent
|
||||||
|
|
||||||
printf "\n\t${TEAL} <<< ${TEAL_BOLD}dots${TEAL} >>> ${NC}\n"
|
printf "\n\t${TEAL} <<< ${TEAL_BOLD}dots${TEAL} >>> ${NC}\n"
|
||||||
printf "\t${GREY}==============${NC}\n\n"
|
printf "\t${GREY}==============${NC}\n\n"
|
||||||
@@ -88,8 +89,6 @@ if [[ "$DOTS_PKG" == "brew" ]]; then
|
|||||||
export HOMEBREW_NO_ENV_HINTS=1
|
export HOMEBREW_NO_ENV_HINTS=1
|
||||||
export HOMEBREW_NO_AUTO_UPDATE=1
|
export HOMEBREW_NO_AUTO_UPDATE=1
|
||||||
export HOMEBREW_NO_INSTALL_CLEANUP=1
|
export HOMEBREW_NO_INSTALL_CLEANUP=1
|
||||||
export BREW_CASKS=$(brew list --cask 2>/dev/null || true)
|
|
||||||
export BREW_FORMULAE=$(brew list 2>/dev/null || true)
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Set up directory variables
|
# Set up directory variables
|
||||||
@@ -137,6 +136,23 @@ run() {
|
|||||||
fi
|
fi
|
||||||
} | log_quote
|
} | log_quote
|
||||||
|
|
||||||
|
# Cache brew package lists (avoid repeated slow brew queries in install scripts)
|
||||||
|
if [[ "$DOTS_PKG" == "brew" ]]; then
|
||||||
|
log_info "Caching brew package lists..."
|
||||||
|
local cask_versions_tmp=$(mktemp)
|
||||||
|
local formula_versions_tmp=$(mktemp)
|
||||||
|
brew list --cask --versions 2>/dev/null > "$cask_versions_tmp" &
|
||||||
|
local cask_pid=$!
|
||||||
|
brew list --versions 2>/dev/null > "$formula_versions_tmp" &
|
||||||
|
local formula_pid=$!
|
||||||
|
wait "$cask_pid" "$formula_pid" 2>/dev/null || true
|
||||||
|
export BREW_CASK_VERSIONS=$(cat "$cask_versions_tmp")
|
||||||
|
export BREW_FORMULA_VERSIONS=$(cat "$formula_versions_tmp")
|
||||||
|
export BREW_CASKS=$(awk '{print $1}' <<< "$BREW_CASK_VERSIONS")
|
||||||
|
export BREW_FORMULAE=$(awk '{print $1}' <<< "$BREW_FORMULA_VERSIONS")
|
||||||
|
rm -f "$cask_versions_tmp" "$formula_versions_tmp"
|
||||||
|
fi
|
||||||
|
|
||||||
scripts=("$install_dir"/*.sh)
|
scripts=("$install_dir"/*.sh)
|
||||||
for script in "${scripts[@]}"; do
|
for script in "${scripts[@]}"; do
|
||||||
if [[ -n "$targets" ]]; then
|
if [[ -n "$targets" ]]; then
|
||||||
@@ -148,8 +164,14 @@ run() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
local script_name=$(basename "$script")
|
local script_name=$(basename "$script")
|
||||||
|
local label=" ${script_name} "
|
||||||
|
local rule_width=40
|
||||||
|
local label_len=${#label}
|
||||||
|
local pad_len=$(( rule_width - label_len - 2 ))
|
||||||
|
(( pad_len < 2 )) && pad_len=2
|
||||||
|
local pad=$(printf '─%.0s' $(seq 1 "$pad_len"))
|
||||||
|
|
||||||
printf "\n\n${TEAL}<<< ${TEAL_BOLD}$script_name:${NC}\n"
|
printf "\n${GREY}──${label}${pad}${NC}\n"
|
||||||
local start_ns=$(now_ns)
|
local start_ns=$(now_ns)
|
||||||
source "$script"
|
source "$script"
|
||||||
local end_ns=$(now_ns)
|
local end_ns=$(now_ns)
|
||||||
@@ -163,11 +185,11 @@ run() {
|
|||||||
else
|
else
|
||||||
time_color="$RED"
|
time_color="$RED"
|
||||||
fi
|
fi
|
||||||
printf "${TEAL}>>> ${TEAL_BOLD}${script_name}, ${NC}"
|
printf "${GREY}── ${time_color}${execution_ms_formatted}ms${NC}\n"
|
||||||
printf "completed in ${time_color}${execution_ms_formatted}ms${NC}\n"
|
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
echo -e "\n${GREY}Logging to \"$log_abs_target\"${NC}"
|
log_info "Logging to \"$log_abs_target\""
|
||||||
|
|
||||||
total_start_ns=$(now_ns)
|
total_start_ns=$(now_ns)
|
||||||
run 2>&1 | tee "$log_abs_target"
|
run 2>&1 | tee "$log_abs_target"
|
||||||
total_end_ns=$(now_ns)
|
total_end_ns=$(now_ns)
|
||||||
|
|||||||
Reference in New Issue
Block a user