mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2024-11-22 11:54:24 +08:00
d342b353e3
This fixes an edge case where the user actually sets zstyle ':completion:*' list-colors in their zshrc, but the previous code used a precmd hook, which would override the user changes. With this change our modifications will be set in the init script, after the theme loads, so that later changes can affect our defaults. Note that this will not be run for users on plugin managers, as these don't generally run our init script.
195 lines
6.2 KiB
Bash
195 lines
6.2 KiB
Bash
# Protect against non-zsh execution of Oh My Zsh (use POSIX syntax here)
|
|
[ -n "$ZSH_VERSION" ] || {
|
|
# ANSI formatting function (\033[<code>m)
|
|
# 0: reset, 1: bold, 4: underline, 22: no bold, 24: no underline, 31: red, 33: yellow
|
|
omz_f() {
|
|
[ $# -gt 0 ] || return
|
|
IFS=";" printf "\033[%sm" $*
|
|
}
|
|
# If stdout is not a terminal ignore all formatting
|
|
[ -t 1 ] || omz_f() { :; }
|
|
|
|
omz_ptree() {
|
|
# Get process tree of the current process
|
|
pid=$$; pids="$pid"
|
|
while [ ${pid-0} -ne 1 ] && ppid=$(ps -e -o pid,ppid | awk "\$1 == $pid { print \$2 }"); do
|
|
pids="$pids $pid"; pid=$ppid
|
|
done
|
|
|
|
# Show process tree
|
|
case "$(uname)" in
|
|
Linux) ps -o ppid,pid,command -f -p $pids 2>/dev/null ;;
|
|
Darwin|*) ps -o ppid,pid,command -p $pids 2>/dev/null ;;
|
|
esac
|
|
|
|
# If ps command failed, try Busybox ps
|
|
[ $? -eq 0 ] || ps -o ppid,pid,comm | awk "NR == 1 || index(\"$pids\", \$2) != 0"
|
|
}
|
|
|
|
{
|
|
shell=$(ps -o pid,comm | awk "\$1 == $$ { print \$2 }")
|
|
printf "$(omz_f 1 31)Error:$(omz_f 22) Oh My Zsh can't be loaded from: $(omz_f 1)${shell}$(omz_f 22). "
|
|
printf "You need to run $(omz_f 1)zsh$(omz_f 22) instead.$(omz_f 0)\n"
|
|
printf "$(omz_f 33)Here's the process tree:$(omz_f 22)\n\n"
|
|
omz_ptree
|
|
printf "$(omz_f 0)\n"
|
|
} >&2
|
|
|
|
return 1
|
|
}
|
|
|
|
# If ZSH is not defined, use the current script's directory.
|
|
[[ -z "$ZSH" ]] && export ZSH="${${(%):-%x}:a:h}"
|
|
|
|
# Set ZSH_CACHE_DIR to the path where cache files should be created
|
|
# or else we will use the default cache/
|
|
if [[ -z "$ZSH_CACHE_DIR" ]]; then
|
|
ZSH_CACHE_DIR="$ZSH/cache"
|
|
fi
|
|
|
|
# Make sure $ZSH_CACHE_DIR is writable, otherwise use a directory in $HOME
|
|
if [[ ! -w "$ZSH_CACHE_DIR" ]]; then
|
|
ZSH_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/oh-my-zsh"
|
|
fi
|
|
|
|
# Create cache and completions dir and add to $fpath
|
|
mkdir -p "$ZSH_CACHE_DIR/completions"
|
|
(( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
|
|
|
|
# Check for updates on initial load...
|
|
source "$ZSH/tools/check_for_upgrade.sh"
|
|
|
|
# Initializes Oh My Zsh
|
|
|
|
# add a function path
|
|
fpath=("$ZSH/functions" "$ZSH/completions" $fpath)
|
|
|
|
# Load all stock functions (from $fpath files) called below.
|
|
autoload -U compaudit compinit zrecompile
|
|
|
|
# Set ZSH_CUSTOM to the path where your custom config files
|
|
# and plugins exists, or else we will use the default custom/
|
|
if [[ -z "$ZSH_CUSTOM" ]]; then
|
|
ZSH_CUSTOM="$ZSH/custom"
|
|
fi
|
|
|
|
is_plugin() {
|
|
local base_dir=$1
|
|
local name=$2
|
|
builtin test -f $base_dir/plugins/$name/$name.plugin.zsh \
|
|
|| builtin test -f $base_dir/plugins/$name/_$name
|
|
}
|
|
|
|
# Add all defined plugins to fpath. This must be done
|
|
# before running compinit.
|
|
for plugin ($plugins); do
|
|
if is_plugin "$ZSH_CUSTOM" "$plugin"; then
|
|
fpath=("$ZSH_CUSTOM/plugins/$plugin" $fpath)
|
|
elif is_plugin "$ZSH" "$plugin"; then
|
|
fpath=("$ZSH/plugins/$plugin" $fpath)
|
|
else
|
|
echo "[oh-my-zsh] plugin '$plugin' not found"
|
|
fi
|
|
done
|
|
|
|
# Figure out the SHORT hostname
|
|
if [[ "$OSTYPE" = darwin* ]]; then
|
|
# macOS's $HOST changes with dhcp, etc. Use ComputerName if possible.
|
|
SHORT_HOST=$(scutil --get ComputerName 2>/dev/null) || SHORT_HOST="${HOST/.*/}"
|
|
else
|
|
SHORT_HOST="${HOST/.*/}"
|
|
fi
|
|
|
|
# Save the location of the current completion dump file.
|
|
if [[ -z "$ZSH_COMPDUMP" ]]; then
|
|
ZSH_COMPDUMP="${ZDOTDIR:-$HOME}/.zcompdump-${SHORT_HOST}-${ZSH_VERSION}"
|
|
fi
|
|
|
|
# Construct zcompdump OMZ metadata
|
|
zcompdump_revision="#omz revision: $(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null)"
|
|
zcompdump_fpath="#omz fpath: $fpath"
|
|
|
|
# Delete the zcompdump file if OMZ zcompdump metadata changed
|
|
if ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null \
|
|
|| ! command grep -q -Fx "$zcompdump_fpath" "$ZSH_COMPDUMP" 2>/dev/null; then
|
|
command rm -f "$ZSH_COMPDUMP"
|
|
zcompdump_refresh=1
|
|
fi
|
|
|
|
if [[ "$ZSH_DISABLE_COMPFIX" != true ]]; then
|
|
source "$ZSH/lib/compfix.zsh"
|
|
# Load only from secure directories
|
|
compinit -i -d "$ZSH_COMPDUMP"
|
|
# If completion insecurities exist, warn the user
|
|
handle_completion_insecurities &|
|
|
else
|
|
# If the user wants it, load from all found directories
|
|
compinit -u -d "$ZSH_COMPDUMP"
|
|
fi
|
|
|
|
# Append zcompdump metadata if missing
|
|
if (( $zcompdump_refresh )) \
|
|
|| ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null; then
|
|
# Use `tee` in case the $ZSH_COMPDUMP filename is invalid, to silence the error
|
|
# See https://github.com/ohmyzsh/ohmyzsh/commit/dd1a7269#commitcomment-39003489
|
|
tee -a "$ZSH_COMPDUMP" &>/dev/null <<EOF
|
|
|
|
$zcompdump_revision
|
|
$zcompdump_fpath
|
|
EOF
|
|
fi
|
|
unset zcompdump_revision zcompdump_fpath zcompdump_refresh
|
|
|
|
# zcompile the completion dump file if the .zwc is older or missing.
|
|
if command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then
|
|
zrecompile -q -p "$ZSH_COMPDUMP"
|
|
command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock"
|
|
fi
|
|
|
|
# Load all of the config files in ~/oh-my-zsh that end in .zsh
|
|
# TIP: Add files you don't want in git to .gitignore
|
|
for config_file ("$ZSH"/lib/*.zsh); do
|
|
custom_config_file="$ZSH_CUSTOM/lib/${config_file:t}"
|
|
[[ -f "$custom_config_file" ]] && config_file="$custom_config_file"
|
|
source "$config_file"
|
|
done
|
|
unset custom_config_file
|
|
|
|
# Load all of the plugins that were defined in ~/.zshrc
|
|
for plugin ($plugins); do
|
|
if [[ -f "$ZSH_CUSTOM/plugins/$plugin/$plugin.plugin.zsh" ]]; then
|
|
source "$ZSH_CUSTOM/plugins/$plugin/$plugin.plugin.zsh"
|
|
elif [[ -f "$ZSH/plugins/$plugin/$plugin.plugin.zsh" ]]; then
|
|
source "$ZSH/plugins/$plugin/$plugin.plugin.zsh"
|
|
fi
|
|
done
|
|
unset plugin
|
|
|
|
# Load all of your custom configurations from custom/
|
|
for config_file ("$ZSH_CUSTOM"/*.zsh(N)); do
|
|
source "$config_file"
|
|
done
|
|
unset config_file
|
|
|
|
# Load the theme
|
|
is_theme() {
|
|
local base_dir=$1
|
|
local name=$2
|
|
builtin test -f $base_dir/$name.zsh-theme
|
|
}
|
|
|
|
if [[ -n "$ZSH_THEME" ]]; then
|
|
if is_theme "$ZSH_CUSTOM" "$ZSH_THEME"; then
|
|
source "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme"
|
|
elif is_theme "$ZSH_CUSTOM/themes" "$ZSH_THEME"; then
|
|
source "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme"
|
|
elif is_theme "$ZSH/themes" "$ZSH_THEME"; then
|
|
source "$ZSH/themes/$ZSH_THEME.zsh-theme"
|
|
else
|
|
echo "[oh-my-zsh] theme '$ZSH_THEME' not found"
|
|
fi
|
|
fi
|
|
|
|
# set completion colors to be the same as `ls`, after theme has been loaded
|
|
[[ -z "$LS_COLORS" ]] || zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
|