#!/usr/bin/env zsh #! ██████╗░░█████╗░  ███╗░░██╗░█████╗░████████╗  ███████╗██████╗░██╗████████╗ #! ██╔══██╗██╔══██╗  ████╗░██║██╔══██╗╚══██╔══╝  ██╔════╝██╔══██╗██║╚══██╔══╝ #! ██║░░██║██║░░██║  ██╔██╗██║██║░░██║░░░██║░░░  █████╗░░██║░░██║██║░░░██║░░░ #! ██║░░██║██║░░██║  ██║╚████║██║░░██║░░░██║░░░  ██╔══╝░░██║░░██║██║░░░██║░░░ #! ██████╔╝╚█████╔╝  ██║░╚███║╚█████╔╝░░░██║░░░  ███████╗██████╔╝██║░░░██║░░░ #! ╚═════╝░░╚════╝░  ╚═╝░░╚══╝░╚════╝░░░░╚═╝░░░  ╚══════╝╚═════╝░╚═╝░░░╚═╝░░░ # HyDE's ZSH env configuration # This file is sourced by ZSH on startup # And ensures that we have an obstruction-free .zshrc file # This also ensures that the proper HyDE $ENVs are loaded function _load_functions() { # Load all custom function files // Directories are ignored for file in "${ZDOTDIR:-$HOME/.config/zsh}/functions/"*.zsh; do [ -r "$file" ] && source "$file" done } function _load_completions() { for file in "${ZDOTDIR:-$HOME/.config/zsh}/completions/"*.zsh; do [ -r "$file" ] && source "$file" done } function _dedup_zsh_plugins { unset -f _dedup_zsh_plugins # Oh-my-zsh installation path zsh_paths=( "$HOME/.oh-my-zsh" "/usr/local/share/oh-my-zsh" "/usr/share/oh-my-zsh" ) for zsh_path in "${zsh_paths[@]}"; do [[ -d $zsh_path ]] && export ZSH=$zsh_path && break; done # Load Plugins hyde_plugins=(git zsh-256color zsh-autosuggestions zsh-syntax-highlighting) plugins+=("${plugins[@]}" "${hyde_plugins[@]}") # Deduplicate plugins plugins=("${plugins[@]}") plugins=($(printf "%s\n" "${plugins[@]}" | sort -u)) # Defer oh-my-zsh loading until after prompt appears typeset -g DEFER_OMZ_LOAD=1 } function _defer_omz_after_prompt_before_input() { [[ -r $ZSH/oh-my-zsh.sh ]] && source $ZSH/oh-my-zsh.sh #! Never load time consuming functions here # Add your completions directory to fpath fpath=($ZDOTDIR/completions "${fpath[@]}") _load_compinit _load_functions _load_completions # zsh-autosuggestions won't work on first prompt when deferred if typeset -f _zsh_autosuggest_start >/dev/null; then _zsh_autosuggest_start fi chmod +r $ZDOTDIR/.zshrc # Make sure .zshrc is readable [[ -r $ZDOTDIR/.zshrc ]] && source $ZDOTDIR/.zshrc } function _load_deferred_plugin_system_by_hyde() { # Exit early if HYDE_ZSH_DEFER is not set to 1 if [[ "${HYDE_ZSH_DEFER}" != "1" ]]; then unset -f _load_deferred_plugin_system_by_hyde return fi # Defer oh-my-zsh loading until after prompt appears # Load oh-my-zsh when line editor initializes // before user input if [[ -n $DEFER_OMZ_LOAD ]]; then unset DEFER_OMZ_LOAD [[ ${VSCODE_INJECTION} == 1 ]] || chmod -r $ZDOTDIR/.zshrc # let vscode read .zshrc zle -N zle-line-init _defer_omz_after_prompt_before_input # Loads when the line editor initializes // The best option fi # Below this line are the commands that are executed after the prompt appears # autoload -Uz add-zsh-hook # add-zsh-hook zshaddhistory load_omz_deferred # loads after the first command is added to history # add-zsh-hook precmd load_omz_deferred # Loads when shell is ready to accept commands # add-zsh-hook preexec load_omz_deferred # Loads before the first command executes # TODO: add handlers in pm.sh # for these aliases please manually add the following lines to your .zshrc file.(Using yay as the aur helper) # pc='yay -Sc' # remove all cached packages # po='yay -Qtdq | ${PM_COMMAND[@]} -Rns -' # remove orphaned packages # zsh-autosuggestions won't work on first prompt when deferred if typeset -f _zsh_autosuggest_start >/dev/null; then _zsh_autosuggest_start fi # Some binds won't work on first prompt when deferred bindkey '\e[H' beginning-of-line bindkey '\e[F' end-of-line } function do_render { # Check if the terminal supports images local type="${1:-image}" # TODO: update this list if needed TERMINAL_IMAGE_SUPPORT=(kitty konsole ghostty WezTerm) local terminal_no_art=(vscode code codium) TERMINAL_NO_ART="${TERMINAL_NO_ART:-${terminal_no_art[@]}}" CURRENT_TERMINAL="${TERM_PROGRAM:-$(ps -o comm= -p $(ps -o ppid= -p $$))}" case "${type}" in image) if [[ " ${TERMINAL_IMAGE_SUPPORT[@]} " =~ " ${CURRENT_TERMINAL} " ]]; then return 0 else return 1 fi ;; art) if [[ " ${TERMINAL_NO_ART[@]} " =~ " ${CURRENT_TERMINAL} " ]]; then return 1 else return 0 fi ;; *) return 1 ;; esac } function _load_compinit() { # Initialize completions with optimized performance autoload -Uz compinit # Enable extended glob for the qualifier to work setopt EXTENDED_GLOB # Fastest - use glob qualifiers on directory pattern if [[ -n ${ZDOTDIR}/.zcompdump(#qN.mh+${HYDE_ZSH_COMPINIT_CHECK:-1}) ]]; then compinit else compinit -C fi _comp_options+=(globdots) # tab complete hidden files } function _load_prompt() { # Try to load prompts immediately if ! source ${ZDOTDIR}/prompt.zsh >/dev/null 2>&1; then [[ -f $ZDOTDIR/conf.d/hyde/prompt.zsh ]] && source $ZDOTDIR/conf.d/hyde/prompt.zsh fi } # Override this environment variable in ~/.zshrc # cleaning up home folder # ZSH Plugin Configuration HYDE_ZSH_DEFER="1" #Unset this variable in $ZDOTDIR/user.zsh to disable HyDE's deferred Zsh loading. HYDE_ZSH_PROMPT="1" #Unset this variable in $ZDOTDIR/user.zsh to disable HyDE's prompt customization. HYDE_ZSH_NO_PLUGINS="0" #Set this variable to "1" in $ZDOTDIR/user.zsh to disable HyDE's Zsh plugin loading. ZSH_AUTOSUGGEST_STRATEGY=(history completion) # # History configuration HISTFILE=${HISTFILE:-$ZDOTDIR/.zsh_history} if [[ -f $HOME/.zsh_history ]] && [[ ! -f $HISTFILE ]]; then echo "Please manually move $HOME/.zsh_history to $HISTFILE" echo "Or move it somewhere else to avoid conflicts" fi HISTSIZE=10000 SAVEHIST=10000 export HISTFILE ZSH_AUTOSUGGEST_STRATEGY HISTSIZE SAVEHIST # HyDE Package Manager PM_COMMAND=(hyde-shell pm) # Optionally load user configuration // useful for customizing the shell without modifying the main file if [[ -f $HOME/.hyde.zshrc ]]; then source $HOME/.hyde.zshrc # for backward compatibility elif [[ -f $HOME/.user.zsh ]]; then source $HOME/.user.zsh # renamed to .user.zsh for intuitiveness that it is a user config elif [[ -f $ZDOTDIR/user.zsh ]]; then source $ZDOTDIR/user.zsh fi _load_compinit if [[ ${HYDE_ZSH_NO_PLUGINS} != "1" ]]; then _dedup_zsh_plugins if [[ "$HYDE_ZSH_OMZ_DEFER" == "1" ]] && [[ -r $ZSH/oh-my-zsh.sh ]]; then # Loads the buggy deferred oh-my-zsh plugin system by HyDE // This is only for oh-my-zsh and compatibility _load_deferred_plugin_system_by_hyde _load_prompt # This disables transient prompts sadly elif source $ZDOTDIR/plugin.zsh >/dev/null 2>&1; then # Load plugins from the user's plugin.zsh file # This is useful for users who want to use their own plugin system source $ZDOTDIR/plugin.zsh _load_prompt _load_functions _load_completions elif [[ -r $ZSH/oh-my-zsh.sh ]]; then # Load oh-my-zsh if it exists in the ZSH directory # Default if the $ZDOTDIR/plugin.zsh file does not exist or returns an error source $ZSH/oh-my-zsh.sh _load_prompt _load_functions _load_completions else echo "No plugin system found. Please install a plugin system or create a $ZDOTDIR/plugin.zsh file." echo "You can use $ZDOTDIR/plugin.zsh file to load your own plugins." fi else # Load user plugins if they exist # Assumes user has a plugin.zsh file in their $ZDOTDIR [[ -r $ZDOTDIR/plugin.zsh ]] && source $ZDOTDIR/plugin.zsh _load_prompt _load_functions _load_completions fi __package_manager () { ${PM_COMMAND[@]} "$@" } alias c='clear' \ in='__package_manager install' \ un='__package_manager remove' \ up='__package_manager upgrade' \ pl='__package_manager search installed' \ pa='__package_manager search all' \ vc='code' \ fastfetch='fastfetch --logo-type kitty' \ ..='cd ..' \ ...='cd ../..' \ .3='cd ../../..' \ .4='cd ../../../..' \ .5='cd ../../../../..' \ mkdir='mkdir -p'