profile/home/dotfiles/zshrc

312 lines
7.9 KiB
Bash

#!/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_GPG_PINENTRY_FIX=${ZSH_GPG_PINENTRY_FIX:-1}
ZSH_LOGO_LS=${ZSH_LOGL_LS:-$(when_binary_available logo-ls)}
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:-1}"
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 -U bashcompinit
bashcompinit
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
# 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
# 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
# sugar to easily connect to remote docker hosts through SSH
section "ssh-based remote docker access"
ssh_docker() {
args=("$@")
control_path=$(sha1sum - <<< "${args[-1]}" | awk '{print $1}')
base_path=/var/tmp/ssh-docker/$(sha1sum - <<< "$1" | awk '{print $1}')
control_path="${base_path}.control"
sock_path="${base_path}.sock"
if [ -f "${sock_path}" ]
then
echo "Socket path ${sock_path} already exists." >&2
return 1
fi
if [ -f "${control_path}" ]
then
echo "Control path ${control_path} already exists." >&2
return 1
fi
mkdir -p /var/tmp/ssh-docker
ssh -o ControlMaster=auto -o ControlPersist=yes -o ControlPath="${control_path}" -nfNT -L "${sock_path}:/var/run/docker.sock" "$@"
echo "export DOCKER_TLS_VERIFY="
echo "export DOCKER_HOST=unix://${sock_path}"
echo "export DOCKER_CERT_PATH="
echo "export DOCKER_SSH_CONTROL_PATH=${control_path}"
echo "export DOCKER_SSH_SOCKET_PATH=${sock_path}"
}
ssh_docker_exit() {
args=("$@")
if [ "${#args}" -gt 0 ]
then
base_path=/var/tmp/ssh-docker/$(sha1sum - <<< "${args[-1]}" | awk '{print $1}')
control_path="${base_path}.control"
sock_path="${base_path}.sock"
else
control_path="${DOCKER_SSH_CONTROL_PATH}"
sock_path="${DOCKER_SSH_SOCKET_PATH}"
fi
if [ -z "${control_path}" ]
then
echo "No active Docker SSH forwarding found in environment." >&2
return 1
fi
ssh -o ControlPath="${control_path}" -O exit "$@" dummy
rm -f "${sock_path}" "${control_path}"
}
ssh_docker_cleanup() {
for socket in /var/tmp/ssh-docker/*.sock
do
if [ ! -e "$socket" ]
then
continue
fi
control="$(basename "$socket" .control).sock"
DOCKER_SSH_CONTROL_PATH="$control" \
DOCKER_SSH_SOCKET_PATH="$socket" \
ssh_docker_exit
done
}
export ssh_docker
export ssh_docker_exit
export ssh_docker_cleanup
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