diff options
Diffstat (limited to 'zsh/zshrc')
-rw-r--r-- | zsh/zshrc | 250 |
1 files changed, 227 insertions, 23 deletions
@@ -1,23 +1,18 @@ -# Use powerline -USE_POWERLINE="true" -# Has weird character width -# Example: -# is not a diamond -HAS_WIDECHARS="false" -# Source manjaro-zsh-configuration -if [[ -e /usr/share/zsh/manjaro-zsh-config ]]; then - source /usr/share/zsh/manjaro-zsh-config -fi -# Use manjaro zsh prompt -if [[ -e /usr/share/zsh/manjaro-zsh-prompt ]]; then - source /usr/share/zsh/manjaro-zsh-prompt -fi - source ~/.config/zsh/antigen.zsh if [[ ! -a ~/.zshrc.local ]]; then source ~/.zshrc.local fi +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 + + +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 + antigen bundle zsh-users/zsh-syntax-highlighting antigen bundle zsh-users/zsh-history-substring-search antigen bundle zsh-users/zsh-autosuggestions @@ -34,9 +29,15 @@ export GOPROXY=https://proxy.neonxp.ru export EDITOR="nvim" #export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock +export LS_OPTIONS='--color=auto' +eval "$(dircolors -b)" + # Aliases -alias ls="ls -F" -alias l="ls" +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" @@ -49,6 +50,8 @@ alias df="df -h" # human-readable sizes alias free="free -m" # show sizes in MB alias np="nano -w PKGBUILD" alias more=less +alias gitu='git add . && git commit && git push' +alias g=git [[ ! -f `which exa` ]] || alias ls="exa" && alias ll="exa -l" @@ -74,13 +77,14 @@ setopt autocd # if only direct 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:{a-zA-Z}={A-Za-z}" # 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:*' 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:*' 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" @@ -96,9 +100,19 @@ 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 @@ -154,3 +168,193 @@ bindkey "^[[Z" undo # Shift+tab undo # ctrl + space accept suggestion bindkey "^ " autosuggest-accept + +# 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 <number> 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* <string> + job_id=${(k)jobtexts[(r)*${(Q)jobspec}*]} ;; + *) # %string argument: + # use $jobtexts to match for a job whose command *starts with* <string> + 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] <string> [<string> ...] +# +# -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 ~/.config/zsh/p10k.zsh ]] || source ~/.config/zsh/p10k.zsh |