source ~/.config/zsh/antigen.zsh if command -v git >/dev/null && [ ! -d ~/.config/zsh/powerlevel10k ]; then echo "info: installing p10k" git clone --depth 1 --single-branch https://github.com/romkatv/powerlevel10k.git ~/.config/zsh/powerlevel10k fi source ~/.config/zsh/powerlevel10k/powerlevel10k.zsh-theme if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" fi source ~/.config/zsh/powerlevel10k/powerlevel10k.zsh-theme source ~/.config/zsh/p10k.zsh antigen bundle zsh-users/zsh-syntax-highlighting antigen bundle zsh-users/zsh-history-substring-search antigen bundle zsh-users/zsh-autosuggestions antigen bundle zsh-users/zsh-completions antigen bundle ael-code/zsh-colored-man-pages antigen apply # Exports # export GOROOT=$HOME/work/go export GOPATH=$HOME/go export GOPROXY=https://proxy.neonxp.ru export EDITOR="nvim" #export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock export PATH=$PATH:$GOPATH/bin export GPG_TTY=$(tty) export LS_OPTIONS='--color=auto' eval "$(dircolors -b)" # Aliases alias ls='ls $LS_OPTIONS -F' alias l='ls $LS_OPTIONS -F' alias j="sudo journalctl" alias s='sudo' alias sctl="sudo systemctl" alias ll="ls -AFhl" alias cp="cp -i" # Confirm before overwriting something alias gitpush="git add . && git commit --amend --no-edit && git push -f" alias k="kubectl" alias yu="ssh-add -e /usr/lib/x86_64-linux-gnu/libykcs11.so; ssh-add -s /usr/lib/x86_64-linux-gnu/libykcs11.so" alias m="micro" alias n="nvim" alias cp="cp -i" # confirm before overwriting something alias df="df -h" # human-readable sizes alias free="free -m" # show sizes in MB alias np="nano -w PKGBUILD" alias gitu='git add . && git commit && git push' alias gita='git add . && git commit --amend --no-edit && git push -f' alias g=git [[ ! -f `which exa` ]] || alias ls="exa" && alias ll="exa -l" # Functions function tk() { mkdir -p $1; cd $1; } function alert() { notify-send --expire-time=30000 $1 $2 && nohup play ~/.local/share/alarm.wav & } ## Options section setopt correct # Auto correct mistakes setopt extendedglob # Extended globbing. Allows using regular expressions with * setopt nocaseglob # Case insensitive globbing setopt rcexpandparam # Array expension with parameters setopt nocheckjobs # Don"t warn about running processes when exiting setopt numericglobsort # Sort filenames numerically when it makes sense setopt nobeep # No beep setopt appendhistory # Immediately append history instead of overwriting setopt histignorealldups # If a new command is a duplicate, remove the older one setopt autocd # if only directory path is entered, cd there. setopt inc_append_history # save commands are added to the history immediately, otherwise only when shell exits. setopt histignorespace # Don"t save commands that start with space zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' # Case insensitive tab completion zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" # Colored completion (different colors for dirs/files/etc) zstyle ':completion:*' rehash true # automatically find new executables in path zstyle ':completion:*' menu select # Highlight menu selection # Speed up completions zstyle ':completion:*' accept-exact '*(N)' zstyle ':completion:*' use-cache on zstyle ':completion:*' cache-path ~/.zsh/cache zstyle ":completion:*:processes" command "ps -ax" zstyle ":completion:*:*:kill:*:processes" list-colors "=(#b) #([0-9]#)*=0=01;32" zstyle ":completion:*:*:kill:*" menu yes select zstyle ":completion:*:kill:*" force-list always zstyle ":completion:*:processes-names" command "ps -e -o comm=" zstyle ":completion:*:*:killall:*" menu yes select zstyle ":completion:*:killall:*" force-list always HISTFILE=~/.zsh_history HISTSIZE=100000 SAVEHIST=100000 WORDCHARS=${WORDCHARS//\/[&.;]} autoload -U compinit colors zcalc compinit -d autoload -U add-zsh-hook add-zsh-hook precmd mzc_termsupport_precmd add-zsh-hook preexec mzc_termsupport_preexec # Use a precmd hook instead of a chpwd hook to avoid contaminating output # i.e. when a script or function changes directory without `cd -q`, chpwd # will be called the output may be swallowed by the script or function. add-zsh-hook precmd mzc_termsupport_cwd source ~/.config/zsh/conf.d/*.zsh colors ## Plugins section: Enable fish style features # Use syntax highlighting #source ${HOME}/.zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh # Use history substring search #source ${HOME}/.zsh/plugins/zsh-history-substring-search/zsh-history-substring-search.zsh # bind UP and DOWN arrow keys to history substring search zmodload zsh/terminfo bindkey "$terminfo[kcuu1]" history-substring-search-up bindkey "$terminfo[kcud1]" history-substring-search-down bindkey "^[[A" history-substring-search-up bindkey "^[[B" history-substring-search-down bindkey -e bindkey "^[[7~" beginning-of-line # Home key bindkey "^[[H" beginning-of-line # Home key if [[ "${terminfo[khome]}" != "" ]]; then bindkey "${terminfo[khome]}" beginning-of-line # [Home] - Go to beginning of line fi bindkey "^[[8~" end-of-line # End key bindkey "^[[F" end-of-line # End key if [[ "${terminfo[kend]}" != "" ]]; then bindkey "${terminfo[kend]}" end-of-line # [End] - Go to end of line fi bindkey "^[[2~" overwrite-mode # Insert key bindkey "^[[3~" delete-char # Delete key bindkey "^[[C" forward-char # Right key bindkey "^[[D" backward-char # Left key bindkey "^[[5~" history-beginning-search-backward # Page up key bindkey "^[[6~" history-beginning-search-forward # Page down key # Navigate words with ctrl+arrow keys bindkey "^[Oc" forward-word # bindkey "^[Od" backward-word # bindkey "^[[1;5D" backward-word # bindkey "^[[1;5C" forward-word # bindkey "^H" backward-kill-word # delete previous word with ctrl+backspace bindkey "^[[Z" undo # Shift+tab undo last action # ctrl + space accept suggestion bindkey "^ " autosuggest-accept dotenv() { if [ $# -eq 0 ]; then [ -f .env.gpg ] && set -- .env.gpg "$@" [ -f .env ] && set -- .env "$@" fi set -a while [ $# -gt 0 ]; do echo "dotenv: Loading $1" case "$1" in *.gpg) eval "$(gpg --quiet --decrypt --yes "$1")" ;; */*) . "$1" ;; *) . "./$1" esac shift done set +a } # Set terminal window and tab/icon title # # usage: title short_tab_title [long_window_title] # # See: http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#ss3.1 # Fully supports screen and probably most modern xterm and rxvt # (In screen, only short_tab_title is used) function title { emulate -L zsh setopt prompt_subst [[ "$EMACS" == *term* ]] && return # if $2 is unset use $1 as default # if it is set and empty, leave it as is : ${2=$1} case "$TERM" in xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty|kitty|wezterm|st*) print -Pn "\e]2;${2:q}\a" # set window name print -Pn "\e]1;${1:q}\a" # set tab name ;; screen*|tmux*) print -Pn "\ek${1:q}\e\\" # set screen hardstatus ;; *) # Try to use terminfo to set the title # If the feature is available set title if [[ -n "$terminfo[fsl]" ]] && [[ -n "$terminfo[tsl]" ]]; then echoti tsl print -Pn "$1" echoti fsl fi ;; esac } ZSH_THEME_TERM_TAB_TITLE_IDLE="%15<..<%~%<<" #15 char left truncated PWD ZSH_THEME_TERM_TITLE_IDLE="%n@%m:%~" # Runs before showing the prompt function mzc_termsupport_precmd { [[ "${DISABLE_AUTO_TITLE:-}" == true ]] && return title $ZSH_THEME_TERM_TAB_TITLE_IDLE $ZSH_THEME_TERM_TITLE_IDLE } # Runs before executing the command function mzc_termsupport_preexec { [[ "${DISABLE_AUTO_TITLE:-}" == true ]] && return emulate -L zsh # split command into array of arguments local -a cmdargs cmdargs=("${(z)2}") # if running fg, extract the command from the job description if [[ "${cmdargs[1]}" = fg ]]; then # get the job id from the first argument passed to the fg command local job_id jobspec="${cmdargs[2]#%}" # logic based on jobs arguments: # http://zsh.sourceforge.net/Doc/Release/Jobs-_0026-Signals.html#Jobs # https://www.zsh.org/mla/users/2007/msg00704.html case "$jobspec" in <->) # %number argument: # use the same passed as an argument job_id=${jobspec} ;; ""|%|+) # empty, %% or %+ argument: # use the current job, which appears with a + in $jobstates: # suspended:+:5071=suspended (tty output) job_id=${(k)jobstates[(r)*:+:*]} ;; -) # %- argument: # use the previous job, which appears with a - in $jobstates: # suspended:-:6493=suspended (signal) job_id=${(k)jobstates[(r)*:-:*]} ;; [?]*) # %?string argument: # use $jobtexts to match for a job whose command *contains* job_id=${(k)jobtexts[(r)*${(Q)jobspec}*]} ;; *) # %string argument: # use $jobtexts to match for a job whose command *starts with* job_id=${(k)jobtexts[(r)${(Q)jobspec}*]} ;; esac # override preexec function arguments with job command if [[ -n "${jobtexts[$job_id]}" ]]; then 1="${jobtexts[$job_id]}" 2="${jobtexts[$job_id]}" fi fi # cmd name only, or if this is sudo or ssh, the next cmd local CMD=${1[(wr)^(*=*|sudo|ssh|mosh|rake|-*)]:gs/%/%%} local LINE="${2:gs/%/%%}" title '$CMD' '%100>...>$LINE%<<' } # URL-encode a string # # Encodes a string using RFC 2396 URL-encoding (%-escaped). # See: https://www.ietf.org/rfc/rfc2396.txt # # By default, reserved characters and unreserved "mark" characters are # not escaped by this function. This allows the common usage of passing # an entire URL in, and encoding just special characters in it, with # the expectation that reserved and mark characters are used appropriately. # The -r and -m options turn on escaping of the reserved and mark characters, # respectively, which allows arbitrary strings to be fully escaped for # embedding inside URLs, where reserved characters might be misinterpreted. # # Prints the encoded string on stdout. # Returns nonzero if encoding failed. # # Usage: # zsh_urlencode [-r] [-m] [-P] [ ...] # # -r causes reserved characters (;/?:@&=+$,) to be escaped # # -m causes "mark" characters (_.!~*''()-) to be escaped # # -P causes spaces to be encoded as '%20' instead of '+' function zsh_urlencode() { emulate -L zsh local -a opts zparseopts -D -E -a opts r m P local in_str="$@" local url_str="" local spaces_as_plus if [[ -z $opts[(r)-P] ]]; then spaces_as_plus=1; fi local str="$in_str" # URLs must use UTF-8 encoding; convert str to UTF-8 if required local encoding=$langinfo[CODESET] # Use LC_CTYPE=C to process text byte-by-byte local i byte ord LC_ALL=C export LC_ALL local reserved=';/?:@&=+$,' local mark='_.!~*''()-' local dont_escape="[A-Za-z0-9" if [[ -z $opts[(r)-r] ]]; then dont_escape+=$reserved fi # $mark must be last because of the "-" if [[ -z $opts[(r)-m] ]]; then dont_escape+=$mark fi dont_escape+="]" # Implemented to use a single printf call and avoid subshells in the loop, # for performance local url_str="" for (( i = 1; i <= ${#str}; ++i )); do byte="$str[i]" if [[ "$byte" =~ "$dont_escape" ]]; then url_str+="$byte" else if [[ "$byte" == " " && -n $spaces_as_plus ]]; then url_str+="+" else ord=$(( [##16] #byte )) url_str+="%$ord" fi fi done echo -E "$url_str" } # Emits the control sequence to notify many terminal emulators # of the cwd # # Identifies the directory using a file: URI scheme, including # the host name to disambiguate local vs. remote paths. function mzc_termsupport_cwd { # Percent-encode the host and path names. local URL_HOST URL_PATH URL_HOST="$(zsh_urlencode -P $HOST)" || return 1 URL_PATH="$(zsh_urlencode -P $PWD)" || return 1 # common control sequence (OSC 7) to set current host and path printf "\e]7;%s\a" "file://${URL_HOST}${URL_PATH}" } if [ -f env.sh ]; then source ./env.sh fi [[ ! -f ~/.zshrc.local ]] || source ~/.zshrc.local [[ ! -f ~/.config/zsh/p10k.zsh ]] || source ~/.config/zsh/p10k.zsh