# zmodload zsh/zprof # basic settings HISTSIZE=5000 SAVEHIST=5000 HISTFILE=~/.zsh_history setopt append_history setopt extended_history setopt share_history setopt histignorealldups setopt histignorespace setopt longlistjobs setopt notify setopt completeinword setopt interactivecomments setopt extended_glob # keybindings bindkey -v bindkey "^R" history-incremental-pattern-search-backward # editors alias vim=nvim export EDITOR=nvim # speed slower_functions=() load_slower() { for func in $slower_functions; do $func done } slowest_functions=() load_slowest() { for func in $slowest_functions; do $func done } sup() { echo "Good morning, Ambrose!" load_slowest } prompt_run_count=0 on_second_prompt() { if [[ "$prompt_run_count" == 1 ]] && [[ "$USER" != "root" ]]; then # zmodload zsh/zprof load_slower load_slowest # zprof fi (( prompt_run_count = prompt_run_count + 1 )) } precmd_functions+=( on_second_prompt ) # executables export PATH="$HOME/.local/bin:$HOME/.pwn/bin:$PATH" setup_pulumi() { export PATH="$HOME/.pulumi/bin:$PATH" } [[ -d "$HOME/.pulumi/bin" ]] && setup_pulumi setup_deno() { export PATH="$DENO_INSTALL/bin:$PATH" } export DENO_INSTALL="$HOME/.deno" [[ -d "$DENO_INSTALL" ]] && setup_deno setup_pyenv() { unfunction -m pyenv python python3 pip pip3 command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" eval "$(pip completion --zsh)" } pyenv_loaded=0 setup_pyenv_on_demand() { setup_pyenv_once() { if [[ ! -d "$PYENV_ROOT" ]] && ! which pip >/dev/null 2>/dev/null; then git clone https://github.com/pyenv/pyenv.git "$PYENV_ROOT" git clone https://github.com/pyenv/pyenv-virtualenv.git "$PYENV_ROOT/plugins/pyenv-virtualenv" fi if [[ "$pyenv_loaded" != 1 ]]; then echo "-- Loading pyenv --" setup_pyenv && pyenv_loaded=1 fi } setup_pyenv_when_python_version() { if [[ -f .python-version ]]; then setup_pyenv_once fi } precmd_functions+=( setup_pyenv_when_python_version ) pyenv() { setup_pyenv_once && pyenv "$@" } python() { setup_pyenv_once && python "$@" } python3() { setup_pyenv_once && python3 "$@" } pip() { setup_pyenv_once && pip "$@" } pip3() { setup_pyenv_once && pip3 "$@" } } export PYENV_ROOT="$HOME/.pyenv" setup_pyenv_on_demand setup_nvm() { unfunction -m nvm npm npx node source "$NVM_DIR/nvm.sh" } nvm_loaded=0 setup_nvm_on_demand() { setup_nvm_once() { if [[ "$nvm_loaded" != 1 ]]; then echo "-- Loading nvm --" setup_nvm && nvm_loaded=1 fi } nvm() { setup_nvm_once && nvm "$@" } npm() { setup_nvm_once && npm "$@" } npx() { setup_nvm_once && npx "$@" } node() { setup_nvm_once && node "$@" } } export NVM_DIR="$HOME/.nvm" [[ -d "$NVM_DIR" ]] && setup_nvm_on_demand [[ -f "$HOME/.nvm-setup-now" ]] && setup_nvm setup_bun() { [ -s "/var/home/ambrose/.bun/_bun" ] && source "/var/home/ambrose/.bun/_bun" export PATH="$BUN_INSTALL/bin:$PATH" } export BUN_INSTALL="$HOME/.bun" [[ -d "$BUN_INSTALL" ]] && setup_bun setup_ruby() { export PATH="$(ruby -e 'puts Gem.user_dir')/bin:$PATH" } which ruby >/dev/null 2>/dev/null && setup_ruby setup_go() { export PATH="$(go env GOPATH)/bin:$PATH" } which go >/dev/null 2>/dev/null && setup_go setup_g() { export PATH="$HOME/go/bin:$PATH" GOPATH="$HOME/go" GOROOT="$HOME/.go" # g-install: do NOT edit, see https://github.com/stefanmaric/g } [[ -f "$HOME/go/bin/g" ]] && setup_g setup_rancher_desktop() { export PATH="$HOME/.rd/bin:$PATH" } [[ -d "$HOME/.rd/bin" ]] && setup_rancher_desktop setup_android_sdk() { # See ~/.local/bin/install_android_sdk export ANDROID_SDK_ROOT="$HOME/.android/sdk" export PATH="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools:$PATH" if [[ -d "$HOME/.android/jdk" ]]; then export JAVA_HOME="$HOME/.android/jdk" export PATH="$JAVA_HOME/bin:$PATH" fi } [[ -d "$HOME/.android/sdk" ]] && setup_android_sdk setup_flutter() { # See ~/.local/bin/install_android_sdk export PATH="$HOME/flutter/bin:$HOME/.pub-cache/bin:$PATH" if ! which google-chrome >/dev/null 2>/dev/null; then if which flatpak >/dev/null 2>/dev/null; then flatpak_exports="$(flatpak --installations)/exports" export CHROME_EXECUTABLE="$flatpak_exports/bin/com.google.Chrome" fi fi } [[ -d "$HOME/flutter/bin" ]] && setup_flutter setup_cargo() { export PATH="$HOME/.cargo/bin:$PATH" } [[ -d "$HOME/.cargo" ]] && setup_cargo setup_rbenv() { unfunction -m rbenv ruby gem command -v rbenv >/dev/null || export PATH="$RBENV_ROOT/bin:$PATH" eval "$(rbenv init -)" } rbenv_loaded=0 setup_rbenv_on_demand() { setup_rbenv_once() { if [[ ! -d "$RBENV_ROOT" ]] && ! which ruby >/dev/null 2>/dev/null; then git clone https://github.com/rbenv/rbenv.git "$RBENV_ROOT" fi if [[ "$rbenv_loaded" != 1 ]]; then echo "-- Loading rbenv --" setup_rbenv && rbenv_loaded=1 fi } rbenv() { setup_rbenv_once && rbenv "$@" } ruby() { setup_rbenv_once && ruby "$@" } gem() { setup_rbenv_once && gem "$@" } } export RBENV_ROOT="$HOME/.rbenv" setup_rbenv_on_demand # platform specific case "$(uname -s)" in Darwin) PLATFORM=macos;; *) PLATFORM=linux;; esac if [[ $PLATFORM == macos ]]; then export PATH="$HOME/Library/Python/3.9/bin:$PATH" export PATH="$HOME/Library/Python/3.10/bin:$PATH" # LOL # On Linux, scripts are installed into $HOME/.local/bin fi setup_term_integration() {} if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then setup_term_integration() { if [[ -f "$HOME/.iterm2_shell_integration.zsh" ]]; then source "$HOME/.iterm2_shell_integration.zsh" fi } alias icat="imgcat" alias ssh="TERM=xterm-256color ssh" fi if [[ "$TERM" == "foot" ]] && which foot >/dev/null 2>/dev/null; then alias icat="img2sixel" alias ssh="TERM=xterm-256color ssh" fi if [[ "$TERM" == "xterm-kitty" ]] && which kitty >/dev/null 2>/dev/null; then alias icat="kitty +kitten icat" alias ssh="kitty +kitten ssh" fi setup_term_integration # term fixes if [[ "$TERM" == "xterm-kitty" ]] || [[ "$TERM" == "xterm-iterm" ]]; then #alias sudo="sudo TERM=xterm-256color" term_color() { export TERM=xterm-256color } fi # completion # Add default completions fpath+="$HOME/.config/zsh-completions" # Style completions zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} zstyle ':completion:*' auto-description 'specify: %d' zstyle ':completion:*' completer _expand _complete _correct _approximate zstyle ':completion:*' format '%F{blue}-- %d --%f' zstyle ':completion:*' group-name '' zstyle ':completion:*' menu select=2 zstyle ':completion:*' list-colors '' zstyle ':completion:*' list-prompt %SAt %p: Hit TAB for more, or the character to insert%s zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=* l:|=*' zstyle ':completion:*' menu select=long zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s zstyle ':completion:*' use-compctl false zstyle ':completion:*' verbose true zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31' zstyle ':completion:*:kill:*' command 'ps -u $USER -o pid,%cpu,tty,cputime,cmd' setup_completion() { # Load completions autoload -Uz compinit compinit autoload -Uz bashcompinit bashcompinit # Setup fast apps if which mc >/dev/null 2>/dev/null; then complete -o nospace -C mc mc fi if which earthly >/dev/null 2>/dev/null; then complete -o nospace -C earthly earthly fi } slower_functions+=( setup_completion ) setup_completion_more() { # Depends: #setup_completion setup_completion_kubectl() { if which kubectl >/dev/null 2>/dev/null; then source <(kubectl completion zsh) fi } setup_completion_kubectl setup_completion_pipenv() { if which pipenv >/dev/null 2>/dev/null; then eval "$(_PIPENV_COMPLETE=zsh_source pipenv)" fi } setup_completion_pipenv setup_completion_nvm() { if [[ -d "$NVM_DIR" ]]; then [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" fi } setup_completion_nvm setup_completion_docker() { if which docker >/dev/null 2>/dev/null; then eval "$(docker completion zsh)" fi } setup_completion_docker } slowest_functions+=( setup_completion_more ) # color pagination alias lesscolor="less --RAW-CONTROL-CHARS" # directory listings export LS_COLORS='no=00:fi=00:di=36:ow=34;40:ln=35:pi=30;44:so=35;44:do=35;44:bd=33;44:cd=37;44:or=05;37;41:mi=05;37;41:ex=01;31:*.cmd=01;31:*.exe=01;31:*.com=01;31:*.bat=01;31:*.reg=01;31:*.app=01;31:*.txt=32:*.org=32:*.md=32:*.mkd=32:*.h=32:*.hpp=32:*.c=32:*.C=32:*.cc=32:*.cpp=32:*.cxx=32:*.objc=32:*.cl=32:*.sh=32:*.bash=32:*.csh=32:*.zsh=32:*.el=32:*.vim=32:*.java=32:*.pl=32:*.pm=32:*.py=32:*.rb=32:*.hs=32:*.php=32:*.htm=32:*.html=32:*.shtml=32:*.erb=32:*.haml=32:*.xml=32:*.rdf=32:*.css=32:*.sass=32:*.scss=32:*.less=32:*.js=32:*.coffee=32:*.man=32:*.0=32:*.1=32:*.2=32:*.3=32:*.4=32:*.5=32:*.6=32:*.7=32:*.8=32:*.9=32:*.l=32:*.n=32:*.p=32:*.pod=32:*.tex=32:*.go=32:*.sql=32:*.csv=32:*.sv=32:*.svh=32:*.v=32:*.vh=32:*.vhd=32:*.bmp=33:*.cgm=33:*.dl=33:*.dvi=33:*.emf=33:*.eps=33:*.gif=33:*.jpeg=33:*.jpg=33:*.JPG=33:*.mng=33:*.pbm=33:*.pcx=33:*.pdf=33:*.pgm=33:*.png=33:*.PNG=33:*.ppm=33:*.pps=33:*.ppsx=33:*.ps=33:*.svg=33:*.svgz=33:*.tga=33:*.tif=33:*.tiff=33:*.xbm=33:*.xcf=33:*.xpm=33:*.xwd=33:*.xwd=33:*.yuv=33:*.nef=33:*.NEF=33:*.aac=33:*.au=33:*.flac=33:*.m4a=33:*.mid=33:*.midi=33:*.mka=33:*.mp3=33:*.mpa=33:*.mpeg=33:*.mpg=33:*.ogg=33:*.opus=33:*.ra=33:*.wav=33:*.anx=33:*.asf=33:*.avi=33:*.axv=33:*.flc=33:*.fli=33:*.flv=33:*.gl=33:*.m2v=33:*.m4v=33:*.mkv=33:*.mov=33:*.MOV=33:*.mp4=33:*.mp4v=33:*.mpeg=33:*.mpg=33:*.nuv=33:*.ogm=33:*.ogv=33:*.ogx=33:*.qt=33:*.rm=33:*.rmvb=33:*.swf=33:*.vob=33:*.webm=33:*.wmv=33:*.doc=31:*.docx=31:*.rtf=31:*.odt=31:*.dot=31:*.dotx=31:*.ott=31:*.xls=31:*.xlsx=31:*.ods=31:*.ots=31:*.ppt=31:*.pptx=31:*.odp=31:*.otp=31:*.fla=31:*.psd=31:*.7z=1;35:*.apk=1;35:*.arj=1;35:*.bin=1;35:*.bz=1;35:*.bz2=1;35:*.cab=1;35:*.deb=1;35:*.dmg=1;35:*.gem=1;35:*.gz=1;35:*.iso=1;35:*.jar=1;35:*.msi=1;35:*.rar=1;35:*.rpm=1;35:*.tar=1;35:*.tbz=1;35:*.tbz2=1;35:*.tgz=1;35:*.tx=1;35:*.war=1;35:*.xpi=1;35:*.xz=1;35:*.z=1;35:*.Z=1;35:*.zip=1;35:*.zst=1;35:*.ANSI-30-black=30:*.ANSI-01;30-brblack=01;30:*.ANSI-31-red=31:*.ANSI-01;31-brred=01;31:*.ANSI-32-green=32:*.ANSI-01;32-brgreen=01;32:*.ANSI-33-yellow=33:*.ANSI-01;33-bryellow=01;33:*.ANSI-34-blue=34:*.ANSI-01;34-brblue=01;34:*.ANSI-35-magenta=35:*.ANSI-01;35-brmagenta=01;35:*.ANSI-36-cyan=36:*.ANSI-01;36-brcyan=01;36:*.ANSI-37-white=37:*.ANSI-01;37-brwhite=01;37:*.log=01;32:*~=01;32:*#=01;32:*.bak=01;33:*.BAK=01;33:*.old=01;33:*.OLD=01;33:*.org_archive=01;33:*.off=01;33:*.OFF=01;33:*.dist=01;33:*.DIST=01;33:*.orig=01;33:*.ORIG=01;33:*.swp=01;33:*.swo=01;33:*.v=01;33:*.gpg=34:*.gpg=34:*.pgp=34:*.asc=34:*.3des=34:*.aes=34:*.enc=34:*.sqlite=34:' export CLICOLOR=1 export TIME_STYLE=iso if which exa >/dev/null 2>/dev/null; then alias ls=exa fi alias ll="ls -l" llp() { ll --color=always "$@" | lesscolor } # grep if which rg >/dev/null 2>/dev/null; then rgp() { rg --line-number --heading --color=always "$@" | lesscolor } else alias rg="grep --recursive --line-number" rgp() { rg --color=always "$@" | lesscolor } fi # theme [[ -f ~/.zshrc-theme ]] && eval "$(cat ~/.zshrc-theme)" # prompt setopt prompt_subst # prompt: vcs setup_prompt_vcs() { autoload -Uz vcs_info zstyle ':vcs_info:git:*' stagedstr $'%B' zstyle ':vcs_info:git:*' unstagedstr $'%B' #zstyle ':vcs_info:git:*' unstagedstr "$(tput smul)" zstyle ':vcs_info:git:*' formats $'%u%c%m %b %%b' zstyle ':vcs_info:git:*' actionformats $'%u%c%m %b (%a) %%b' zstyle ':vcs_info:*' enable git zstyle ':vcs_info:*' check-for-changes true precmd_vcs_info() { vcs_info } } format_vcs_info() { local text text="$1" echo -n "$text" } slower_functions+=( setup_prompt_vcs ) # prompt: return code format_return_code() { local return_code_ return_code_=$1 if [[ $1 -gt 128 ]]; then return_code_=SIG$(kill -l $1) fi case $1 in 127) return_code_="not found";; 126) return_code_="not exec";; 1) return_code_="err";; esac echo -n $return_code_ } format_return_code_prev() { local text text_length width start if [[ $1 == 0 ]]; then return fi text=" $(format_return_code $1) " text_length=${#text} width=$(tput cols) start=$(( $width - $text_length - 1 )) tput -S </dev/null 2>/dev/null; then eval $(thefuck --alias nope) fi } slowest_functions+=( setup_nope ) # helper scripts function theme { local iterm_profile term_theme term_variation gnome_theme macos_theme case "$2" in g) term_variation=greyscale- ;; *) term_variation= ;; esac case "$1" in light) iterm_profile=Light term_theme=${term_variation}light export LIGHT=true echo "export LIGHT=true" > ~/.zshrc-theme gnome_theme=Adwaita gnome_color_scheme=prefer-light macos_theme=false ;; dark) iterm_profile=Default term_theme=${term_variation}dark export LIGHT=false echo "export LIGHT=false" > ~/.zshrc-theme gnome_theme=Adwaita-dark gnome_color_scheme=prefer-dark macos_theme=true ;; esac if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then echo -e "\033]50;SetProfile=$ITERM_PROFILE\a" fi if [[ "$TERM" == "xterm-kitty" ]]; then kitty @ set-colors -c -a ~/.config/kitty/colorscheme.$term_theme.conf kitty @ env LIGHT=$LIGHT fi if [[ "$TERM" == "foot-extra" ]]; then fi if [[ -z "$SSH_CLIENT" ]]; then ln -sf foot.$term_theme.ini ~/.config/foot/foot.ini ln -sf colorscheme.$term_theme.conf ~/.config/kitty/colorscheme.conf fi setup_prompt if [[ -z "$SSH_CLIENT" ]]; then if [[ $PLATFORM == linux ]] && which gsettings >/dev/null 2>/dev/null; then gsettings set org.gnome.desktop.interface gtk-theme $gnome_theme gsettings set org.gnome.desktop.interface color-scheme $gnome_color_scheme fi if [[ $PLATFORM == macos ]]; then osascript -e "tell app \"System Events\" to tell appearance preferences to set dark mode to $macos_theme" fi fi } # gnupg if which gpgconf >/dev/null 2>/dev/null; then if [[ -z "$SSH_CLIENT" ]] || [[ -z "$SSH_AUTH_SOCK" ]]; then # use gpg agent for SSH if not connected over SSH export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)" fi if ! [[ -S "$SSH_AUTH_SOCK" ]]; then # start gpg agent for SSH access gpg-connect-agent /bye >/dev/null 2>&1 fi if [[ $PLATFORM == macos ]] && which pinentry-mac >/dev/null 2>/dev/null; then # if pinentry-mac exists, relink if not done # see https://github.com/Homebrew/linuxbrew-core/blob/fd3dadc66f11b7317035e76552992ef368adf7ea/Formula/gnupg.rb#L46 pinentry_configure="/usr/local/opt/pinentry/bin/pinentry" pinentry_mac="/usr/local/opt/pinentry-mac/bin/pinentry-mac" if [[ "$(readlink $pinentry_configure)" != "$pinentry_mac" ]]; then ln -fs $pinentry_mac $pinentry_configure echo "Notice: Linked pinentry to pinentry-mac. Undo with:" echo " brew unlink pinentry && brew link --overwrite pinentry" fi fi gpg_kill() { # just in case gpgconf --kill gpg-agent } gpg_tty() { # put gpg pinentry on this tty export GPG_TTY="$(tty)" echo UPDATESTARTUPTTY | gpg-connect-agent >/dev/null 2>&1 } fi # zprof