#!/bin/zsh when_binary_available() { if has_binary "$@"; then printf '1' return fi printf '0' return } has_binary() { command -v "$@" >/dev/null 2>&1 } ZSH_DEBUG="${ZSH_DEBUG:-0}" ZSH_ALIAS=${ZSH_ALIAS:-1} ZSH_COMPAT_BASH_COMPLETION=${ZSH_COMPAT_BASH_COMPLETION:-1} ZSH_CUSTOM=${ZSH_CUSTOM:-1} ZSH_DEFAULT_TERM=${ZSH_DEFAULT_TERM:-1} ZSH_GCLOUD_FIXES=${ZSH_GCLOUD_FIXES:=$(when_binary_available gcloud)} ZSH_GPG_PINENTRY_FIX=${ZSH_GPG_PINENTRY_FIX:-1} ZSH_GPG_SSH_AGENT=${ZSH_GPG_SSH_AGENT:-$(has_binary gpgconf && [ -z "${SSH_AUTH_SOCK:-}" ] && [ -f $(gpgconf --list-dirs agent-ssh-socket) ] && printf 1 || printf 0)} ZSH_KEYBOARD=${ZSH_KEYBOARD:-1} ZSH_LOGO_LS=${ZSH_LOGO_LS:-$(when_binary_available logo-ls)} ZSH_OPAM=${ZSH_OPAM:-$(when_binary_available opam)} ZSH_PIPX=${ZSH_PIPX:-$(when_binary_available pipx)} ZSH_POWERLINE="${ZSH_POWERLINE:-1}" ZSH_PRESERVE_HISTORY="${ZSH_PRESERVE_HISTORY:-1}" ZSH_PRESERVE_HISTORY_IMMEDIATELY="${ZSH_PRESERVE_HISTORY_IMMEDIATELY:-0}" ZSH_PRINT_REBOOT_REQUIRED=${ZSH_PRINT_REBOOT_REQUIRED:-0} # hacky, see below ZSH_ROOT_ALIAS="${ZSH_ROOT_ALIAS:-1}" ZSH_SYMFONY_CLI="${ZSH_SYMFONY_CLI:-$(when_binary_available symfony)}" ZSH_SYNTAX_HIGHLIGHTING="${ZSH_SYNTAX_HIGHLIGHTING:-1}" ZSH_THEFUCK=${ZSH_THEFUCK:-1} ZSH_DEBUG_SECTION_START_PREFIX="\\ " ZSH_DEBUG_INDENT="${ZSH_DEBUG_INDENT:- |}" ZSH_DEBUG_SECTION_END_TEXT="/" DEBUG_INDENT=0 section() { if [ $ZSH_DEBUG -gt 0 ]; then echo "${ZSH_DEBUG_SECTION_START_PREFIX}$(tput smso)$*$(tput rmso)" fi ((DEBUG_INDENT++)) } section_end() { if [ $ZSH_DEBUG -gt 0 ]; then echo "$ZSH_DEBUG_SECTION_END_TEXT" fi ((DEBUG_INDENT--)) } log() { if [ $ZSH_DEBUG -gt 0 ]; then indent="" if [ $DEBUG_INDENT -gt 0 ]; then for i in $(seq 0 $((DEBUG_INDENT - 1))); do indent+="$ZSH_DEBUG_INDENT" done fi echo "$*" | while IFS=$'\n' read line; do echo "$indent" "$line" done fi } # Compatibility mode for completions section "compat: bash completion" if [ $ZSH_COMPAT_BASH_COMPLETION -gt 0 ] || [ $ZSH_PIPX -gt 0 ]; then log "Enabling compatibility for bash completion scripts..." autoload -Uz bashcompinit compinit bashcompinit compinit zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*' fpath=(/usr/local/share/zsh-completions $fpath) fi section_end # Custom variables section "custom zshrc" if [ $ZSH_CUSTOM -gt 0 ]; then log "Checking if local profile code exists at ~/.local_zshrc..." if [ -f ~/.local_zshrc ]; then log "Exists, loading." # shellcheck source=/dev/null . ~/.local_zshrc else log "Does not exist, skipping." fi fi section_end # Bin directories section "python bin" if [ -d "$HOME/Library/Python/3.7" ]; then PATH="$HOME/Library/Python/3.7/bin:$PATH" export PATH fi if [ -d "$HOME/Library/Python/2.7" ]; then PATH="$HOME/Library/Python/2.7/bin:$PATH" export PATH fi section_end section "pipx bin" if [ $ZSH_PIPX -gt 0 ]; then autoload -U bashcompinit bashcompinit eval "$(register-python-argcomplete pipx)" fi section_end # Locale fix section "locale fix" if [ "$(uname -s)" = "Darwin" ]; then if [ -z "$LC_ALL" ]; then export LC_ALL=C fi if [ -z "$LANG" ]; then export LANG=C fi fi section_end # Powerline section "powerline" if [ $ZSH_POWERLINE -gt 0 ]; then log "Running powerline daemon..." log "$(powerline-daemon 2>&1)" log "Finding powerline..." POWERLINE_DIR="$(pipx runpip powerline-status show powerline-status --isolated | grep '^Location:' | awk '{print $2}')" log "Powerline repository root: $POWERLINE_DIR" log "Preparing zstyle..." autoload -Uz promptinit promptinit prompt off log "Loading powerline zsh plugin..." source "$POWERLINE_DIR/powerline/bindings/zsh/powerline.zsh" #prompt -s powerline fi section_end # zsh-syntax-highlighting section "zsh-syntax-highlighting" if [ $ZSH_SYNTAX_HIGHLIGHTING -gt 0 ]; then log "Detecting highlighters directory..." if [ -d "/usr/share/zsh-syntax-highlighting/highlighters" ]; then export ZSH_HIGHLIGHT_HIGHLIGHTERS_DIR="/usr/share/zsh-syntax-highlighting/highlighters" elif [ -d "/usr/local/share/zsh-syntax-highlighting/highlighters" ]; then export ZSH_HIGHLIGHT_HIGHLIGHTERS_DIR="/usr/local/share/zsh-syntax-highlighting/highlighters" fi log "Loading plugin..." if [ -f "/usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" ]; then source "/usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" elif [ -f "/usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" ]; then source "/usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" else source "/usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" fi fi section_end # opam section "opam" if [ $ZSH_OPAM -gt 0 ]; then [[ ! -r ~/.opam/opam-init/init.zsh ]] || source ~/.opam/opam-init/init.zsh >/dev/null 2>/dev/null fi section_end # gcloud fixes section "gcloud fixes" if [ $ZSH_GCLOUD_FIXES -gt 0 ]; then log "Overriding gcloud command" _local_zshrc_ssh_config_needs_cleanup() { [ ! -f ~/.ssh/config ] || grep -iq '^\s\+IdentityFile' ~/.ssh/config } _local_zshrc_clean_up_ssh_config() { if [ -f ~/.ssh/config ]; then # avoid apps such as gcloud referencing their own SSH key, we have our own hardware-backed one, damn it! sed -i -e 's/^\(\s\+\)IdentityFile/\1# Modified by ~\/.local_zshrc\n\1#IdentityFile/i' ~/.ssh/config fi } gcloud() { command gcloud "$@" if _local_zshrc_ssh_config_needs_cleanup; then _local_zshrc_clean_up_ssh_config fi } if has_binary gke-gcloud-auth-plugin; then # avoid deprecation warning about gcloud auth by simply using the new plugin log "Setting USE_GKE_GCLOUD_AUTH_PLUGIN=True to avoid deprecation warning" USE_GKE_GCLOUD_AUTH_PLUGIN=True fi fi section_end # symfony cli section "symfony cli" if [ $ZSH_SYMFONY_CLI -gt 0 ]; then if [ -n "$(command -v symfony)" ]; then complete -C "$(command -v symfony) self:autocomplete" symfony fi fi section_end section "thefuck" if [ $ZSH_THEFUCK -gt 0 ]; then eval "$(thefuck --alias)" fi section_end # Default terminal section "term" if [ $ZSH_DEFAULT_TERM -gt 0 ] && [ -z "$TERM" ]; then export TERM=linux fi section_end # gpg password via console section "gpg pinentry fix" if [ $ZSH_GPG_PINENTRY_FIX -gt 0 ]; then log "Changing GPG_TTY to: $(tty)" GPG_TTY=$(tty) export GPG_TTY if [ ! -z "$SSH_CONNECTION" ]; then log "Detected SSH connection, making pinentry use curses instead of x11." export PINENTRY_USER_DATA="USE_CURSES=1" else log "All good with pinentry itself it seems." fi fi section_end # gpg ssh agent section "gpg ssh agent" if [ $ZSH_GPG_SSH_AGENT -gt 0 ]; then export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)" log "Changed SSH_AUTH_SOCK to $SSH_AUTH_SOCK (GnuPG SSH agent)" gpgconf --launch gpg-agent fi section_end # logo-ls section "logo-ls" if [ $ZSH_LOGO_LS -gt 0 ]; then log "Aliasing ls to logo-ls" alias ls=logo-ls fi section_end # root alias (sudo -EHs) section "root alias" if [ $ZSH_ROOT_ALIAS -gt 0 ]; then log "Aliasing root to sudo -EHs" alias root="sudo -EHs" fi section_end # keyboard fixes section "keyboard fixes" if [ $ZSH_KEYBOARD -gt 0 ]; then default_keyboard_profile="xterm-256color-ssh" if [ -z "$SSH_CONNECTION" ]; then keyboard_profile="$TERM-${${DISPLAY:t}:-$VENDOR-$OSTYPE}" else keyboard_profile="$TERM-ssh" fi if [ -f ~/.zkbd/"$keyboard_profile" ] then log "Loading keyboard profile: $HOME/.zkbd/$keyboard_profile" . ~/.zkbd/"$keyboard_profile" else log "Loading default keyboard profile: $HOME/.zkbd/$default_keyboard_profile" . ~/.zkbd/"$default_keyboard_profile" fi # common assignments bindkey "${key[Delete]}" delete-char bindkey "${key[Home]}" beginning-of-line bindkey "${key[End]}" end-of-line fi section_end # Reboot required? (hacky code) section "reboot required?" if [ $ZSH_PRINT_REBOOT_REQUIRED -gt 0 ]; then if [ "$(pacman -Q linux | cut -d " " -f 2)" -gt "$(uname -r | sed 's,-zen,,' | sed 's,-lts,,')" ]; then echo "$(tput setaf 1)$(tput bold)Reboot required!" fi fi section_end # Preserving zsh history section "preserve zsh history" if [ $ZSH_PRESERVE_HISTORY -gt 0 ]; then : "${HISTFILE:=${HOME}/.zsh_history}" : "${HISTSIZE:=10000}" : "${SAVEHIST:=1000}" if [ $ZSH_PRESERVE_HISTORY_IMMEDIATELY -gt 0 ]; then # import new commands from the history file and also append typed commands to the history file immediately setopt SHARE_HISTORY else # the history entry is written out to the file after the command is finished, so that the time taken by the command is recorded correctly in the history file in EXTENDED_HISTORY format setopt INC_APPEND_HISTORY_TIME fi fi section_end # print env section "Environment variables" log "$(export)" section_end