From 35f17f7b608ed000c4785743694f26ce84e96fba Mon Sep 17 00:00:00 2001 From: Rushil Umaretiya Date: Tue, 28 May 2024 19:57:10 -0400 Subject: [PATCH] much less bloated zshrc + i3 changes --- i3/config | 17 +- polybar/config.ini | 2 +- zsh/.zsh/aliasrc | 97 -- zsh/.zsh/antigen.zsh | 2057 ------------------------ zsh/.zsh/pure/.editorconfig | 12 - zsh/.zsh/pure/.gitattributes | 1 - zsh/.zsh/pure/.npmrc | 1 - zsh/.zsh/pure/async.zsh | 661 -------- zsh/.zsh/pure/license | 9 - zsh/.zsh/pure/package.json | 43 - zsh/.zsh/pure/pure.zsh | 864 ---------- zsh/.zsh/pure/readme.md | 277 ---- zsh/.zsh/pure/screenshot-title-cmd.png | Bin 24844 -> 0 bytes zsh/.zsh/pure/screenshot.png | Bin 72121 -> 0 bytes zsh/.zshrc | 105 +- 15 files changed, 76 insertions(+), 4070 deletions(-) delete mode 100755 zsh/.zsh/aliasrc delete mode 100755 zsh/.zsh/antigen.zsh delete mode 100755 zsh/.zsh/pure/.editorconfig delete mode 100755 zsh/.zsh/pure/.gitattributes delete mode 100755 zsh/.zsh/pure/.npmrc delete mode 100755 zsh/.zsh/pure/async.zsh delete mode 100755 zsh/.zsh/pure/license delete mode 100755 zsh/.zsh/pure/package.json delete mode 100755 zsh/.zsh/pure/pure.zsh delete mode 100755 zsh/.zsh/pure/readme.md delete mode 100755 zsh/.zsh/pure/screenshot-title-cmd.png delete mode 100755 zsh/.zsh/pure/screenshot.png diff --git a/i3/config b/i3/config index b9139f8..7dc498e 100644 --- a/i3/config +++ b/i3/config @@ -372,7 +372,18 @@ for_window [class=Spotify] focus # For modifications, it can be copied to ~/.config/picom/picom.conf or ~/.config/picom.conf # install picom package (yay -S picom) # start using default config -exec_always --no-startup-id picom -b +exec_always --no-startup-id picom -b -f --inactive-opacity=0.75 + +set $i3l autosplit to workspace $ws1 +set $i3l autosplit to workspace $ws2 +set $i3l autosplit to workspace $ws3 +set $i3l autosplit to workspace $ws4 +set $i3l autosplit to workspace $ws5 +set $i3l autosplit to workspace $ws6 +set $i3l autosplit to workspace $ws7 +set $i3l autosplit to workspace $ws8 +set $i3l autosplit to workspace $ws9 + # # for custom config: #exec_always --no-startup-id picom --config ~/.config/picom.conf @@ -384,6 +395,8 @@ exec_always --no-startup-id picom -b #get auth work with polkit-gnome exec --no-startup-id /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 +exec_always --no-startup-id /home/rushil/.pyenv/shims/i3-layouts + # dex execute .desktop files + apps using /etc/xdg/autostart. # when second to i3 a DE is installed or mixed usage of i3 + xfce4 or GNOME # in this cases better disable dex and use manual starting apps using xdg/autostart @@ -410,7 +423,7 @@ exec --no-startup-id ~/.screenlayout/monitor.sh # set wallpaper #exec --no-startup-id sleep 2 && nitrogen --restore -exec_always --no-startup-id sleep 1 && ~/.config/i3/scripts/background-randomize ~/.config/i3/background/india 600 +exec --no-startup-id ~/.config/i3/scripts/background-randomize ~/.config/i3/background/india 600 # set powersavings for display: exec --no-startup-id xset s 480 dpms 600 600 600 diff --git a/polybar/config.ini b/polybar/config.ini index 3b23a93..fbbb14a 100644 --- a/polybar/config.ini +++ b/polybar/config.ini @@ -143,7 +143,7 @@ font-5 = "Noto Sans JP:size=12;4" ; modules-right = ipc clock modules-left = launcher i3 cpu memory filesystem weather -modules-center = now-playing sep date +modules-center = now-playing date modules-right = battery network sep volume backlight sep sysmenu ;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ diff --git a/zsh/.zsh/aliasrc b/zsh/.zsh/aliasrc deleted file mode 100755 index 4910c15..0000000 --- a/zsh/.zsh/aliasrc +++ /dev/null @@ -1,97 +0,0 @@ -# -# # ex - archive extractor -# # usage: ex -ex () -{ - if [ -f $1 ] ; then - case $1 in - *.tar.bz2) tar xjf $1 ;; - *.tar.gz) tar xzf $1 ;; - *.tar.xz) tar xJf $1 ;; - *.bz2) bunzip2 $1 ;; - *.rar) unrar x $1 ;; - *.gz) gunzip $1 ;; - *.tar) tar xf $1 ;; - *.tbz2) tar xjf $1 ;; - *.tgz) tar xzf $1 ;; - *.zip) unzip $1 ;; - *.Z) uncompress $1;; - *.7z) 7z x $1 ;; - *) echo "'$1' cannot be extracted via ex()" ;; - esac - else - echo "'$1' is not a valid file" - fi -} - -export EDITOR=vim - -alias pacman-update='sudo pacman-mirrors --geoip' - -alias ls='ls --color=auto' -alias ll='ls -l' -# ls, the common ones I use a lot shortened for rapid fire usage -alias l='ls -lFh' #size,show type,human readable -alias la='ls -lAFh' #long list,show almost all,show type,human readable -alias lr='ls -tRFh' #sorted by date,recursive,show type,human readable -alias lt='ls -ltFh' #long list,sorted by date,show type,human readable -alias ll='ls -l' #long list -alias ldot='ls -ld .*' -alias lS='ls -1FSsh' -alias lart='ls -1Fcart' -alias lrt='ls -1Fcrt' - -alias zshrc='${=EDITOR} ~/.zshrc' # Quick access to the ~/.zshrc file - -alias grep='grep --color' -alias sgrep='grep -R -n -H -C 5 --exclude-dir={.git,.svn,CVS} ' - -alias t='tail -f' - -# Command line head / tail shortcuts -alias -g H='| head' -alias -g T='| tail' -alias -g G='| grep' -alias -g L="| less" -alias -g M="| most" -alias -g LL="2>&1 | less" -alias -g CA="2>&1 | cat -A" -alias -g NE="2> /dev/null" -alias -g NUL="> /dev/null 2>&1" -alias -g P="2>&1| pygmentize -l pytb" - -alias dud='du -d 1 -h' -alias duf='du -sh *' -alias fd='find . -type d -name' -alias ff='find . -type f -name' - -alias h='history' -alias hgrep="fc -El 0 | grep" -alias help='man' -alias p='ps -f' -alias sortnr='sort -n -r' -alias unexport='unset' - -alias rm='rm -i' -alias cp='cp -i' -alias mv='mv -i' -alias vim='vim' -alias vi='vim' -gitpush() { - git add . - git commit -m "$*" - git pull - git push -} -gitupdate() { - eval "$(ssh-agent -s)" - ssh-add ~/.ssh/github - ssh -T git@github.com -} -alias gp=gitpush -alias gu=gitupdate - -alias rs="tmux new -s django-runserver -d './manage.py runserver'" -alias runserver="rs" -alias md="mdv README.md" -alias readme="md" diff --git a/zsh/.zsh/antigen.zsh b/zsh/.zsh/antigen.zsh deleted file mode 100755 index e813207..0000000 --- a/zsh/.zsh/antigen.zsh +++ /dev/null @@ -1,2057 +0,0 @@ -###################################################################### -# This file was autogenerated by `make`. Do not edit it directly! -###################################################################### -# Antigen: A simple plugin manager for zsh - # Authors: Shrikant Sharat Kandula - # and Contributors - # Homepage: http://antigen.sharats.me - # License: MIT License -zmodload zsh/parameter -autoload -U is-at-least - -# While boot.zsh is part of the ext/cache functionallity it may be disabled -# with ANTIGEN_CACHE flag, and it's always compiled with antigen.zsh -if [[ $ANTIGEN_CACHE != false ]]; then - ANTIGEN_CACHE="${ANTIGEN_CACHE:-${ADOTDIR:-$HOME/.antigen}/init.zsh}" - ANTIGEN_RSRC="${ANTIGEN_RSRC:-${ADOTDIR:-$HOME/.antigen}/.resources}" - - # It may not be necessary to check ANTIGEN_AUTO_CONFIG. - if [[ $ANTIGEN_AUTO_CONFIG != false && -f $ANTIGEN_RSRC ]]; then - # Check the list of files for configuration changes (uses -nt comp) - ANTIGEN_CHECK_FILES=$(cat $ANTIGEN_RSRC 2> /dev/null) - ANTIGEN_CHECK_FILES=(${(@f)ANTIGEN_CHECK_FILES}) - - for config in $ANTIGEN_CHECK_FILES; do - if [[ "$config" -nt "$config.zwc" ]]; then - # Flag configuration file as newer - { zcompile "$config" } &! - # Kill cache file in order to force full loading (see a few lines below) - [[ -f "$ANTIGEN_CACHE" ]] && rm -f "$ANTIGEN_CACHE" - fi - done - fi - - # If there is a cache file do load from it - if [[ -f $ANTIGEN_CACHE && ! $_ANTIGEN_CACHE_LOADED == true ]]; then - # Wrap antigen in order to defer cache source until `antigen-apply` - antigen() { - if [[ $1 == "apply" ]]; then - source "$ANTIGEN_CACHE" - # Handle `antigen-init` command properly - elif [[ $1 == "init" ]]; then - source "$2" - fi - } - # Do not continue loading antigen as cache bundle takes care of it. - return 0 - fi -fi -[[ -z "$_ANTIGEN_INSTALL_DIR" ]] && _ANTIGEN_INSTALL_DIR=${0:A:h} - -# Each line in this string has the following entries separated by a space -# character. -# , , , -[[ $_ANTIGEN_CACHE_LOADED != true ]] && typeset -aU _ANTIGEN_BUNDLE_RECORD - -# Do not load anything if git is not available. -if (( ! $+commands[git] )); then - echo 'Antigen: Please install git to use Antigen.' >&2 - return 1 -fi - -# Used to defer compinit/compdef -typeset -a __deferred_compdefs -compdef () { __deferred_compdefs=($__deferred_compdefs "$*") } - -# A syntax sugar to avoid the `-` when calling antigen commands. With this -# function, you can write `antigen-bundle` as `antigen bundle` and so on. -antigen () { - local cmd="$1" - if [[ -z "$cmd" ]]; then - echo 'Antigen: Please give a command to run.' >&2 - return 1 - fi - shift - - if (( $+functions[antigen-$cmd] )); then - "antigen-$cmd" "$@" - return $? - else - echo "Antigen: Unknown command: $cmd" >&2 - return 1 - fi -} -# Returns the bundle's git revision -# -# Usage -# -antigen-bundle-rev bundle-name [is_local_clone] -# -# Returns -# Bundle rev-parse output (branch name or short ref name) --antigen-bundle-rev () { - local bundle=$1 - local is_local_clone=$2 - - local bundle_path=$bundle - # Get bunde path inside $ADOTDIR if bundle was effectively cloned - if [[ "$is_local_clone" == "true" ]]; then - bundle_path=$(-antigen-get-clone-dir $bundle) - fi - - local ref - ref=$(git --git-dir="$bundle_path/.git" rev-parse --abbrev-ref '@' 2>/dev/null) - - # Avoid 'HEAD' when in detached mode - if [[ $ref == "HEAD" ]]; then - ref=$(git --git-dir="$bundle_path/.git" describe --tags --exact-match 2>/dev/null \ - || git --git-dir="$bundle_path/.git" rev-parse --short '@' 2>/dev/null || "-") - fi - echo $ref -} -# Usage: -# -antigen-bundle-short-name "https://github.com/user/repo.git[|*]" "[branch/name]" -# Returns: -# user/repo@branch/name --antigen-bundle-short-name () { - local bundle_name="${1%|*}" - local bundle_branch="$2" - local match mbegin mend MATCH MBEGIN MEND - - [[ "$bundle_name" =~ '.*/(.*/.*).*$' ]] && bundle_name=$match[1] - bundle_name="${bundle_name%.git*}" - - if [[ -n $bundle_branch ]]; then - bundle_name="$bundle_name@$bundle_branch" - fi - - echo $bundle_name -} -# Echo the bundle specs as in the record. The first line is not echoed since it -# is a blank line. --antigen-echo-record () { - echo ${(j:\n:)_ANTIGEN_BUNDLE_RECORD} -} -# Filters _ANTIGEN_BUNDLE_RECORD for $1 -# -# Usage -# -antigen-find-bundle example/bundle -# -# Returns -# String if bundle is found --antigen-find-bundle () { - echo $(-antigen-find-record $1 | cut -d' ' -f1) -} - -# Filters _ANTIGEN_BUNDLE_RECORD for $1 -# -# Usage -# -antigen-find-record example/bundle -# -# Returns -# String if record is found --antigen-find-record () { - local bundle=$1 - - if [[ $# -eq 0 ]]; then - return 1 - fi - - local record=${bundle/\|/\\\|} - echo "${_ANTIGEN_BUNDLE_RECORD[(r)*$record*]}" -} -# Returns bundle names from _ANTIGEN_BUNDLE_RECORD -# -# Usage -# -antigen-get-bundles [--short|--simple|--long] -# -# Returns -# List of bundles installed --antigen-get-bundles () { - local mode revision url bundle_name bundle_entry loc no_local_clone - local record bundle make_local_clone - mode=${1:-"--short"} - - for record in $_ANTIGEN_BUNDLE_RECORD; do - bundle=(${(@s/ /)record}) - url=$bundle[1] - loc=$bundle[2] - make_local_clone=$bundle[4] - - bundle_name=$(-antigen-bundle-short-name $url) - - case "$mode" in - --short) - # Only check revision for bundle with a requested branch - if [[ $url == *\|* ]]; then - revision=$(-antigen-bundle-rev $url $make_local_clone) - else - revision="master" - fi - - if [[ $loc != '/' ]]; then - bundle_name="$bundle_name ~ $loc" - fi - echo "$bundle_name @ $revision" - ;; - --simple) - echo "$bundle_name" - ;; - --long) - echo "$record" - ;; - esac - done -} -# Usage: -# -antigen-get-clone-dir "https://github.com/zsh-users/zsh-syntax-highlighting.git[|feature/branch]" -# Returns: -# $ANTIGEN_BUNDLES/zsh-users/zsh-syntax-highlighting[-feature-branch] --antigen-get-clone-dir () { - local bundle="$1" - local url="${bundle%|*}" - local branch match mbegin mend MATCH MBEGIN MEND - [[ "$bundle" =~ "\|" ]] && branch="${bundle#*|}" - - # Takes a repo url and mangles it, giving the path that this url will be - # cloned to. Doesn't actually clone anything. - local clone_dir="$ANTIGEN_BUNDLES" - - url=$(-antigen-bundle-short-name $url) - - # Suffix with branch/tag name - [[ -n "$branch" ]] && url="$url-${branch//\//-}" - url=${url//\*/x} - - echo "$clone_dir/$url" -} -# Returns bundles flagged as make_local_clone -# -# Usage -# -antigen-cloned-bundles -# -# Returns -# Bundle metadata --antigen-get-cloned-bundles() { - -antigen-echo-record | - awk '$4 == "true" {print $1}' | - sort -u -} -# Returns a list of themes from a default library (omz) -# -# Usage -# -antigen-get-themes -# -# Returns -# List of themes by name --antigen-get-themes () { - local library='robbyrussell/oh-my-zsh' - local bundle=$(-antigen-find-bundle $library) - - if [[ -n "$bundle" ]]; then - local dir=$(-antigen-get-clone-dir $ANTIGEN_DEFAULT_REPO_URL) - echo $(ls $dir/themes/ | grep '.zsh-theme$' | sed 's/.zsh-theme//') - fi - - return 0 -} - -# This function check ZSH_EVAL_CONTEXT to determine if running in interactive shell. -# -# Usage -# -antigen-interactive-mode -# -# Returns -# Either true or false depending if we are running in interactive mode --antigen-interactive-mode () { - WARN "-antigen-interactive-mode: $ZSH_EVAL_CONTEXT \$_ANTIGEN_INTERACTIVE = $_ANTIGEN_INTERACTIVE" - if [[ $_ANTIGEN_INTERACTIVE != "" ]]; then - [[ $_ANTIGEN_INTERACTIVE == true ]]; - return - fi - - [[ "$ZSH_EVAL_CONTEXT" == toplevel* || "$ZSH_EVAL_CONTEXT" == cmdarg* ]]; -} -# Parses and retrieves a remote branch given a branch name. -# -# If the branch name contains '*' it will retrieve remote branches -# and try to match against tags and heads, returning the latest matching. -# -# Usage -# -antigen-parse-branch https://github.com/user/repo.git x.y.z -# -# Returns -# Branch name --antigen-parse-branch () { - local url="$1" branch="$2" branches - - local match mbegin mend MATCH MBEGIN MEND - - if [[ "$branch" =~ '\*' ]]; then - branches=$(git ls-remote --tags -q "$url" "$branch"|cut -d'/' -f3|sort -n|tail -1) - # There is no --refs flag in git 1.8 and below, this way we - # emulate this flag -- also git 1.8 ref order is undefined. - branch=${${branches#*/*/}%^*} # Why you are like this? - fi - - echo $branch -} --antigen-update-repos () { - local repo bundle url target - local log=/tmp/antigen-v2-migrate.log - - echo "It seems you have bundles cloned with Antigen v1.x." - echo "We'll try to convert directory structure to v2." - echo - - echo -n "Moving bundles to '\$ADOTDIR/bundles'... " - - # Migrate old repos -> bundles - local errors=0 - for repo in $ADOTDIR/repos/*; do - bundle=${repo/$ADOTDIR\/repos\//} - bundle=${bundle//-SLASH-/\/} - bundle=${bundle//-COLON-/\:} - bundle=${bundle//-STAR-/\*} - url=${bundle//-PIPE-/\|} - target=$(-antigen-get-clone-dir $url) - mkdir -p "${target:A:h}" - echo " ---> ${repo/$ADOTDIR\/} -> ${target/$ADOTDIR\/}" | tee > $log - mv "$repo" "$target" &> $log - if [[ $? != 0 ]]; then - echo "Failed to migrate '$repo'!." - errors+=1 - fi - done - - if [[ $errors == 0 ]]; then - echo "Done." - else - echo "An error ocurred!" - fi - echo - - if [[ "$(ls -A $ADOTDIR/repos | wc -l | xargs)" == 0 ]]; then - echo "You can safely remove \$ADOTDIR/repos." - else - echo "Some bundles couldn't be migrated. See \$ADOTDIR/repos." - fi - - echo - if [[ $errors == 0 ]]; then - echo "Bundles migrated successfuly." - rm $log - else - echo "Some errors occured. Review migration log in '$log'." - fi - antigen-reset -} -# Ensure that a clone exists for the given repo url and branch. If the first -# argument is `update` and if a clone already exists for the given repo -# and branch, it is pull-ed, i.e., updated. -# -# This function expects three arguments in order: -# - 'url=' -# - 'update=true|false' -# - 'verbose=true|false' -# -# Returns true|false Whether cloning/pulling was succesful --antigen-ensure-repo () { - # Argument defaults. Previously using ${1:?"missing url argument"} format - # but it seems to mess up with cram - if (( $# < 1 )); then - echo "Antigen: Missing url argument." - return 1 - fi - - # The url. No sane default for this, so just empty. - local url=$1 - # Check if we have to update. - local update=${2:-false} - # Verbose output. - local verbose=${3:-false} - - shift $# - - # Get the clone's directory as per the given repo url and branch. - local clone_dir=$(-antigen-get-clone-dir $url) - if [[ -d "$clone_dir" && $update == false ]]; then - return true - fi - - # A temporary function wrapping the `git` command with repeated arguments. - --plugin-git () { - (\cd -q "$clone_dir" && eval ${ANTIGEN_CLONE_ENV} git --git-dir="$clone_dir/.git" --no-pager "$@" &>>! $ANTIGEN_LOG) - } - - local success=false - - # If its a specific branch that we want, checkout that branch. - local branch="master" # TODO FIX THIS - if [[ $url == *\|* ]]; then - branch="$(-antigen-parse-branch ${url%|*} ${url#*|})" - fi - - if [[ ! -d $clone_dir ]]; then - eval ${ANTIGEN_CLONE_ENV} git clone ${=ANTIGEN_CLONE_OPTS} --branch "$branch" -- "${url%|*}" "$clone_dir" &>> $ANTIGEN_LOG - success=$? - elif $update; then - # Save current revision. - local old_rev="$(--plugin-git rev-parse HEAD)" - # Pull changes if update requested. - --plugin-git checkout "$branch" - --plugin-git pull origin "$branch" - success=$? - - # Update submodules. - --plugin-git submodule update ${=ANTIGEN_SUBMODULE_OPTS} - # Get the new revision. - local new_rev="$(--plugin-git rev-parse HEAD)" - fi - - if [[ -n $old_rev && $old_rev != $new_rev ]]; then - echo Updated from $old_rev[0,7] to $new_rev[0,7]. - if $verbose; then - --plugin-git log --oneline --reverse --no-merges --stat '@{1}..' - fi - fi - - # Remove the temporary git wrapper function. - unfunction -- --plugin-git - - return $success -} -# Helper function: Same as `$1=$2`, but will only happen if the name -# specified by `$1` is not already set. --antigen-set-default () { - local arg_name="$1" - local arg_value="$2" - eval "test -z \"\$$arg_name\" && typeset -g $arg_name='$arg_value'" -} - --antigen-env-setup () { - typeset -gU fpath path - - # Pre-startup initializations. - -antigen-set-default ANTIGEN_OMZ_REPO_URL \ - https://github.com/robbyrussell/oh-my-zsh.git - -antigen-set-default ANTIGEN_PREZTO_REPO_URL \ - https://github.com/sorin-ionescu/prezto.git - -antigen-set-default ANTIGEN_DEFAULT_REPO_URL $ANTIGEN_OMZ_REPO_URL - - # Default Antigen directory. - -antigen-set-default ADOTDIR $HOME/.antigen - [[ ! -d $ADOTDIR ]] && mkdir -p $ADOTDIR - - # Defaults bundles directory. - -antigen-set-default ANTIGEN_BUNDLES $ADOTDIR/bundles - - # If there is no bundles directory, create it. - if [[ ! -d $ANTIGEN_BUNDLES ]]; then - mkdir -p $ANTIGEN_BUNDLES - # Check for v1 repos directory, transform it to v2 format. - [[ -d $ADOTDIR/repos ]] && -antigen-update-repos - fi - - -antigen-set-default ANTIGEN_COMPDUMP "${ADOTDIR:-$HOME}/.zcompdump" - -antigen-set-default ANTIGEN_LOG /dev/null - - # CLONE_OPTS uses ${=CLONE_OPTS} expansion so don't use spaces - # for arguments that can be passed as `--key=value`. - -antigen-set-default ANTIGEN_CLONE_ENV "GIT_TERMINAL_PROMPT=0" - -antigen-set-default ANTIGEN_CLONE_OPTS "--single-branch --recursive --depth=1" - -antigen-set-default ANTIGEN_SUBMODULE_OPTS "--recursive --depth=1" - - # Complain when a bundle is already installed. - -antigen-set-default _ANTIGEN_WARN_DUPLICATES true - - # Compatibility with oh-my-zsh themes. - -antigen-set-default _ANTIGEN_THEME_COMPAT true - - # Add default built-in extensions to load at start up - -antigen-set-default _ANTIGEN_BUILTIN_EXTENSIONS 'lock parallel defer cache' - - # Setup antigen's own completion. - if -antigen-interactive-mode; then - TRACE "Gonna create compdump file @ env-setup" COMPDUMP - autoload -Uz compinit - compinit -d "$ANTIGEN_COMPDUMP" - compdef _antigen antigen - else - (( $+functions[antigen-ext-init] )) && antigen-ext-init - fi -} -# Load a given bundle by sourcing it. -# -# The function also modifies fpath to add the bundle path. -# -# Usage -# -antigen-load "bundle-url" ["location"] ["make_local_clone"] ["btype"] -# -# Returns -# Integer. 0 if success 1 if an error ocurred. --antigen-load () { - local bundle list - typeset -A bundle; bundle=($@) - - typeset -Ua list; list=() - local location="${bundle[dir]}/${bundle[loc]}" - - # Prioritize location when given. - if [[ -f "${location}" ]]; then - list=(${location}) - else - # Directory locations must be suffixed with slash - location="$location/" - - # Prioritize theme with antigen-theme - if [[ ${bundle[btype]} == "theme" ]]; then - list=(${location}*.zsh-theme(N[1])) - fi - - # Common frameworks - if [[ $#list == 0 ]]; then - # dot-plugin, init and functions support (omz, prezto) - # Support prezto function loading. See https://github.com/zsh-users/antigen/pull/428 - list=(${location}*.plugin.zsh(N[1]) ${location}init.zsh(N[1]) ${location}/functions(N[1])) - fi - - # Default to zsh and sh - if [[ $#list == 0 ]]; then - list=(${location}*.zsh(N) ${location}*.sh(N)) - fi - fi - - -antigen-load-env ${(kv)bundle} - - # If there is any sourceable try to load it - if ! -antigen-load-source "${list[@]}" && [[ ! -d ${location} ]]; then - return 1 - fi - - return 0 -} - --antigen-load-env () { - typeset -A bundle; bundle=($@) - local location=${bundle[dir]}/${bundle[loc]} - - # Load to path if there is no sourceable - if [[ -d ${location} ]]; then - PATH="$PATH:${location:A}" - fpath+=("${location:A}") - return - fi - - PATH="$PATH:${location:A:h}" - fpath+=("${location:A:h}") -} - --antigen-load-source () { - typeset -a list - list=($@) - local src match mbegin mend MATCH MBEGIN MEND - - # Return error when we're given an empty list - if [[ $#list == 0 ]]; then - return 1 - fi - - # Using a for rather than `source $list` as we need to check for zsh-themes - # In order to create antigen-compat file. This is only needed for interactive-mode - # theme switching, for static loading (cache) there is no need. - for src in $list; do - if [[ $_ANTIGEN_THEME_COMPAT == true && -f "$src" && "$src" == *.zsh-theme* ]]; then - local compat="${src:A}.antigen-compat" - echo "# Generated by Antigen. Do not edit!" >! "$compat" - cat $src | sed -Ee '/\{$/,/^\}/!{ - s/^local // - }' >>! "$compat" - src="$compat" - fi - - if ! source "$src" 2>/dev/null; then - return 1 - fi - done -} -# Usage: -# -antigen-parse-args output_assoc_arr --antigen-parse-args () { - local argkey key value index=0 args - local match mbegin mend MATCH MBEGIN MEND - - local var=$1 - shift - - # Bundle spec arguments' default values. - #setopt XTRACE VERBOSE - builtin typeset -A args - args[url]="$ANTIGEN_DEFAULT_REPO_URL" - #unsetopt XTRACE VERBOSE - args[loc]=/ - args[make_local_clone]=true - args[btype]=plugin - #args[branch]= # commented out as it may cause assoc array kv mismatch - - while [[ $# -gt 0 ]]; do - argkey="${1%\=*}" - key="${argkey//--/}" - value="${1#*=}" - - case "$argkey" in - --url|--loc|--branch|--btype) - if [[ "$value" == "$argkey" ]]; then - printf "Required argument for '%s' not provided.\n" $key >&2 - else - args[$key]="$value" - fi - ;; - --no-local-clone) - args[make_local_clone]=false - ;; - --*) - printf "Unknown argument '%s'.\n" $key >&2 - ;; - *) - value=$key - case $index in - 0) - key=url - local domain="" - local url_path=$value - # Full url with protocol or ssh github url (github.com:org/repo) - if [[ "$value" =~ "://" || "$value" =~ ":" ]]; then - if [[ "$value" =~ [@.][^/:]+[:]?[0-9]*[:/]?(.*)@?$ ]]; then - url_path=$match[1] - domain=${value/$url_path/} - fi - fi - - if [[ "$url_path" =~ '@' ]]; then - args[branch]="${url_path#*@}" - value="$domain${url_path%@*}" - else - value="$domain$url_path" - fi - ;; - 1) key=loc ;; - esac - let index+=1 - args[$key]="$value" - ;; - esac - - shift - done - - # Check if url is just the plugin name. Super short syntax. - if [[ "${args[url]}" != */* ]]; then - case "$ANTIGEN_DEFAULT_REPO_URL" in - "$ANTIGEN_OMZ_REPO_URL") - args[loc]="plugins/${args[url]}" - ;; - "$ANTIGEN_PREZTO_REPO_URL") - args[loc]="modules/${args[url]}" - ;; - *) - args[loc]="${args[url]}" - ;; - esac - args[url]="$ANTIGEN_DEFAULT_REPO_URL" - fi - - # Resolve the url. - # Expand short github url syntax: `username/reponame`. - local url="${args[url]}" - if [[ $url != git://* && - $url != https://* && - $url != http://* && - $url != ssh://* && - $url != /* && - $url != *github.com:*/* - ]]; then - url="https://github.com/${url%.git}.git" - fi - args[url]="$url" - - # Ignore local clone if url given is not a git directory - if [[ ${args[url]} == /* && ! -d ${args[url]}/.git ]]; then - args[make_local_clone]=false - fi - - # Add the branch information to the url if we need to create a local clone. - # Format url in bundle-metadata format: url[|branch] - if [[ ! -z "${args[branch]}" && ${args[make_local_clone]} == true ]]; then - args[url]="${args[url]}|${args[branch]}" - fi - - # Add the theme extension to `loc`, if this is a theme, but only - # if it's especified, ie, --loc=theme-name, in case when it's not - # specified antige-load-list will look for *.zsh-theme files - if [[ ${args[btype]} == "theme" && - ${args[loc]} != "/" && ${args[loc]} != *.zsh-theme ]]; then - args[loc]="${args[loc]}.zsh-theme" - fi - - local name="${args[url]%|*}" - local branch="${args[branch]}" - - # Extract bundle name. - if [[ "$name" =~ '.*/(.*/.*).*$' ]]; then - name="${match[1]}" - fi - name="${name%.git*}" - - # Format bundle name with optional branch. - if [[ -n "${branch}" ]]; then - args[name]="${name}@${branch}" - else - args[name]="${name}" - fi - - # Format bundle path. - if [[ ${args[make_local_clone]} == true ]]; then - local bpath="$name" - # Suffix with branch/tag name - if [[ -n "$branch" ]]; then - # bpath is in the form of repo/name@version => repo/name-version - # Replace / with - in bundle branch. - local bbranch=${branch//\//-} - # If branch/tag is semver-like do replace * by x. - bbranch=${bbranch//\*/x} - bpath="${name}-${bbranch}" - fi - - bpath="$ANTIGEN_BUNDLES/$bpath" - args[dir]="${(qq)bpath}" - else - # if it's local then path is just the "url" argument, loc remains the same - args[dir]=${args[url]} - fi - - # Escape url and branch (may contain semver-like and pipe characters) - args[url]="${(qq)args[url]}" - if [[ -n "${args[branch]}" ]]; then - args[branch]="${(qq)args[branch]}" - fi - - # Escape bundle name (may contain semver-like characters) - args[name]="${(qq)args[name]}" - - eval "${var}=(${(kv)args})" - - return 0 -} -# Updates revert-info data with git hash. -# -# This does process only cloned bundles. -# -# Usage -# -antigen-revert-info -# -# Returns -# Nothing. Generates/updates $ADOTDIR/revert-info. --antigen-revert-info() { - local url - # Update your bundles, i.e., `git pull` in all the plugin repos. - date >! $ADOTDIR/revert-info - - -antigen-get-cloned-bundles | while read url; do - local clone_dir="$(-antigen-get-clone-dir "$url")" - if [[ -d "$clone_dir" ]]; then - (echo -n "$clone_dir:" - \cd -q "$clone_dir" - git rev-parse HEAD) >> $ADOTDIR/revert-info - fi - done -} --antigen-use-oh-my-zsh () { - typeset -g ZSH ZSH_CACHE_DIR - ANTIGEN_DEFAULT_REPO_URL=$ANTIGEN_OMZ_REPO_URL - if [[ -z "$ZSH" ]]; then - ZSH="$(-antigen-get-clone-dir "$ANTIGEN_DEFAULT_REPO_URL")" - fi - if [[ -z "$ZSH_CACHE_DIR" ]]; then - ZSH_CACHE_DIR="$ZSH/cache/" - fi - antigen-bundle --loc=lib -} --antigen-use-prezto () { - ANTIGEN_DEFAULT_REPO_URL=$ANTIGEN_PREZTO_REPO_URL - antigen-bundle "$ANTIGEN_PREZTO_REPO_URL" -} -# Initialize completion -antigen-apply () { - LOG "Called antigen-apply" - - # Load the compinit module. This will readefine the `compdef` function to - # the one that actually initializes completions. - TRACE "Gonna create compdump file @ apply" COMPDUMP - autoload -Uz compinit - compinit -d "$ANTIGEN_COMPDUMP" - - # Apply all `compinit`s that have been deferred. - local cdef - for cdef in "${__deferred_compdefs[@]}"; do - compdef "$cdef" - done - - { zcompile "$ANTIGEN_COMPDUMP" } &! - - unset __deferred_compdefs -} -# Syntaxes -# antigen-bundle [=/] -# Keyword only arguments: -# branch - The branch of the repo to use for this bundle. -antigen-bundle () { - TRACE "Called antigen-bundle with $@" BUNDLE - if [[ -z "$1" ]]; then - printf "Antigen: Must provide a bundle url or name.\n" >&2 - return 1 - fi - - builtin typeset -A bundle; -antigen-parse-args 'bundle' ${=@} - if [[ -z ${bundle[btype]} ]]; then - bundle[btype]=bundle - fi - - local record="${bundle[url]} ${bundle[loc]} ${bundle[btype]} ${bundle[make_local_clone]}" - if [[ $_ANTIGEN_WARN_DUPLICATES == true && ! ${_ANTIGEN_BUNDLE_RECORD[(I)$record]} == 0 ]]; then - printf "Seems %s is already installed!\n" ${bundle[name]} - return 1 - fi - - # Clone bundle if we haven't done do already. - if [[ ! -d "${bundle[dir]}" ]]; then - if ! -antigen-bundle-install ${(kv)bundle}; then - return 1 - fi - fi - - # Load the plugin. - if ! -antigen-load ${(kv)bundle}; then - TRACE "-antigen-load failed to load ${bundle[name]}" BUNDLE - printf "Antigen: Failed to load %s.\n" ${bundle[btype]} >&2 - return 1 - fi - - # Only add it to the record if it could be installed and loaded. - _ANTIGEN_BUNDLE_RECORD+=("$record") -} - -# -# Usage: -# -antigen-bundle-install -# Returns: -# 1 if it fails to install bundle --antigen-bundle-install () { - typeset -A bundle; bundle=($@) - - # Ensure a clone exists for this repo, if needed. - # Get the clone's directory as per the given repo url and branch. - local bpath="${bundle[dir]}" - # Clone if it doesn't already exist. - local start=$(date +'%s') - - printf "Installing %s... " "${bundle[name]}" - - if ! -antigen-ensure-repo "${bundle[url]}"; then - # Return immediately if there is an error cloning - TRACE "-antigen-bundle-instal failed to clone ${bundle[url]}" BUNDLE - printf "Error! Activate logging and try again.\n" >&2 - return 1 - fi - - local took=$(( $(date +'%s') - $start )) - printf "Done. Took %ds.\n" $took -} -antigen-bundles () { - # Bulk add many bundles at one go. Empty lines and lines starting with a `#` - # are ignored. Everything else is given to `antigen-bundle` as is, no - # quoting rules applied. - local line - setopt localoptions no_extended_glob # See https://github.com/zsh-users/antigen/issues/456 - grep '^[[:space:]]*[^[:space:]#]' | while read line; do - antigen-bundle ${=line%#*} - done -} -# Cleanup unused repositories. -antigen-cleanup () { - local force=false - if [[ $1 == --force ]]; then - force=true - fi - - if [[ ! -d "$ANTIGEN_BUNDLES" || -z "$(\ls -A "$ANTIGEN_BUNDLES")" ]]; then - echo "You don't have any bundles." - return 0 - fi - - # Find directores in ANTIGEN_BUNDLES, that are not in the bundles record. - typeset -a unused_clones clones - - local url record clone - for record in $(-antigen-get-cloned-bundles); do - url=${record% /*} - clones+=("$(-antigen-get-clone-dir $url)") - done - - for clone in $ANTIGEN_BUNDLES/*/*(/); do - if [[ $clones[(I)$clone] == 0 ]]; then - unused_clones+=($clone) - fi - done - - if [[ -z $unused_clones ]]; then - echo "You don't have any unidentified bundles." - return 0 - fi - - echo 'You have clones for the following repos, but are not used.' - echo "\n${(j:\n:)unused_clones}" - - if $force || (echo -n '\nDelete them all? [y/N] '; read -q); then - echo - echo - for clone in $unused_clones; do - echo -n "Deleting clone \"$clone\"..." - \rm -rf "$clone" - - echo ' done.' - done - else - echo - echo "Nothing deleted." - fi -} -antigen-help () { - antigen-version - - cat < [args] - -Commands: - apply Must be called in the zshrc after all calls to 'antigen bundle'. - bundle Install and load a plugin. - cache-gen Generate Antigen's cache with currently loaded bundles. - cleanup Remove clones of repos not used by any loaded plugins. - init Use caching to quickly load bundles. - list List currently loaded plugins. - purge Remove a bundle from the filesystem. - reset Clean the generated cache. - restore Restore plugin state from a snapshot file. - revert Revert plugins to their state prior to the last time 'antigen - update' was run. - selfupdate Update antigen. - snapshot Create a snapshot of all active plugin repos and save it to a - snapshot file. - update Update plugins. - use Load a supported zsh pre-packaged framework. - -For further details and complete documentation, visit the project's page at -'http://antigen.sharats.me'. -EOF -} -# Antigen command to load antigen configuration -# -# This method is slighlty more performing than using various antigen-* methods. -# -# Usage -# Referencing an antigen configuration file: -# -# antigen-init "/path/to/antigenrc" -# -# or using HEREDOCS: -# -# antigen-init <&2 - return 1 - fi - fi - - # Otherwise we expect it to be a heredoc - grep '^[[:space:]]*[^[:space:]#]' | while read -r line; do - eval $line - done -} -# List instaled bundles either in long (record), short or simple format. -# -# Usage -# antigen-list [--short|--long|--simple] -# -# Returns -# List of bundles -antigen-list () { - local format=$1 - - # List all currently installed bundles. - if [[ -z $_ANTIGEN_BUNDLE_RECORD ]]; then - echo "You don't have any bundles." >&2 - return 1 - fi - - -antigen-get-bundles $format -} -# Remove a bundle from filesystem -# -# Usage -# antigen-purge example/bundle [--force] -# -# Returns -# Nothing. Removes bundle from filesystem. -antigen-purge () { - local bundle=$1 - local force=$2 - - if [[ $# -eq 0 ]]; then - echo "Antigen: Missing argument." >&2 - return 1 - fi - - if -antigen-purge-bundle $bundle $force; then - antigen-reset - else - return $? - fi - - return 0 -} - -# Remove a bundle from filesystem -# -# Usage -# antigen-purge example/bundle [--force] -# -# Returns -# Nothing. Removes bundle from filesystem. --antigen-purge-bundle () { - local bundle=$1 - local force=$2 - local clone_dir="" - - local record="" - local url="" - local make_local_clone="" - - if [[ $# -eq 0 ]]; then - echo "Antigen: Missing argument." >&2 - return 1 - fi - - # local keyword doesn't work on zsh <= 5.0.0 - record=$(-antigen-find-record $bundle) - - if [[ ! -n "$record" ]]; then - echo "Bundle not found in record. Try 'antigen bundle $bundle' first." >&2 - return 1 - fi - - url="$(echo "$record" | cut -d' ' -f1)" - make_local_clone=$(echo "$record" | cut -d' ' -f4) - - if [[ $make_local_clone == "false" ]]; then - echo "Bundle has no local clone. Will not be removed." >&2 - return 1 - fi - - clone_dir=$(-antigen-get-clone-dir "$url") - if [[ $force == "--force" ]] || read -q "?Remove '$clone_dir'? (y/n) "; then - # Need empty line after read -q - [[ ! -n $force ]] && echo "" || echo "Removing '$clone_dir'."; - rm -rf "$clone_dir" - return $? - fi - - return 1 -} -# Removes cache payload and metadata if available -# -# Usage -# antigen-reset -# -# Returns -# Nothing -antigen-reset () { - [[ -f "$ANTIGEN_CACHE" ]] && rm -f "$ANTIGEN_CACHE" "$ANTIGEN_CACHE.zwc" 1> /dev/null - [[ -f "$ANTIGEN_RSRC" ]] && rm -f "$ANTIGEN_RSRC" 1> /dev/null - [[ -f "$ANTIGEN_COMPDUMP" ]] && rm -f "$ANTIGEN_COMPDUMP" "$ANTIGEN_COMPDUMP.zwc" 1> /dev/null - [[ -f "$ANTIGEN_LOCK" ]] && rm -f "$ANTIGEN_LOCK" 1> /dev/null - echo 'Done. Please open a new shell to see the changes.' -} -antigen-restore () { - local line - if [[ $# == 0 ]]; then - echo 'Please provide a snapshot file to restore from.' >&2 - return 1 - fi - - local snapshot_file="$1" - - # TODO: Before doing anything with the snapshot file, verify its checksum. - # If it fails, notify this to the user and confirm if restore should - # proceed. - - echo -n "Restoring from $snapshot_file..." - - sed -n '1!p' "$snapshot_file" | - while read line; do - local version_hash="${line%% *}" - local url="${line##* }" - local clone_dir="$(-antigen-get-clone-dir "$url")" - - if [[ ! -d $clone_dir ]]; then - git clone "$url" "$clone_dir" &> /dev/null - fi - - (\cd -q "$clone_dir" && git checkout $version_hash) &> /dev/null - done - - echo ' done.' - echo 'Please open a new shell to get the restored changes.' -} -# Reads $ADORDIR/revert-info and restores bundles' revision -antigen-revert () { - local line - if [[ -f $ADOTDIR/revert-info ]]; then - cat $ADOTDIR/revert-info | sed -n '1!p' | while read line; do - local dir="$(echo "$line" | cut -d: -f1)" - git --git-dir="$dir/.git" --work-tree="$dir" \ - checkout "$(echo "$line" | cut -d: -f2)" 2> /dev/null - done - - echo "Reverted to state before running -update on $( - cat $ADOTDIR/revert-info | sed -n '1p')." - - else - echo 'No revert information available. Cannot revert.' >&2 - return 1 - fi -} -# Update (with `git pull`) antigen itself. -# TODO: Once update is finished, show a summary of the new commits, as a kind of -# "what's new" message. -antigen-selfupdate () { - (\cd -q $_ANTIGEN_INSTALL_DIR - if [[ ! ( -d .git || -f .git ) ]]; then - echo "Your copy of antigen doesn't appear to be a git clone. " \ - "The 'selfupdate' command cannot work in this case." - return 1 - fi - local head="$(git rev-parse --abbrev-ref HEAD)" - if [[ $head == "HEAD" ]]; then - # If current head is detached HEAD, checkout to master branch. - git checkout master - fi - git pull - - # TODO Should be transparently hooked by zcache - antigen-reset &>> /dev/null - ) -} -antigen-snapshot () { - local snapshot_file="${1:-antigen-shapshot}" - local urls url dir version_hash snapshot_content - local -a bundles - - # The snapshot content lines are pairs of repo-url and git version hash, in - # the form: - # - urls=$(-antigen-echo-record | awk '$4 == "true" {print $1}' | sort -u) - for url in ${(f)urls}; do - dir="$(-antigen-get-clone-dir "$url")" - version_hash="$(\cd -q "$dir" && git rev-parse HEAD)" - bundles+=("$version_hash $url"); - done - snapshot_content=${(j:\n:)bundles} - - { - # The first line in the snapshot file is for metadata, in the form: - # key='value'; key='value'; key='value'; - # Where `key`s are valid shell variable names. - - # Snapshot version. Has no relation to antigen version. If the snapshot - # file format changes, this number can be incremented. - echo -n "version='1';" - - # Snapshot creation date+time. - echo -n " created_on='$(date)';" - - # Add a checksum with the md5 checksum of all the snapshot lines. - chksum() { (md5sum; test $? = 127 && md5) 2>/dev/null | cut -d' ' -f1 } - local checksum="$(echo "$snapshot_content" | chksum)" - unset -f chksum; - echo -n " checksum='${checksum%% *}';" - - # A newline after the metadata and then the snapshot lines. - echo "\n$snapshot_content" - - } > "$snapshot_file" -} -# Loads a given theme. -# -# Shares the same syntax as antigen-bundle command. -# -# Usage -# antigen-theme zsh/theme[.zsh-theme] -# -# Returns -# 0 if everything was succesfully -antigen-theme () { - local name=$1 result=0 record - local match mbegin mend MATCH MBEGIN MEND - - if [[ -z "$1" ]]; then - printf "Antigen: Must provide a theme url or name.\n" >&2 - return 1 - fi - - -antigen-theme-reset-hooks - - record=$(-antigen-find-record "theme") - if [[ "$1" != */* && "$1" != --* ]]; then - # The first argument is just a name of the plugin, to be picked up from - # the default repo. - antigen-bundle --loc=themes/$name --btype=theme - - else - antigen-bundle "$@" --btype=theme - - fi - result=$? - - # Remove a theme from the record if the following conditions apply: - # - there was no error in bundling the given theme - # - there is a theme registered - # - registered theme is not the same as the current one - if [[ $result == 0 && -n $record ]]; then - # http://zsh-workers.zsh.narkive.com/QwfCWpW8/what-s-wrong-with-this-expression - if [[ "$record" =~ "$@" ]]; then - return $result - else - _ANTIGEN_BUNDLE_RECORD[$_ANTIGEN_BUNDLE_RECORD[(I)$record]]=() - fi - fi - - return $result -} - --antigen-theme-reset-hooks () { - # This is only needed on interactive mode - autoload -U add-zsh-hook is-at-least - local hook - - # Clear out prompts - PROMPT="" - if [[ -n $RPROMPT ]]; then - RPROMPT="" - fi - - for hook in chpwd precmd preexec periodic; do - add-zsh-hook -D "${hook}" "prompt_*" - # common in omz themes - add-zsh-hook -D "${hook}" "*_${hook}" - add-zsh-hook -d "${hook}" "vcs_info" - done -} -# Updates the bundles or a single bundle. -# -# Usage -# antigen-update [example/bundle] -# -# Returns -# Nothing. Performs a `git pull`. -antigen-update () { - local bundle=$1 url - - # Clear log - :> $ANTIGEN_LOG - - # Update revert-info data - -antigen-revert-info - - # If no argument is given we update all bundles - if [[ $# -eq 0 ]]; then - # Here we're ignoring all non cloned bundles (ie, --no-local-clone) - -antigen-get-cloned-bundles | while read url; do - -antigen-update-bundle $url - done - # TODO next minor version - # antigen-reset - else - if -antigen-update-bundle $bundle; then - # TODO next minor version - # antigen-reset - else - return $? - fi - fi -} - -# Updates a bundle performing a `git pull`. -# -# Usage -# -antigen-update-bundle example/bundle -# -# Returns -# Nothing. Performs a `git pull`. --antigen-update-bundle () { - local bundle="$1" - local record="" - local url="" - local make_local_clone="" - local start=$(date +'%s') - - if [[ $# -eq 0 ]]; then - printf "Antigen: Missing argument.\n" >&2 - return 1 - fi - - record=$(-antigen-find-record $bundle) - if [[ ! -n "$record" ]]; then - printf "Bundle not found in record. Try 'antigen bundle %s' first.\n" $bundle >&2 - return 1 - fi - - url="$(echo "$record" | cut -d' ' -f1)" - make_local_clone=$(echo "$record" | cut -d' ' -f4) - - local branch="master" - if [[ $url == *\|* ]]; then - branch="$(-antigen-parse-branch ${url%|*} ${url#*|})" - fi - - printf "Updating %s... " $(-antigen-bundle-short-name "$url" "$branch") - - if [[ $make_local_clone == "false" ]]; then - printf "Bundle has no local clone. Will not be updated.\n" >&2 - return 1 - fi - - # update=true verbose=false - if ! -antigen-ensure-repo "$url" true false; then - printf "Error! Activate logging and try again.\n" >&2 - return 1 - fi - - local took=$(( $(date +'%s') - $start )) - printf "Done. Took %ds.\n" $took -} -antigen-use () { - if [[ $1 == oh-my-zsh ]]; then - -antigen-use-oh-my-zsh - elif [[ $1 == prezto ]]; then - -antigen-use-prezto - elif [[ $1 != "" ]]; then - ANTIGEN_DEFAULT_REPO_URL=$1 - antigen-bundle $@ - else - echo 'Usage: antigen-use ' >&2 - echo 'Where is any one of the following:' >&2 - echo ' * oh-my-zsh' >&2 - echo ' * prezto' >&2 - echo ' is the full url.' >&2 - return 1 - fi -} -antigen-version () { - local version="v2.2.2" - local extensions revision="" - if [[ -d $_ANTIGEN_INSTALL_DIR/.git ]]; then - revision=" ($(git --git-dir=$_ANTIGEN_INSTALL_DIR/.git rev-parse --short '@'))" - fi - - printf "Antigen %s%s\n" $version $revision - if (( $+functions[antigen-ext] )); then - typeset -a extensions; extensions=($(antigen-ext-list)) - if [[ $#extensions -gt 0 ]]; then - printf "Extensions loaded: %s\n" ${(j:, :)extensions} - fi - fi -} -typeset -Ag _ANTIGEN_HOOKS; _ANTIGEN_HOOKS=() -typeset -Ag _ANTIGEN_HOOKS_META; _ANTIGEN_HOOKS_META=() -typeset -g _ANTIGEN_HOOK_PREFIX="-antigen-hook-" -typeset -g _ANTIGEN_EXTENSIONS; _ANTIGEN_EXTENSIONS=() - -# -antigen-add-hook antigen-apply antigen-apply-hook replace -# - Replaces hooked function with hook, do not call hooked function -# - Return -1 to stop calling further hooks -# -antigen-add-hook antigen-apply antigen-apply-hook pre (pre-call) -# - By default it will call hooked function -# -antigen-add-hook antigen-pply antigen-apply-hook post (post-call) -# - Calls antigen-apply and then calls hook function -# Usage: -# -antigen-add-hook antigen-apply antigen-apply-hook ["replace"|"pre"|"post"] ["once"|"repeat"] -antigen-add-hook () { - local target="$1" hook="$2" type="$3" mode="${4:-repeat}" - - if (( ! $+functions[$target] )); then - printf "Antigen: Function %s doesn't exist.\n" $target - return 1 - fi - - if (( ! $+functions[$hook] )); then - printf "Antigen: Function %s doesn't exist.\n" $hook - return 1 - fi - - if [[ "${_ANTIGEN_HOOKS[$target]}" == "" ]]; then - _ANTIGEN_HOOKS[$target]="${hook}" - else - _ANTIGEN_HOOKS[$target]="${_ANTIGEN_HOOKS[$target]}:${hook}" - fi - - _ANTIGEN_HOOKS_META[$hook]="target $target type $type mode $mode called 0" - - # Do shadow for this function if there is none already - local hook_function="${_ANTIGEN_HOOK_PREFIX}$target" - if (( ! $+functions[$hook_function] )); then - # Preserve hooked function - eval "function ${_ANTIGEN_HOOK_PREFIX}$(functions -- $target)" - - # Create hook, call hook-handler to further process hook functions - eval "function $target () { - noglob -antigen-hook-handler $target \$@ - return \$? - }" - fi - - return 0 -} - -# Private function to handle multiple hooks in a central point. --antigen-hook-handler () { - local target="$1" args hook called - local hooks meta - shift - typeset -a args; args=(${@}) - - typeset -a pre_hooks replace_hooks post_hooks; - typeset -a hooks; hooks=(${(s|:|)_ANTIGEN_HOOKS[$target]}) - - typeset -A meta; - for hook in $hooks; do - meta=(${(s: :)_ANTIGEN_HOOKS_META[$hook]}) - if [[ ${meta[mode]} == "once" && ${meta[called]} == 1 ]]; then - WARN "Ignoring hook due to mode ${meta[mode]}: $hook" - continue - fi - - let called=${meta[called]}+1 - meta[called]=$called - _ANTIGEN_HOOKS_META[$hook]="${(kv)meta}" - WARN "Updated meta: "${(kv)meta} - - case "${meta[type]}" in - "pre") - pre_hooks+=($hook) - ;; - "replace") - replace_hooks+=($hook) - ;; - "post") - post_hooks+=($hook) - ;; - esac - done - - WARN "Processing hooks: ${hooks}" - - for hook in $pre_hooks; do - WARN "Pre hook:" $hook $args - noglob $hook $args - [[ $? == -1 ]] && WARN "$hook shortcircuited" && return $ret - done - - # A replace hook will return inmediately - local replace_hook=0 ret=0 - for hook in $replace_hooks; do - replace_hook=1 - # Should not be needed if `antigen-remove-hook` removed unneeded hooks. - if (( $+functions[$hook] )); then - WARN "Replace hook:" $hook $args - noglob $hook $args - [[ $? == -1 ]] && WARN "$hook shortcircuited" && return $ret - fi - done - - if [[ $replace_hook == 0 ]]; then - WARN "${_ANTIGEN_HOOK_PREFIX}$target $args" - noglob ${_ANTIGEN_HOOK_PREFIX}$target $args - ret=$? - else - WARN "Replaced hooked function." - fi - - for hook in $post_hooks; do - WARN "Post hook:" $hook $args - noglob $hook $args - [[ $? == -1 ]] && WARN "$hook shortcircuited" && return $ret - done - - LOG "Return from hook ${target} with ${ret}" - - return $ret -} - -# Usage: -# -antigen-remove-hook antigen-apply-hook -antigen-remove-hook () { - local hook="$1" - typeset -A meta; meta=(${(s: :)_ANTIGEN_HOOKS_META[$hook]}) - local target="${meta[target]}" - local -a hooks; hooks=(${(s|:|)_ANTIGEN_HOOKS[$target]}) - - # Remove registered hook - if [[ $#hooks > 0 ]]; then - hooks[$hooks[(I)$hook]]=() - fi - _ANTIGEN_HOOKS[${target}]="${(j|:|)hooks}" - - if [[ $#hooks == 0 ]]; then - # Destroy base hook - eval "function $(functions -- ${_ANTIGEN_HOOK_PREFIX}$target | sed s/${_ANTIGEN_HOOK_PREFIX}//)" - if (( $+functions[${_ANTIGEN_HOOK_PREFIX}$target] )); then - unfunction -- "${_ANTIGEN_HOOK_PREFIX}$target" - fi - fi - - unfunction -- $hook 2> /dev/null -} - -# Remove all defined hooks. --antigen-reset-hooks () { - local target - - for target in ${(k)_ANTIGEN_HOOKS}; do - # Release all hooked functions - eval "function $(functions -- ${_ANTIGEN_HOOK_PREFIX}$target | sed s/${_ANTIGEN_HOOK_PREFIX}//)" - unfunction -- "${_ANTIGEN_HOOK_PREFIX}$target" 2> /dev/null - done - - _ANTIGEN_HOOKS=() - _ANTIGEN_HOOKS_META=() - _ANTIGEN_EXTENSIONS=() -} - -# Initializes an extension -# Usage: -# antigen-ext ext-name -antigen-ext () { - local ext=$1 - local func="-antigen-$ext-init" - if (( $+functions[$func] && $_ANTIGEN_EXTENSIONS[(I)$ext] == 0 )); then - eval $func - local ret=$? - WARN "$func return code was $ret" - if (( $ret == 0 )); then - LOG "LOADED EXTENSION $ext" EXT - -antigen-$ext-execute && _ANTIGEN_EXTENSIONS+=($ext) - else - WARN "IGNORING EXTENSION $func" EXT - return 1 - fi - - else - printf "Antigen: No extension defined or already loaded: %s\n" $func >&2 - return 1 - fi -} - -# List installed extensions -# Usage: -# antigen ext-list -antigen-ext-list () { - echo $_ANTIGEN_EXTENSIONS -} - -# Initializes built-in extensions -# Usage: -# antigen-ext-init -antigen-ext-init () { - # Initialize extensions. unless in interactive mode. - local ext - for ext in ${(s/ /)_ANTIGEN_BUILTIN_EXTENSIONS}; do - # Check if extension is loaded before intializing it - (( $+functions[-antigen-$ext-init] )) && antigen-ext $ext - done -} -# Initialize defer lib --antigen-defer-init () { - typeset -ga _DEFERRED_BUNDLE; _DEFERRED_BUNDLE=() - if -antigen-interactive-mode; then - return 1 - fi -} - --antigen-defer-execute () { - # Hooks antigen-bundle in order to defer its execution. - antigen-bundle-defer () { - _DEFERRED_BUNDLE+=("${(j: :)${@}}") - return -1 # Stop right there - } - antigen-add-hook antigen-bundle antigen-bundle-defer replace - - # Hooks antigen-apply in order to release hooked functions - antigen-apply-defer () { - WARN "Defer pre-apply" DEFER PRE-APPLY - antigen-remove-hook antigen-bundle-defer - - # Process all deferred bundles. - local bundle - for bundle in ${_DEFERRED_BUNDLE[@]}; do - LOG "Processing deferred bundle: ${bundle}" DEFER - antigen-bundle $bundle - done - - unset _DEFERRED_BUNDLE - } - antigen-add-hook antigen-apply antigen-apply-defer pre once -} -# Initialize lock lib --antigen-lock-init () { - # Default lock path. - -antigen-set-default ANTIGEN_LOCK $ADOTDIR/.lock - typeset -g _ANTIGEN_LOCK_PROCESS=false - - # Use env variable to determine if we should load this extension - -antigen-set-default ANTIGEN_MUTEX true - # Set ANTIGEN_MUTEX to false to avoid loading this extension - if [[ $ANTIGEN_MUTEX == true ]]; then - return 0; - fi - - # Do not use mutex - return 1; -} - --antigen-lock-execute () { - # Hook antigen command in order to check/create a lock file. - # This hook is only run once then releases itself. - antigen-lock () { - LOG "antigen-lock called" - # If there is a lock set up then we won't process anything. - if [[ -f $ANTIGEN_LOCK ]]; then - # Set up flag do the message is not repeated for each antigen-* command - [[ $_ANTIGEN_LOCK_PROCESS == false ]] && printf "Antigen: Another process in running.\n" - _ANTIGEN_LOCK_PROCESS=true - # Do not further process hooks. For this hook to properly work it - # should be registered first. - return -1 - fi - - WARN "Creating antigen-lock file at $ANTIGEN_LOCK" - touch $ANTIGEN_LOCK - } - antigen-add-hook antigen antigen-lock pre once - - # Hook antigen-apply in order to release .lock file. - antigen-apply-lock () { - WARN "Freeing antigen-lock file at $ANTIGEN_LOCK" - unset _ANTIGEN_LOCK_PROCESS - rm -f $ANTIGEN_LOCK &> /dev/null - } - antigen-add-hook antigen-apply antigen-apply-lock post once -} -# Initialize parallel lib --antigen-parallel-init () { - WARN "Init parallel extension" PARALLEL - typeset -ga _PARALLEL_BUNDLE; _PARALLEL_BUNDLE=() - if -antigen-interactive-mode; then - return 1 - fi -} - --antigen-parallel-execute() { - WARN "Exec parallel extension" PARALLEL - # Install bundles in parallel - antigen-bundle-parallel-execute () { - WARN "Parallel antigen-bundle-parallel-execute" PARALLEL - typeset -a pids; pids=() - local args pid - - WARN "Gonna install in parallel ${#_PARALLEL_BUNDLE} bundles." PARALLEL - # Do ensure-repo in parallel - WARN "${_PARALLEL_BUNDLE}" PARALLEL - typeset -Ua repositories # Used to keep track of cloned repositories to avoid - # trying to clone it multiple times. - for args in ${_PARALLEL_BUNDLE}; do - typeset -A bundle; -antigen-parse-args 'bundle' ${=args} - - if [[ ! -d ${bundle[dir]} && $repositories[(I)${bundle[url]}] == 0 ]]; then - WARN "Install in parallel ${bundle[name]}." PARALLEL - echo "Installing ${bundle[name]}!..." - # $bundle[url]'s format is "url|branch" as to create "$ANTIGEN_BUNDLES/bundle/name-branch", - # this way you may require multiple branches from the same repository. - -antigen-ensure-repo "${bundle[url]}" > /dev/null &! - pids+=($!) - else - WARN "Bundle ${bundle[name]} already cloned locally." PARALLEL - fi - - repositories+=(${bundle[url]}) - done - - # Wait for all background processes to end - while [[ $#pids > 0 ]]; do - for pid in $pids; do - # `ps` may diplay an error message such "Signal 18 (CONT) caught by ps - # (procps-ng version 3.3.9).", see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=732410 - if [[ $(ps -o pid= -p $pid 2>/dev/null) == "" ]]; then - pids[$pids[(I)$pid]]=() - fi - done - sleep .5 - done - - builtin local bundle &> /dev/null - for bundle in ${_PARALLEL_BUNDLE[@]}; do - antigen-bundle $bundle - done - - - WARN "Parallel install done" PARALLEL - } - - # Hooks antigen-apply in order to release hooked functions - antigen-apply-parallel () { - WARN "Parallel pre-apply" PARALLEL PRE-APPLY - #antigen-remove-hook antigen-pre-apply-parallel - # Hooks antigen-bundle in order to parallel its execution. - antigen-bundle-parallel () { - TRACE "antigen-bundle-parallel: $@" PARALLEL - _PARALLEL_BUNDLE+=("${(j: :)${@}}") - } - antigen-add-hook antigen-bundle antigen-bundle-parallel replace - } - antigen-add-hook antigen-apply antigen-apply-parallel pre once - - antigen-apply-parallel-execute () { - WARN "Parallel replace-apply" PARALLEL REPLACE-APPLY - antigen-remove-hook antigen-bundle-parallel - # Process all parallel bundles. - antigen-bundle-parallel-execute - - unset _PARALLEL_BUNDLE - antigen-remove-hook antigen-apply-parallel-execute - antigen-apply - } - antigen-add-hook antigen-apply antigen-apply-parallel-execute replace once -} -typeset -ga _ZCACHE_BUNDLE_SOURCE _ZCACHE_CAPTURE_BUNDLE -typeset -g _ZCACHE_CAPTURE_PREFIX - -# Generates cache from listed bundles. -# -# Iterates over _ANTIGEN_BUNDLE_RECORD and join all needed sources into one, -# if this is done through -antigen-load-list. -# Result is stored in ANTIGEN_CACHE. -# -# _ANTIGEN_BUNDLE_RECORD and fpath is stored in cache. -# -# Usage -# -zcache-generate-cache -# -# Returns -# Nothing. Generates ANTIGEN_CACHE --antigen-cache-generate () { - local -aU _fpath _PATH _sources - local record - - LOG "Gonna generate cache for $_ZCACHE_BUNDLE_SOURCE" - for record in $_ZCACHE_BUNDLE_SOURCE; do - record=${record:A} - # LOG "Caching $record" - if [[ -f $record ]]; then - # Adding $'\n' as a suffix as j:\n: doesn't work inside a heredoc. - if [[ $_ANTIGEN_THEME_COMPAT == true && "$record" == *.zsh-theme* ]]; then - local compat="${record:A}.antigen-compat" - echo "# Generated by Antigen. Do not edit!" >! "$compat" - cat $record | sed -Ee '/\{$/,/^\}/!{ - s/^local // - }' >>! "$compat" - record="$compat" - fi - _sources+=("source '${record}';"$'\n') - elif [[ -d $record ]]; then - _PATH+=("${record}") - _fpath+=("${record}") - fi - done - -cat > $ANTIGEN_CACHE <! "$ANTIGEN_RSRC" - for rsrc in $ANTIGEN_CHECK_FILES; do - zcompile $rsrc - done - } &! - - return true -} - -# Initializes caching mechanism. -# -# Hooks `antigen-bundle` and `antigen-apply` in order to defer bundle install -# and load. All bundles are loaded from generated cache rather than dynamically -# as these are bundled. -# -# Usage -# -antigen-cache-init -# Returns -# Nothing --antigen-cache-init () { - if -antigen-interactive-mode; then - return 1 - fi - - _ZCACHE_CAPTURE_PREFIX=${_ZCACHE_CAPTURE_PREFIX:-"--zcache-"} - _ZCACHE_BUNDLE_SOURCE=(); _ZCACHE_CAPTURE_BUNDLE=() - - # Cache auto config files to check for changes (.zshrc, .antigenrc etc) - -antigen-set-default ANTIGEN_AUTO_CONFIG true - - # Default cache path. - -antigen-set-default ANTIGEN_CACHE $ADOTDIR/init.zsh - -antigen-set-default ANTIGEN_RSRC $ADOTDIR/.resources - if [[ $ANTIGEN_CACHE == false ]]; then - return 1 - fi - - return 0 -} - --antigen-cache-execute () { - # Main function. Deferred antigen-apply. - antigen-apply-cached () { - # TRACE "APPLYING CACHE" EXT - # Auto determine check_files - # There always should be 5 steps from original source as the correct way is to use - # `antigen` wrapper not `antigen-apply` directly and it's called by an extension. - LOG "TRACE: ${funcfiletrace}" - if [[ $ANTIGEN_AUTO_CONFIG == true && $#ANTIGEN_CHECK_FILES -eq 0 ]]; then - ANTIGEN_CHECK_FILES+=(~/.zshrc) - if [[ $#funcfiletrace -ge 6 ]]; then - ANTIGEN_CHECK_FILES+=("${${funcfiletrace[6]%:*}##* }") - fi - fi - - # Generate and compile cache - -antigen-cache-generate - [[ -f "$ANTIGEN_CACHE" ]] && source "$ANTIGEN_CACHE"; - - # Commented out in order to have a working `cache-gen` command - #unset _ZCACHE_BUNDLE_SOURCE - unset _ZCACHE_CAPTURE_BUNDLE _ZCACHE_CAPTURE_FUNCTIONS - - # Release all hooked functions - antigen-remove-hook -antigen-load-env-cached - antigen-remove-hook -antigen-load-source-cached - antigen-remove-hook antigen-bundle-cached - } - - antigen-add-hook antigen-apply antigen-apply-cached post once - - # Defer antigen-bundle. - antigen-bundle-cached () { - _ZCACHE_CAPTURE_BUNDLE+=("${(j: :)${@}}") - } - antigen-add-hook antigen-bundle antigen-bundle-cached pre - - # Defer loading. - -antigen-load-env-cached () { - local bundle - typeset -A bundle; bundle=($@) - local location=${bundle[dir]}/${bundle[loc]} - - # Load to path if there is no sourceable - if [[ ${bundle[loc]} == "/" ]]; then - _ZCACHE_BUNDLE_SOURCE+=("${location}") - return - fi - - _ZCACHE_BUNDLE_SOURCE+=("${location}") - } - antigen-add-hook -antigen-load-env -antigen-load-env-cached replace - - # Defer sourcing. - -antigen-load-source-cached () { - _ZCACHE_BUNDLE_SOURCE+=($@) - } - antigen-add-hook -antigen-load-source -antigen-load-source-cached replace - - return 0 -} - -# Generate static-cache file at $ANTIGEN_CACHE using currently loaded -# bundles from $_ANTIGEN_BUNDLE_RECORD -# -# Usage -# antigen-cache-gen -# -# Returns -# Nothing -antigen-cache-gen () { - -antigen-cache-generate -} -#compdef _antigen -# Setup antigen's autocompletion -_antigen () { - local -a _1st_arguments - _1st_arguments=( - 'apply:Load all bundle completions' - 'bundle:Install and load the given plugin' - 'bundles:Bulk define bundles' - 'cleanup:Clean up the clones of repos which are not used by any bundles currently loaded' - 'cache-gen:Generate cache' - 'init:Load Antigen configuration from file' - 'list:List out the currently loaded bundles' - 'purge:Remove a cloned bundle from filesystem' - 'reset:Clears cache' - 'restore:Restore the bundles state as specified in the snapshot' - 'revert:Revert the state of all bundles to how they were before the last antigen update' - 'selfupdate:Update antigen itself' - 'snapshot:Create a snapshot of all the active clones' - 'theme:Switch the prompt theme' - 'update:Update all bundles' - 'use:Load any (supported) zsh pre-packaged framework' - ); - - _1st_arguments+=( - 'help:Show this message' - 'version:Display Antigen version' - ) - - __bundle() { - _arguments \ - '--loc[Path to the location ]' \ - '--url[Path to the repository ]' \ - '--branch[Git branch name]' \ - '--no-local-clone[Do not create a clone]' - } - __list() { - _arguments \ - '--simple[Show only bundle name]' \ - '--short[Show only bundle name and branch]' \ - '--long[Show bundle records]' - } - - - __cleanup() { - _arguments \ - '--force[Do not ask for confirmation]' - } - - _arguments '*:: :->command' - - if (( CURRENT == 1 )); then - _describe -t commands "antigen command" _1st_arguments - return - fi - - local -a _command_args - case "$words[1]" in - bundle) - __bundle - ;; - use) - compadd "$@" "oh-my-zsh" "prezto" - ;; - cleanup) - __cleanup - ;; - (update|purge) - compadd $(type -f \-antigen-get-bundles &> /dev/null || antigen &> /dev/null; -antigen-get-bundles --simple 2> /dev/null) - ;; - theme) - compadd $(type -f \-antigen-get-themes &> /dev/null || antigen &> /dev/null; -antigen-get-themes 2> /dev/null) - ;; - list) - __list - ;; - esac -} -zmodload zsh/datetime -ANTIGEN_DEBUG_LOG=${ANTIGEN_DEBUG_LOG:-${ADOTDIR:-$HOME/.antigen}/debug.log} -LOG () { - local PREFIX="[LOG][${EPOCHREALTIME}]" - echo "${PREFIX} ${funcfiletrace[1]}\n${PREFIX} $@" >> $ANTIGEN_DEBUG_LOG -} - -ERR () { - local PREFIX="[ERR][${EPOCHREALTIME}]" - echo "${PREFIX} ${funcfiletrace[1]}\n${PREFIX} $@" >> $ANTIGEN_DEBUG_LOG -} - -WARN () { - local PREFIX="[WRN][${EPOCHREALTIME}]" - echo "${PREFIX} ${funcfiletrace[1]}\n${PREFIX} $@" >> $ANTIGEN_DEBUG_LOG -} - -TRACE () { - local PREFIX="[TRA][${EPOCHREALTIME}]" - echo "${PREFIX} ${funcfiletrace[1]}\n${PREFIX} $@\n${PREFIX} ${(j:\n:)funcstack}" >> $ANTIGEN_DEBUG_LOG -} --antigen-env-setup diff --git a/zsh/.zsh/pure/.editorconfig b/zsh/.zsh/pure/.editorconfig deleted file mode 100755 index 1c6314a..0000000 --- a/zsh/.zsh/pure/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -root = true - -[*] -indent_style = tab -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.yml] -indent_style = space -indent_size = 2 diff --git a/zsh/.zsh/pure/.gitattributes b/zsh/.zsh/pure/.gitattributes deleted file mode 100755 index 6313b56..0000000 --- a/zsh/.zsh/pure/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf diff --git a/zsh/.zsh/pure/.npmrc b/zsh/.zsh/pure/.npmrc deleted file mode 100755 index 43c97e7..0000000 --- a/zsh/.zsh/pure/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false diff --git a/zsh/.zsh/pure/async.zsh b/zsh/.zsh/pure/async.zsh deleted file mode 100755 index 08ed3a6..0000000 --- a/zsh/.zsh/pure/async.zsh +++ /dev/null @@ -1,661 +0,0 @@ -#!/usr/bin/env zsh - -# -# zsh-async -# -# version: v1.8.4 -# author: Mathias Fredriksson -# url: https://github.com/mafredri/zsh-async -# - -typeset -g ASYNC_VERSION=1.8.4 -# Produce debug output from zsh-async when set to 1. -typeset -g ASYNC_DEBUG=${ASYNC_DEBUG:-0} - -# Execute commands that can manipulate the environment inside the async worker. Return output via callback. -_async_eval() { - local ASYNC_JOB_NAME - # Rename job to _async_eval and redirect all eval output to cat running - # in _async_job. Here, stdout and stderr are not separated for - # simplicity, this could be improved in the future. - { - eval "$@" - } &> >(ASYNC_JOB_NAME=[async/eval] _async_job 'cat') -} - -# Wrapper for jobs executed by the async worker, gives output in parseable format with execution time -_async_job() { - # Disable xtrace as it would mangle the output. - setopt localoptions noxtrace - - # Store start time for job. - float -F duration=$EPOCHREALTIME - - # Run the command and capture both stdout (`eval`) and stderr (`cat`) in - # separate subshells. When the command is complete, we grab write lock - # (mutex token) and output everything except stderr inside the command - # block, after the command block has completed, the stdin for `cat` is - # closed, causing stderr to be appended with a $'\0' at the end to mark the - # end of output from this job. - local jobname=${ASYNC_JOB_NAME:-$1} out - out="$( - local stdout stderr ret tok - { - stdout=$(eval "$@") - ret=$? - duration=$(( EPOCHREALTIME - duration )) # Calculate duration. - - print -r -n - $'\0'${(q)jobname} $ret ${(q)stdout} $duration - } 2> >(stderr=$(cat) && print -r -n - " "${(q)stderr}$'\0') - )" - if [[ $out != $'\0'*$'\0' ]]; then - # Corrupted output (aborted job?), skipping. - return - fi - - # Grab mutex lock, stalls until token is available. - read -r -k 1 -p tok || return 1 - - # Return output ( ). - print -r -n - "$out" - - # Unlock mutex by inserting a token. - print -n -p $tok -} - -# The background worker manages all tasks and runs them without interfering with other processes -_async_worker() { - # Reset all options to defaults inside async worker. - emulate -R zsh - - # Make sure monitor is unset to avoid printing the - # pids of child processes. - unsetopt monitor - - # Redirect stderr to `/dev/null` in case unforseen errors produced by the - # worker. For example: `fork failed: resource temporarily unavailable`. - # Some older versions of zsh might also print malloc errors (know to happen - # on at least zsh 5.0.2 and 5.0.8) likely due to kill signals. - exec 2>/dev/null - - # When a zpty is deleted (using -d) all the zpty instances created before - # the one being deleted receive a SIGHUP, unless we catch it, the async - # worker would simply exit (stop working) even though visible in the list - # of zpty's (zpty -L). This has been fixed around the time of Zsh 5.4 - # (not released). - if ! is-at-least 5.4.1; then - TRAPHUP() { - return 0 # Return 0, indicating signal was handled. - } - fi - - local -A storage - local unique=0 - local notify_parent=0 - local parent_pid=0 - local coproc_pid=0 - local processing=0 - - local -a zsh_hooks zsh_hook_functions - zsh_hooks=(chpwd periodic precmd preexec zshexit zshaddhistory) - zsh_hook_functions=(${^zsh_hooks}_functions) - unfunction $zsh_hooks &>/dev/null # Deactivate all zsh hooks inside the worker. - unset $zsh_hook_functions # And hooks with registered functions. - unset zsh_hooks zsh_hook_functions # Cleanup. - - close_idle_coproc() { - local -a pids - pids=(${${(v)jobstates##*:*:}%\=*}) - - # If coproc (cat) is the only child running, we close it to avoid - # leaving it running indefinitely and cluttering the process tree. - if (( ! processing )) && [[ $#pids = 1 ]] && [[ $coproc_pid = $pids[1] ]]; then - coproc : - coproc_pid=0 - fi - } - - child_exit() { - close_idle_coproc - - # On older version of zsh (pre 5.2) we notify the parent through a - # SIGWINCH signal because `zpty` did not return a file descriptor (fd) - # prior to that. - if (( notify_parent )); then - # We use SIGWINCH for compatibility with older versions of zsh - # (pre 5.1.1) where other signals (INFO, ALRM, USR1, etc.) could - # cause a deadlock in the shell under certain circumstances. - kill -WINCH $parent_pid - fi - } - - # Register a SIGCHLD trap to handle the completion of child processes. - trap child_exit CHLD - - # Process option parameters passed to worker. - while getopts "np:uz" opt; do - case $opt in - n) notify_parent=1;; - p) parent_pid=$OPTARG;; - u) unique=1;; - z) notify_parent=0;; # Uses ZLE watcher instead. - esac - done - - # Terminate all running jobs, note that this function does not - # reinstall the child trap. - terminate_jobs() { - trap - CHLD # Ignore child exits during kill. - coproc : # Quit coproc. - coproc_pid=0 # Reset pid. - - if is-at-least 5.4.1; then - trap '' HUP # Catch the HUP sent to this process. - kill -HUP -$$ # Send to entire process group. - trap - HUP # Disable HUP trap. - else - # We already handle HUP for Zsh < 5.4.1. - kill -HUP -$$ # Send to entire process group. - fi - } - - killjobs() { - local tok - local -a pids - pids=(${${(v)jobstates##*:*:}%\=*}) - - # No need to send SIGHUP if no jobs are running. - (( $#pids == 0 )) && continue - (( $#pids == 1 )) && [[ $coproc_pid = $pids[1] ]] && continue - - # Grab lock to prevent half-written output in case a child - # process is in the middle of writing to stdin during kill. - (( coproc_pid )) && read -r -k 1 -p tok - - terminate_jobs - trap child_exit CHLD # Reinstall child trap. - } - - local request do_eval=0 - local -a cmd - while :; do - # Wait for jobs sent by async_job. - read -r -d $'\0' request || { - # Unknown error occurred while reading from stdin, the zpty - # worker is likely in a broken state, so we shut down. - terminate_jobs - - # Stdin is broken and in case this was an unintended - # crash, we try to report it as a last hurrah. - print -r -n $'\0'"'[async]'" $(( 127 + 3 )) "''" 0 "'$0:$LINENO: zpty fd died, exiting'"$'\0' - - # We use `return` to abort here because using `exit` may - # result in an infinite loop that never exits and, as a - # result, high CPU utilization. - return $(( 127 + 1 )) - } - - # We need to clean the input here because sometimes when a zpty - # has died and been respawned, messages will be prefixed with a - # carraige return (\r, or \C-M). - request=${request#$'\C-M'} - - # Check for non-job commands sent to worker - case $request in - _killjobs) killjobs; continue;; - _async_eval*) do_eval=1;; - esac - - # Parse the request using shell parsing (z) to allow commands - # to be parsed from single strings and multi-args alike. - cmd=("${(z)request}") - - # Name of the job (first argument). - local job=$cmd[1] - - # Check if a worker should perform unique jobs, unless - # this is an eval since they run synchronously. - if (( !do_eval )) && (( unique )); then - # Check if a previous job is still running, if yes, - # skip this job and let the previous one finish. - for pid in ${${(v)jobstates##*:*:}%\=*}; do - if [[ ${storage[$job]} == $pid ]]; then - continue 2 - fi - done - fi - - # Guard against closing coproc from trap before command has started. - processing=1 - - # Because we close the coproc after the last job has completed, we must - # recreate it when there are no other jobs running. - if (( ! coproc_pid )); then - # Use coproc as a mutex for synchronized output between children. - coproc cat - coproc_pid="$!" - # Insert token into coproc - print -n -p "t" - fi - - if (( do_eval )); then - shift cmd # Strip _async_eval from cmd. - _async_eval $cmd - else - # Run job in background, completed jobs are printed to stdout. - _async_job $cmd & - # Store pid because zsh job manager is extremely unflexible (show jobname as non-unique '$job')... - storage[$job]="$!" - fi - - processing=0 # Disable guard. - - if (( do_eval )); then - do_eval=0 - - # When there are no active jobs we can't rely on the CHLD trap to - # manage the coproc lifetime. - close_idle_coproc - fi - done -} - -# -# Get results from finished jobs and pass it to the to callback function. This is the only way to reliably return the -# job name, return code, output and execution time and with minimal effort. -# -# If the async process buffer becomes corrupt, the callback will be invoked with the first argument being `[async]` (job -# name), non-zero return code and fifth argument describing the error (stderr). -# -# usage: -# async_process_results -# -# callback_function is called with the following parameters: -# $1 = job name, e.g. the function passed to async_job -# $2 = return code -# $3 = resulting stdout from execution -# $4 = execution time, floating point e.g. 2.05 seconds -# $5 = resulting stderr from execution -# $6 = has next result in buffer (0 = buffer empty, 1 = yes) -# -async_process_results() { - setopt localoptions unset noshwordsplit noksharrays noposixidentifiers noposixstrings - - local worker=$1 - local callback=$2 - local caller=$3 - local -a items - local null=$'\0' data - integer -l len pos num_processed has_next - - typeset -gA ASYNC_PROCESS_BUFFER - - # Read output from zpty and parse it if available. - while zpty -r -t $worker data 2>/dev/null; do - ASYNC_PROCESS_BUFFER[$worker]+=$data - len=${#ASYNC_PROCESS_BUFFER[$worker]} - pos=${ASYNC_PROCESS_BUFFER[$worker][(i)$null]} # Get index of NULL-character (delimiter). - - # Keep going until we find a NULL-character. - if (( ! len )) || (( pos > len )); then - continue - fi - - while (( pos <= len )); do - # Take the content from the beginning, until the NULL-character and - # perform shell parsing (z) and unquoting (Q) as an array (@). - items=("${(@Q)${(z)ASYNC_PROCESS_BUFFER[$worker][1,$pos-1]}}") - - # Remove the extracted items from the buffer. - ASYNC_PROCESS_BUFFER[$worker]=${ASYNC_PROCESS_BUFFER[$worker][$pos+1,$len]} - - len=${#ASYNC_PROCESS_BUFFER[$worker]} - if (( len > 1 )); then - pos=${ASYNC_PROCESS_BUFFER[$worker][(i)$null]} # Get index of NULL-character (delimiter). - fi - - has_next=$(( len != 0 )) - if (( $#items == 5 )); then - items+=($has_next) - $callback "${(@)items}" # Send all parsed items to the callback. - (( num_processed++ )) - elif [[ -z $items ]]; then - # Empty items occur between results due to double-null ($'\0\0') - # caused by commands being both pre and suffixed with null. - else - # In case of corrupt data, invoke callback with *async* as job - # name, non-zero exit status and an error message on stderr. - $callback "[async]" 1 "" 0 "$0:$LINENO: error: bad format, got ${#items} items (${(q)items})" $has_next - fi - done - done - - (( num_processed )) && return 0 - - # Avoid printing exit value when `setopt printexitvalue` is active.` - [[ $caller = trap || $caller = watcher ]] && return 0 - - # No results were processed - return 1 -} - -# Watch worker for output -_async_zle_watcher() { - setopt localoptions noshwordsplit - typeset -gA ASYNC_PTYS ASYNC_CALLBACKS - local worker=$ASYNC_PTYS[$1] - local callback=$ASYNC_CALLBACKS[$worker] - - if [[ -n $2 ]]; then - # from man zshzle(1): - # `hup' for a disconnect, `nval' for a closed or otherwise - # invalid descriptor, or `err' for any other condition. - # Systems that support only the `select' system call always use - # `err'. - - # this has the side effect to unregister the broken file descriptor - async_stop_worker $worker - - if [[ -n $callback ]]; then - $callback '[async]' 2 "" 0 "$0:$LINENO: error: fd for $worker failed: zle -F $1 returned error $2" 0 - fi - return - fi; - - if [[ -n $callback ]]; then - async_process_results $worker $callback watcher - fi -} - -_async_send_job() { - setopt localoptions noshwordsplit noksharrays noposixidentifiers noposixstrings - - local caller=$1 - local worker=$2 - shift 2 - - zpty -t $worker &>/dev/null || { - typeset -gA ASYNC_CALLBACKS - local callback=$ASYNC_CALLBACKS[$worker] - - if [[ -n $callback ]]; then - $callback '[async]' 3 "" 0 "$0:$LINENO: error: no such worker: $worker" 0 - else - print -u2 "$caller: no such async worker: $worker" - fi - return 1 - } - - zpty -w $worker "$@"$'\0' -} - -# -# Start a new asynchronous job on specified worker, assumes the worker is running. -# -# usage: -# async_job [] -# -async_job() { - setopt localoptions noshwordsplit noksharrays noposixidentifiers noposixstrings - - local worker=$1; shift - - local -a cmd - cmd=("$@") - if (( $#cmd > 1 )); then - cmd=(${(q)cmd}) # Quote special characters in multi argument commands. - fi - - _async_send_job $0 $worker "$cmd" -} - -# -# Evaluate a command (like async_job) inside the async worker, then worker environment can be manipulated. For example, -# issuing a cd command will change the PWD of the worker which will then be inherited by all future async jobs. -# -# Output will be returned via callback, job name will be [async/eval]. -# -# usage: -# async_worker_eval [] -# -async_worker_eval() { - setopt localoptions noshwordsplit noksharrays noposixidentifiers noposixstrings - - local worker=$1; shift - - local -a cmd - cmd=("$@") - if (( $#cmd > 1 )); then - cmd=(${(q)cmd}) # Quote special characters in multi argument commands. - fi - - # Quote the cmd in case RC_EXPAND_PARAM is set. - _async_send_job $0 $worker "_async_eval $cmd" -} - -# This function traps notification signals and calls all registered callbacks -_async_notify_trap() { - setopt localoptions noshwordsplit - - local k - for k in ${(k)ASYNC_CALLBACKS}; do - async_process_results $k ${ASYNC_CALLBACKS[$k]} trap - done -} - -# -# Register a callback for completed jobs. As soon as a job is finnished, async_process_results will be called with the -# specified callback function. This requires that a worker is initialized with the -n (notify) option. -# -# usage: -# async_register_callback -# -async_register_callback() { - setopt localoptions noshwordsplit nolocaltraps - - typeset -gA ASYNC_PTYS ASYNC_CALLBACKS - local worker=$1; shift - - ASYNC_CALLBACKS[$worker]="$*" - - # Enable trap when the ZLE watcher is unavailable, allows - # workers to notify (via -n) when a job is done. - if [[ ! -o interactive ]] || [[ ! -o zle ]]; then - trap '_async_notify_trap' WINCH - elif [[ -o interactive ]] && [[ -o zle ]]; then - local fd w - for fd w in ${(@kv)ASYNC_PTYS}; do - if [[ $w == $worker ]]; then - zle -F $fd _async_zle_watcher # Register the ZLE handler. - break - fi - done - fi -} - -# -# Unregister the callback for a specific worker. -# -# usage: -# async_unregister_callback -# -async_unregister_callback() { - typeset -gA ASYNC_CALLBACKS - - unset "ASYNC_CALLBACKS[$1]" -} - -# -# Flush all current jobs running on a worker. This will terminate any and all running processes under the worker, use -# with caution. -# -# usage: -# async_flush_jobs -# -async_flush_jobs() { - setopt localoptions noshwordsplit - - local worker=$1; shift - - # Check if the worker exists - zpty -t $worker &>/dev/null || return 1 - - # Send kill command to worker - async_job $worker "_killjobs" - - # Clear the zpty buffer. - local junk - if zpty -r -t $worker junk '*'; then - (( ASYNC_DEBUG )) && print -n "async_flush_jobs $worker: ${(V)junk}" - while zpty -r -t $worker junk '*'; do - (( ASYNC_DEBUG )) && print -n "${(V)junk}" - done - (( ASYNC_DEBUG )) && print - fi - - # Finally, clear the process buffer in case of partially parsed responses. - typeset -gA ASYNC_PROCESS_BUFFER - unset "ASYNC_PROCESS_BUFFER[$worker]" -} - -# -# Start a new async worker with optional parameters, a worker can be told to only run unique tasks and to notify a -# process when tasks are complete. -# -# usage: -# async_start_worker [-u] [-n] [-p ] -# -# opts: -# -u unique (only unique job names can run) -# -n notify through SIGWINCH signal -# -p pid to notify (defaults to current pid) -# -async_start_worker() { - setopt localoptions noshwordsplit noclobber - - local worker=$1; shift - local -a args - args=("$@") - zpty -t $worker &>/dev/null && return - - typeset -gA ASYNC_PTYS - typeset -h REPLY - typeset has_xtrace=0 - - if [[ -o interactive ]] && [[ -o zle ]]; then - # Inform the worker to ignore the notify flag and that we're - # using a ZLE watcher instead. - args+=(-z) - - if (( ! ASYNC_ZPTY_RETURNS_FD )); then - # When zpty doesn't return a file descriptor (on older versions of zsh) - # we try to guess it anyway. - integer -l zptyfd - exec {zptyfd}>&1 # Open a new file descriptor (above 10). - exec {zptyfd}>&- # Close it so it's free to be used by zpty. - fi - fi - - # Workaround for stderr in the main shell sometimes (incorrectly) being - # reassigned to /dev/null by the reassignment done inside the async - # worker. - # See https://github.com/mafredri/zsh-async/issues/35. - integer errfd=-1 - exec {errfd}>&2 - - # Make sure async worker is started without xtrace - # (the trace output interferes with the worker). - [[ -o xtrace ]] && { - has_xtrace=1 - unsetopt xtrace - } - - zpty -b $worker _async_worker -p $$ $args 2>&$errfd - local ret=$? - - # Re-enable it if it was enabled, for debugging. - (( has_xtrace )) && setopt xtrace - exec {errfd}>& - - - if (( ret )); then - async_stop_worker $worker - return 1 - fi - - if ! is-at-least 5.0.8; then - # For ZSH versions older than 5.0.8 we delay a bit to give - # time for the worker to start before issuing commands, - # otherwise it will not be ready to receive them. - sleep 0.001 - fi - - if [[ -o interactive ]] && [[ -o zle ]]; then - if (( ! ASYNC_ZPTY_RETURNS_FD )); then - REPLY=$zptyfd # Use the guessed value for the file desciptor. - fi - - ASYNC_PTYS[$REPLY]=$worker # Map the file desciptor to the worker. - fi -} - -# -# Stop one or multiple workers that are running, all unfetched and incomplete work will be lost. -# -# usage: -# async_stop_worker [] -# -async_stop_worker() { - setopt localoptions noshwordsplit - - local ret=0 worker k v - for worker in $@; do - # Find and unregister the zle handler for the worker - for k v in ${(@kv)ASYNC_PTYS}; do - if [[ $v == $worker ]]; then - zle -F $k - unset "ASYNC_PTYS[$k]" - fi - done - async_unregister_callback $worker - zpty -d $worker 2>/dev/null || ret=$? - - # Clear any partial buffers. - typeset -gA ASYNC_PROCESS_BUFFER - unset "ASYNC_PROCESS_BUFFER[$worker]" - done - - return $ret -} - -# -# Initialize the required modules for zsh-async. To be called before using the zsh-async library. -# -# usage: -# async_init -# -async_init() { - (( ASYNC_INIT_DONE )) && return - typeset -g ASYNC_INIT_DONE=1 - - zmodload zsh/zpty - zmodload zsh/datetime - - # Load is-at-least for reliable version check. - autoload -Uz is-at-least - - # Check if zsh/zpty returns a file descriptor or not, - # shell must also be interactive with zle enabled. - typeset -g ASYNC_ZPTY_RETURNS_FD=0 - [[ -o interactive ]] && [[ -o zle ]] && { - typeset -h REPLY - zpty _async_test : - (( REPLY )) && ASYNC_ZPTY_RETURNS_FD=1 - zpty -d _async_test - } -} - -async() { - async_init -} - -async "$@" diff --git a/zsh/.zsh/pure/license b/zsh/.zsh/pure/license deleted file mode 100755 index e7af2f7..0000000 --- a/zsh/.zsh/pure/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/zsh/.zsh/pure/package.json b/zsh/.zsh/pure/package.json deleted file mode 100755 index 2c596b5..0000000 --- a/zsh/.zsh/pure/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "pure-prompt", - "version": "1.14.0", - "description": "Pretty, minimal and fast ZSH prompt", - "license": "MIT", - "repository": "sindresorhus/pure", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "maintainers": [ - { - "name": "Mathias Fredriksson", - "url": "https://github.com/mafredri" - } - ], - "scripts": { - "postinstall": "PURE_DEST=/usr/local/share/zsh/site-functions npm run --silent postinstall-link && exit 0; PURE_DEST=\"$PWD/functions\" npm run postinstall-link && npm run postinstall-fail-instructions", - "postinstall-link": "mkdir -p \"$PURE_DEST\" && ln -sf \"$PWD/pure.zsh\" \"$PURE_DEST/prompt_pure_setup\" && ln -sf \"$PWD/async.zsh\" \"$PURE_DEST/async\"", - "postinstall-fail-instructions": "echo \"ERROR: Could not automagically symlink the prompt. Either:\\n1. Check out the readme on how to do it manually: https://github.com/sindresorhus/pure#manually\\n2. Or add the following to your \\`.zshrc\\`:\\n\\n fpath+=('$PWD/functions')\"", - "version": "sed -i '' -e 's/prompt_pure_state\\[version\\]=.*/prompt_pure_state[version]=\"'\"$npm_package_version\"'\"/' pure.zsh" - }, - "files": [ - "pure.zsh", - "async.zsh" - ], - "keywords": [ - "zsh", - "zshell", - "sh", - "shell", - "bash", - "pure", - "prompt", - "theme", - "git", - "async", - "fast", - "minimal", - "pretty" - ] -} diff --git a/zsh/.zsh/pure/pure.zsh b/zsh/.zsh/pure/pure.zsh deleted file mode 100755 index 6ba2ebc..0000000 --- a/zsh/.zsh/pure/pure.zsh +++ /dev/null @@ -1,864 +0,0 @@ -# Pure -# by Sindre Sorhus -# https://github.com/sindresorhus/pure -# MIT License - -# For my own and others sanity -# git: -# %b => current branch -# %a => current action (rebase/merge) -# prompt: -# %F => color dict -# %f => reset color -# %~ => current path -# %* => time -# %n => username -# %m => shortname host -# %(?..) => prompt conditional - %(condition.true.false) -# terminal codes: -# \e7 => save cursor position -# \e[2A => move cursor 2 lines up -# \e[1G => go to position 1 in terminal -# \e8 => restore cursor position -# \e[K => clears everything after the cursor on the current line -# \e[2K => clear everything on the current line - - -# Turns seconds into human readable time. -# 165392 => 1d 21h 56m 32s -# https://github.com/sindresorhus/pretty-time-zsh -prompt_pure_human_time_to_var() { - local human total_seconds=$1 var=$2 - local days=$(( total_seconds / 60 / 60 / 24 )) - local hours=$(( total_seconds / 60 / 60 % 24 )) - local minutes=$(( total_seconds / 60 % 60 )) - local seconds=$(( total_seconds % 60 )) - (( days > 0 )) && human+="${days}d " - (( hours > 0 )) && human+="${hours}h " - (( minutes > 0 )) && human+="${minutes}m " - human+="${seconds}s" - - # Store human readable time in a variable as specified by the caller - typeset -g "${var}"="${human}" -} - -# Stores (into prompt_pure_cmd_exec_time) the execution -# time of the last command if set threshold was exceeded. -prompt_pure_check_cmd_exec_time() { - integer elapsed - (( elapsed = EPOCHSECONDS - ${prompt_pure_cmd_timestamp:-$EPOCHSECONDS} )) - typeset -g prompt_pure_cmd_exec_time= - (( elapsed > ${PURE_CMD_MAX_EXEC_TIME:-5} )) && { - prompt_pure_human_time_to_var $elapsed "prompt_pure_cmd_exec_time" - } -} - -prompt_pure_set_title() { - setopt localoptions noshwordsplit - - # Emacs terminal does not support settings the title. - (( ${+EMACS} || ${+INSIDE_EMACS} )) && return - - case $TTY in - # Don't set title over serial console. - /dev/ttyS[0-9]*) return;; - esac - - # Show hostname if connected via SSH. - local hostname= - if [[ -n $prompt_pure_state[username] ]]; then - # Expand in-place in case ignore-escape is used. - hostname="${(%):-(%m) }" - fi - - local -a opts - case $1 in - expand-prompt) opts=(-P);; - ignore-escape) opts=(-r);; - esac - - # Set title atomically in one print statement so that it works when XTRACE is enabled. - print -n $opts $'\e]0;'${hostname}${2}$'\a' -} - -prompt_pure_preexec() { - if [[ -n $prompt_pure_git_fetch_pattern ]]; then - # Detect when Git is performing pull/fetch, including Git aliases. - local -H MATCH MBEGIN MEND match mbegin mend - if [[ $2 =~ (git|hub)\ (.*\ )?($prompt_pure_git_fetch_pattern)(\ .*)?$ ]]; then - # We must flush the async jobs to cancel our git fetch in order - # to avoid conflicts with the user issued pull / fetch. - async_flush_jobs 'prompt_pure' - fi - fi - - typeset -g prompt_pure_cmd_timestamp=$EPOCHSECONDS - - # Shows the current directory and executed command in the title while a process is active. - prompt_pure_set_title 'ignore-escape' "$PWD:t: $2" - - # Disallow Python virtualenv from updating the prompt. Set it to 12 if - # untouched by the user to indicate that Pure modified it. Here we use - # the magic number 12, same as in `psvar`. - export VIRTUAL_ENV_DISABLE_PROMPT=${VIRTUAL_ENV_DISABLE_PROMPT:-12} -} - -# Change the colors if their value are different from the current ones. -prompt_pure_set_colors() { - local color_temp key value - for key value in ${(kv)prompt_pure_colors}; do - zstyle -t ":prompt:pure:$key" color "$value" - case $? in - 1) # The current style is different from the one from zstyle. - zstyle -s ":prompt:pure:$key" color color_temp - prompt_pure_colors[$key]=$color_temp ;; - 2) # No style is defined. - prompt_pure_colors[$key]=$prompt_pure_colors_default[$key] ;; - esac - done -} - -prompt_pure_preprompt_render() { - setopt localoptions noshwordsplit - - unset prompt_pure_async_render_requested - - # Set color for Git branch/dirty status and change color if dirty checking has been delayed. - local git_color=$prompt_pure_colors[git:branch] - local git_dirty_color=$prompt_pure_colors[git:dirty] - [[ -n ${prompt_pure_git_last_dirty_check_timestamp+x} ]] && git_color=$prompt_pure_colors[git:branch:cached] - - # Initialize the preprompt array. - local -a preprompt_parts - - # Username and machine, if applicable. - [[ -n $prompt_pure_state[username] ]] && preprompt_parts+=($prompt_pure_state[username]) - - # Set the path. - preprompt_parts+=('%F{${prompt_pure_colors[path]}}%~%f') - - # Git branch and dirty status info. - typeset -gA prompt_pure_vcs_info - if [[ -n $prompt_pure_vcs_info[branch] ]]; then - preprompt_parts+=("%F{$git_color}"'${prompt_pure_vcs_info[branch]}'"%F{$git_dirty_color}"'${prompt_pure_git_dirty}%f') - fi - # Git action (for example, merge). - if [[ -n $prompt_pure_vcs_info[action] ]]; then - preprompt_parts+=("%F{$prompt_pure_colors[git:action]}"'$prompt_pure_vcs_info[action]%f') - fi - # Git pull/push arrows. - if [[ -n $prompt_pure_git_arrows ]]; then - preprompt_parts+=('%F{$prompt_pure_colors[git:arrow]}${prompt_pure_git_arrows}%f') - fi - # Git stash symbol (if opted in). - if [[ -n $prompt_pure_git_stash ]]; then - preprompt_parts+=('%F{$prompt_pure_colors[git:stash]}${PURE_GIT_STASH_SYMBOL:-≡}%f') - fi - - # Execution time. - [[ -n $prompt_pure_cmd_exec_time ]] && preprompt_parts+=('%F{$prompt_pure_colors[execution_time]}${prompt_pure_cmd_exec_time}%f') - - local cleaned_ps1=$PROMPT - local -H MATCH MBEGIN MEND - if [[ $PROMPT = *$prompt_newline* ]]; then - # Remove everything from the prompt until the newline. This - # removes the preprompt and only the original PROMPT remains. - cleaned_ps1=${PROMPT##*${prompt_newline}} - fi - unset MATCH MBEGIN MEND - - # Construct the new prompt with a clean preprompt. - local -ah ps1 - ps1=( - ${(j. .)preprompt_parts} # Join parts, space separated. - $prompt_newline # Separate preprompt and prompt. - $cleaned_ps1 - ) - - PROMPT="${(j..)ps1}" - - # Expand the prompt for future comparision. - local expanded_prompt - expanded_prompt="${(S%%)PROMPT}" - - if [[ $1 == precmd ]]; then - # Initial newline, for spaciousness. - print - elif [[ $prompt_pure_last_prompt != $expanded_prompt ]]; then - # Redraw the prompt. - prompt_pure_reset_prompt - fi - - typeset -g prompt_pure_last_prompt=$expanded_prompt -} - -prompt_pure_precmd() { - setopt localoptions noshwordsplit - - # Check execution time and store it in a variable. - prompt_pure_check_cmd_exec_time - unset prompt_pure_cmd_timestamp - - # Shows the full path in the title. - prompt_pure_set_title 'expand-prompt' '%~' - - # Modify the colors if some have changed.. - prompt_pure_set_colors - - # Perform async Git dirty check and fetch. - prompt_pure_async_tasks - - # Check if we should display the virtual env. We use a sufficiently high - # index of psvar (12) here to avoid collisions with user defined entries. - psvar[12]= - # Check if a Conda environment is active and display its name. - if [[ -n $CONDA_DEFAULT_ENV ]]; then - psvar[12]="${CONDA_DEFAULT_ENV//[$'\t\r\n']}" - fi - # When VIRTUAL_ENV_DISABLE_PROMPT is empty, it was unset by the user and - # Pure should take back control. - if [[ -n $VIRTUAL_ENV ]] && [[ -z $VIRTUAL_ENV_DISABLE_PROMPT || $VIRTUAL_ENV_DISABLE_PROMPT = 12 ]]; then - psvar[12]="${VIRTUAL_ENV:t}" - export VIRTUAL_ENV_DISABLE_PROMPT=12 - fi - - # Make sure VIM prompt is reset. - prompt_pure_reset_prompt_symbol - - # Print the preprompt. - prompt_pure_preprompt_render "precmd" - - if [[ -n $ZSH_THEME ]]; then - print "WARNING: Oh My Zsh themes are enabled (ZSH_THEME='${ZSH_THEME}'). Pure might not be working correctly." - print "For more information, see: https://github.com/sindresorhus/pure#oh-my-zsh" - unset ZSH_THEME # Only show this warning once. - fi -} - -prompt_pure_async_git_aliases() { - setopt localoptions noshwordsplit - local -a gitalias pullalias - - # List all aliases and split on newline. - gitalias=(${(@f)"$(command git config --get-regexp "^alias\.")"}) - for line in $gitalias; do - parts=(${(@)=line}) # Split line on spaces. - aliasname=${parts[1]#alias.} # Grab the name (alias.[name]). - shift parts # Remove `aliasname` - - # Check alias for pull or fetch. Must be exact match. - if [[ $parts =~ ^(.*\ )?(pull|fetch)(\ .*)?$ ]]; then - pullalias+=($aliasname) - fi - done - - print -- ${(j:|:)pullalias} # Join on pipe, for use in regex. -} - -prompt_pure_async_vcs_info() { - setopt localoptions noshwordsplit - - # Configure `vcs_info` inside an async task. This frees up `vcs_info` - # to be used or configured as the user pleases. - zstyle ':vcs_info:*' enable git - zstyle ':vcs_info:*' use-simple true - # Only export four message variables from `vcs_info`. - zstyle ':vcs_info:*' max-exports 3 - # Export branch (%b), Git toplevel (%R), action (rebase/cherry-pick) (%a) - zstyle ':vcs_info:git*' formats '%b' '%R' '%a' - zstyle ':vcs_info:git*' actionformats '%b' '%R' '%a' - - vcs_info - - local -A info - info[pwd]=$PWD - info[branch]=$vcs_info_msg_0_ - info[top]=$vcs_info_msg_1_ - info[action]=$vcs_info_msg_2_ - - print -r - ${(@kvq)info} -} - -# Fastest possible way to check if a Git repo is dirty. -prompt_pure_async_git_dirty() { - setopt localoptions noshwordsplit - local untracked_dirty=$1 - local untracked_git_mode=$(command git config --get status.showUntrackedFiles) - if [[ "$untracked_git_mode" != 'no' ]]; then - untracked_git_mode='normal' - fi - - if [[ $untracked_dirty = 0 ]]; then - command git diff --no-ext-diff --quiet --exit-code - else - test -z "$(GIT_OPTIONAL_LOCKS=0 command git status --porcelain --ignore-submodules -u${untracked_git_mode})" - fi - - return $? -} - -prompt_pure_async_git_fetch() { - setopt localoptions noshwordsplit - - # Sets `GIT_TERMINAL_PROMPT=0` to disable authentication prompt for Git fetch (Git 2.3+). - export GIT_TERMINAL_PROMPT=0 - # Set SSH `BachMode` to disable all interactive SSH password prompting. - export GIT_SSH_COMMAND="${GIT_SSH_COMMAND:-"ssh"} -o BatchMode=yes" - - local ref - ref=$(command git symbolic-ref -q HEAD) - local -a remote - remote=($(command git for-each-ref --format='%(upstream:remotename) %(refname)' $ref)) - - if [[ -z $remote[1] ]]; then - # No remote specified for this branch, skip fetch. - return 97 - fi - - # Default return code, which indicates Git fetch failure. - local fail_code=99 - - # Guard against all forms of password prompts. By setting the shell into - # MONITOR mode we can notice when a child process prompts for user input - # because it will be suspended. Since we are inside an async worker, we - # have no way of transmitting the password and the only option is to - # kill it. If we don't do it this way, the process will corrupt with the - # async worker. - setopt localtraps monitor - - # Make sure local HUP trap is unset to allow for signal propagation when - # the async worker is flushed. - trap - HUP - - trap ' - # Unset trap to prevent infinite loop - trap - CHLD - if [[ $jobstates = suspended* ]]; then - # Set fail code to password prompt and kill the fetch. - fail_code=98 - kill %% - fi - ' CHLD - - # Only fetch information for the current branch and avoid - # fetching tags or submodules to speed up the process. - command git -c gc.auto=0 fetch \ - --quiet \ - --no-tags \ - --recurse-submodules=no \ - $remote &>/dev/null & - wait $! || return $fail_code - - unsetopt monitor - - # Check arrow status after a successful `git fetch`. - prompt_pure_async_git_arrows -} - -prompt_pure_async_git_arrows() { - setopt localoptions noshwordsplit - command git rev-list --left-right --count HEAD...@'{u}' -} - -prompt_pure_async_git_stash() { - git rev-list --walk-reflogs --count refs/stash -} - -# Try to lower the priority of the worker so that disk heavy operations -# like `git status` has less impact on the system responsivity. -prompt_pure_async_renice() { - setopt localoptions noshwordsplit - - if command -v renice >/dev/null; then - command renice +15 -p $$ - fi - - if command -v ionice >/dev/null; then - command ionice -c 3 -p $$ - fi -} - -prompt_pure_async_init() { - typeset -g prompt_pure_async_inited - if ((${prompt_pure_async_inited:-0})); then - return - fi - prompt_pure_async_inited=1 - async_start_worker "prompt_pure" -u -n - async_register_callback "prompt_pure" prompt_pure_async_callback - async_worker_eval "prompt_pure" prompt_pure_async_renice -} - -prompt_pure_async_tasks() { - setopt localoptions noshwordsplit - - # Initialize the async worker. - prompt_pure_async_init - - # Update the current working directory of the async worker. - async_worker_eval "prompt_pure" builtin cd -q $PWD - - typeset -gA prompt_pure_vcs_info - - local -H MATCH MBEGIN MEND - if [[ $PWD != ${prompt_pure_vcs_info[pwd]}* ]]; then - # Stop any running async jobs. - async_flush_jobs "prompt_pure" - - # Reset Git preprompt variables, switching working tree. - unset prompt_pure_git_dirty - unset prompt_pure_git_last_dirty_check_timestamp - unset prompt_pure_git_arrows - unset prompt_pure_git_stash - unset prompt_pure_git_fetch_pattern - prompt_pure_vcs_info[branch]= - prompt_pure_vcs_info[top]= - fi - unset MATCH MBEGIN MEND - - async_job "prompt_pure" prompt_pure_async_vcs_info - - # Only perform tasks inside a Git working tree. - [[ -n $prompt_pure_vcs_info[top] ]] || return - - prompt_pure_async_refresh -} - -prompt_pure_async_refresh() { - setopt localoptions noshwordsplit - - if [[ -z $prompt_pure_git_fetch_pattern ]]; then - # We set the pattern here to avoid redoing the pattern check until the - # working tree has changed. Pull and fetch are always valid patterns. - typeset -g prompt_pure_git_fetch_pattern="pull|fetch" - async_job "prompt_pure" prompt_pure_async_git_aliases - fi - - async_job "prompt_pure" prompt_pure_async_git_arrows - - # Do not perform `git fetch` if it is disabled or in home folder. - if (( ${PURE_GIT_PULL:-1} )) && [[ $prompt_pure_vcs_info[top] != $HOME ]]; then - # Tell the async worker to do a `git fetch`. - async_job "prompt_pure" prompt_pure_async_git_fetch - fi - - # If dirty checking is sufficiently fast, - # tell the worker to check it again, or wait for timeout. - integer time_since_last_dirty_check=$(( EPOCHSECONDS - ${prompt_pure_git_last_dirty_check_timestamp:-0} )) - if (( time_since_last_dirty_check > ${PURE_GIT_DELAY_DIRTY_CHECK:-1800} )); then - unset prompt_pure_git_last_dirty_check_timestamp - # Check check if there is anything to pull. - async_job "prompt_pure" prompt_pure_async_git_dirty ${PURE_GIT_UNTRACKED_DIRTY:-1} - fi - - # If stash is enabled, tell async worker to count stashes - if zstyle -t ":prompt:pure:git:stash" show; then - async_job "prompt_pure" prompt_pure_async_git_stash - else - unset prompt_pure_git_stash - fi -} - -prompt_pure_check_git_arrows() { - setopt localoptions noshwordsplit - local arrows left=${1:-0} right=${2:-0} - - (( right > 0 )) && arrows+=${PURE_GIT_DOWN_ARROW:-⇣} - (( left > 0 )) && arrows+=${PURE_GIT_UP_ARROW:-⇡} - - [[ -n $arrows ]] || return - typeset -g REPLY=$arrows -} - -prompt_pure_async_callback() { - setopt localoptions noshwordsplit - local job=$1 code=$2 output=$3 exec_time=$4 next_pending=$6 - local do_render=0 - - case $job in - \[async]) - # Handle all the errors that could indicate a crashed - # async worker. See zsh-async documentation for the - # definition of the exit codes. - if (( code == 2 )) || (( code == 3 )) || (( code == 130 )); then - # Our worker died unexpectedly, try to recover immediately. - # TODO(mafredri): Do we need to handle next_pending - # and defer the restart? - typeset -g prompt_pure_async_inited=0 - async_stop_worker prompt_pure - prompt_pure_async_init # Reinit the worker. - prompt_pure_async_tasks # Restart all tasks. - - # Reset render state due to restart. - unset prompt_pure_async_render_requested - fi - ;; - \[async/eval]) - if (( code )); then - # Looks like async_worker_eval failed, - # rerun async tasks just in case. - prompt_pure_async_tasks - fi - ;; - prompt_pure_async_vcs_info) - local -A info - typeset -gA prompt_pure_vcs_info - - # Parse output (z) and unquote as array (Q@). - info=("${(Q@)${(z)output}}") - local -H MATCH MBEGIN MEND - if [[ $info[pwd] != $PWD ]]; then - # The path has changed since the check started, abort. - return - fi - # Check if Git top-level has changed. - if [[ $info[top] = $prompt_pure_vcs_info[top] ]]; then - # If the stored pwd is part of $PWD, $PWD is shorter and likelier - # to be top-level, so we update pwd. - if [[ $prompt_pure_vcs_info[pwd] = ${PWD}* ]]; then - prompt_pure_vcs_info[pwd]=$PWD - fi - else - # Store $PWD to detect if we (maybe) left the Git path. - prompt_pure_vcs_info[pwd]=$PWD - fi - unset MATCH MBEGIN MEND - - # The update has a Git top-level set, which means we just entered a new - # Git directory. Run the async refresh tasks. - [[ -n $info[top] ]] && [[ -z $prompt_pure_vcs_info[top] ]] && prompt_pure_async_refresh - - # Always update branch, top-level and stash. - prompt_pure_vcs_info[branch]=$info[branch] - prompt_pure_vcs_info[top]=$info[top] - prompt_pure_vcs_info[action]=$info[action] - - do_render=1 - ;; - prompt_pure_async_git_aliases) - if [[ -n $output ]]; then - # Append custom Git aliases to the predefined ones. - prompt_pure_git_fetch_pattern+="|$output" - fi - ;; - prompt_pure_async_git_dirty) - local prev_dirty=$prompt_pure_git_dirty - if (( code == 0 )); then - unset prompt_pure_git_dirty - else - typeset -g prompt_pure_git_dirty="*" - fi - - [[ $prev_dirty != $prompt_pure_git_dirty ]] && do_render=1 - - # When `prompt_pure_git_last_dirty_check_timestamp` is set, the Git info is displayed - # in a different color. To distinguish between a "fresh" and a "cached" result, the - # preprompt is rendered before setting this variable. Thus, only upon the next - # rendering of the preprompt will the result appear in a different color. - (( $exec_time > 5 )) && prompt_pure_git_last_dirty_check_timestamp=$EPOCHSECONDS - ;; - prompt_pure_async_git_fetch|prompt_pure_async_git_arrows) - # `prompt_pure_async_git_fetch` executes `prompt_pure_async_git_arrows` - # after a successful fetch. - case $code in - 0) - local REPLY - prompt_pure_check_git_arrows ${(ps:\t:)output} - if [[ $prompt_pure_git_arrows != $REPLY ]]; then - typeset -g prompt_pure_git_arrows=$REPLY - do_render=1 - fi - ;; - 97) - # No remote available, make sure to clear git arrows if set. - if [[ -n $prompt_pure_git_arrows ]]; then - typeset -g prompt_pure_git_arrows= - do_render=1 - fi - ;; - 99|98) - # Git fetch failed. - ;; - *) - # Non-zero exit status from `prompt_pure_async_git_arrows`, - # indicating that there is no upstream configured. - if [[ -n $prompt_pure_git_arrows ]]; then - unset prompt_pure_git_arrows - do_render=1 - fi - ;; - esac - ;; - prompt_pure_async_git_stash) - local prev_stash=$prompt_pure_git_stash - typeset -g prompt_pure_git_stash=$output - [[ $prev_stash != $prompt_pure_git_stash ]] && do_render=1 - ;; - esac - - if (( next_pending )); then - (( do_render )) && typeset -g prompt_pure_async_render_requested=1 - return - fi - - [[ ${prompt_pure_async_render_requested:-$do_render} = 1 ]] && prompt_pure_preprompt_render - unset prompt_pure_async_render_requested -} - -prompt_pure_reset_prompt() { - if [[ $CONTEXT == cont ]]; then - # When the context is "cont", PS2 is active and calling - # reset-prompt will have no effect on PS1, but it will - # reset the execution context (%_) of PS2 which we don't - # want. Unfortunately, we can't save the output of "%_" - # either because it is only ever rendered as part of the - # prompt, expanding in-place won't work. - return - fi - - zle && zle .reset-prompt -} - -prompt_pure_reset_prompt_symbol() { - prompt_pure_state[prompt]=${PURE_PROMPT_SYMBOL:-❯} -} - -prompt_pure_update_vim_prompt_widget() { - setopt localoptions noshwordsplit - prompt_pure_state[prompt]=${${KEYMAP/vicmd/${PURE_PROMPT_VICMD_SYMBOL:-❮}}/(main|viins)/${PURE_PROMPT_SYMBOL:-❯}} - - prompt_pure_reset_prompt -} - -prompt_pure_reset_vim_prompt_widget() { - setopt localoptions noshwordsplit - prompt_pure_reset_prompt_symbol - - # We can't perform a prompt reset at this point because it - # removes the prompt marks inserted by macOS Terminal. -} - -prompt_pure_state_setup() { - setopt localoptions noshwordsplit - - # Check SSH_CONNECTION and the current state. - local ssh_connection=${SSH_CONNECTION:-$PROMPT_PURE_SSH_CONNECTION} - local username hostname - if [[ -z $ssh_connection ]] && (( $+commands[who] )); then - # When changing user on a remote system, the $SSH_CONNECTION - # environment variable can be lost. Attempt detection via `who`. - local who_out - who_out=$(who -m 2>/dev/null) - if (( $? )); then - # Who am I not supported, fallback to plain who. - local -a who_in - who_in=( ${(f)"$(who 2>/dev/null)"} ) - who_out="${(M)who_in:#*[[:space:]]${TTY#/dev/}[[:space:]]*}" - fi - - local reIPv6='(([0-9a-fA-F]+:)|:){2,}[0-9a-fA-F]+' # Simplified, only checks partial pattern. - local reIPv4='([0-9]{1,3}\.){3}[0-9]+' # Simplified, allows invalid ranges. - # Here we assume two non-consecutive periods represents a - # hostname. This matches `foo.bar.baz`, but not `foo.bar`. - local reHostname='([.][^. ]+){2}' - - # Usually the remote address is surrounded by parenthesis, but - # not on all systems (e.g. busybox). - local -H MATCH MBEGIN MEND - if [[ $who_out =~ "\(?($reIPv4|$reIPv6|$reHostname)\)?\$" ]]; then - ssh_connection=$MATCH - - # Export variable to allow detection propagation inside - # shells spawned by this one (e.g. tmux does not always - # inherit the same tty, which breaks detection). - export PROMPT_PURE_SSH_CONNECTION=$ssh_connection - fi - unset MATCH MBEGIN MEND - fi - - hostname='%F{$prompt_pure_colors[host]}@%m%f' - # Show `username@host` if logged in through SSH. - [[ -n $ssh_connection ]] && username='%F{$prompt_pure_colors[user]}%n%f'"$hostname" - - # Show `username@host` if inside a container. - prompt_pure_is_inside_container && username='%F{$prompt_pure_colors[user]}%n%f'"$hostname" - - # Show `username@host` if root, with username in default color. - [[ $UID -eq 0 ]] && username='%F{$prompt_pure_colors[user:root]}%n%f'"$hostname" - - typeset -gA prompt_pure_state - prompt_pure_state[version]="1.13.0" - prompt_pure_state+=( - username "$username" - prompt "${PURE_PROMPT_SYMBOL:-❯}" - ) -} - -# Return true if executing inside a Docker or LXC container. -prompt_pure_is_inside_container() { - ([[ -r /proc/1/cgroup ]] && grep -q -E "(lxc|docker)" /proc/1/cgroup ) \ - || [[ "$container" == "lxc" ]] -} - -prompt_pure_system_report() { - setopt localoptions noshwordsplit - - local shell=$SHELL - if [[ -z $shell ]]; then - shell=$commands[zsh] - fi - print - "- Zsh: $($shell --version) ($shell)" - print -n - "- Operating system: " - case "$(uname -s)" in - Darwin) print "$(sw_vers -productName) $(sw_vers -productVersion) ($(sw_vers -buildVersion))";; - *) print "$(uname -s) ($(uname -r) $(uname -v) $(uname -m) $(uname -o))";; - esac - print - "- Terminal program: ${TERM_PROGRAM:-unknown} (${TERM_PROGRAM_VERSION:-unknown})" - print -n - "- Tmux: " - [[ -n $TMUX ]] && print "yes" || print "no" - - local git_version - git_version=($(git --version)) # Remove newlines, if hub is present. - print - "- Git: $git_version" - - print - "- Pure state:" - for k v in "${(@kv)prompt_pure_state}"; do - print - " - $k: \`${(q-)v}\`" - done - print - "- zsh-async version: \`${ASYNC_VERSION}\`" - print - "- PROMPT: \`$(typeset -p PROMPT)\`" - print - "- Colors: \`$(typeset -p prompt_pure_colors)\`" - print - "- TERM: \`$(typeset -p TERM)\`" - print - "- Virtualenv: \`$(typeset -p VIRTUAL_ENV_DISABLE_PROMPT)\`" - print - "- Conda: \`$(typeset -p CONDA_CHANGEPS1)\`" - - local ohmyzsh=0 - typeset -la frameworks - (( $+ANTIBODY_HOME )) && frameworks+=("Antibody") - (( $+ADOTDIR )) && frameworks+=("Antigen") - (( $+ANTIGEN_HS_HOME )) && frameworks+=("Antigen-hs") - (( $+functions[upgrade_oh_my_zsh] )) && { - ohmyzsh=1 - frameworks+=("Oh My Zsh") - } - (( $+ZPREZTODIR )) && frameworks+=("Prezto") - (( $+ZPLUG_ROOT )) && frameworks+=("Zplug") - (( $+ZPLGM )) && frameworks+=("Zplugin") - - (( $#frameworks == 0 )) && frameworks+=("None") - print - "- Detected frameworks: ${(j:, :)frameworks}" - - if (( ohmyzsh )); then - print - " - Oh My Zsh:" - print - " - Plugins: ${(j:, :)plugins}" - fi -} - -prompt_pure_setup() { - # Prevent percentage showing up if output doesn't end with a newline. - export PROMPT_EOL_MARK='' - - prompt_opts=(subst percent) - - # Borrowed from `promptinit`. Sets the prompt options in case Pure was not - # initialized via `promptinit`. - setopt noprompt{bang,cr,percent,subst} "prompt${^prompt_opts[@]}" - - if [[ -z $prompt_newline ]]; then - # This variable needs to be set, usually set by promptinit. - typeset -g prompt_newline=$'\n%{\r%}' - fi - - zmodload zsh/datetime - zmodload zsh/zle - zmodload zsh/parameter - zmodload zsh/zutil - - autoload -Uz add-zsh-hook - autoload -Uz vcs_info - autoload -Uz async && async - - # The `add-zle-hook-widget` function is not guaranteed to be available. - # It was added in Zsh 5.3. - autoload -Uz +X add-zle-hook-widget 2>/dev/null - - # Set the colors. - typeset -gA prompt_pure_colors_default prompt_pure_colors - prompt_pure_colors_default=( - execution_time yellow - git:arrow cyan - git:stash cyan - git:branch 242 - git:branch:cached red - git:action yellow - git:dirty 218 - host 242 - path blue - prompt:error red - prompt:success magenta - prompt:continuation 242 - user 242 - user:root default - virtualenv 242 - ) - prompt_pure_colors=("${(@kv)prompt_pure_colors_default}") - - add-zsh-hook precmd prompt_pure_precmd - add-zsh-hook preexec prompt_pure_preexec - - prompt_pure_state_setup - - zle -N prompt_pure_reset_prompt - zle -N prompt_pure_update_vim_prompt_widget - zle -N prompt_pure_reset_vim_prompt_widget - if (( $+functions[add-zle-hook-widget] )); then - add-zle-hook-widget zle-line-finish prompt_pure_reset_vim_prompt_widget - add-zle-hook-widget zle-keymap-select prompt_pure_update_vim_prompt_widget - fi - - # If a virtualenv is activated, display it in grey. - PROMPT='%(12V.%F{$prompt_pure_colors[virtualenv]}%12v%f .)' - - # Prompt turns red if the previous command didn't exit with 0. - local prompt_indicator='%(?.%F{$prompt_pure_colors[prompt:success]}.%F{$prompt_pure_colors[prompt:error]})${prompt_pure_state[prompt]}%f ' - PROMPT+=$prompt_indicator - - # Indicate continuation prompt by … and use a darker color for it. - PROMPT2='%F{$prompt_pure_colors[prompt:continuation]}… %(1_.%_ .%_)%f'$prompt_indicator - - # Store prompt expansion symbols for in-place expansion via (%). For - # some reason it does not work without storing them in a variable first. - typeset -ga prompt_pure_debug_depth - prompt_pure_debug_depth=('%e' '%N' '%x') - - # Compare is used to check if %N equals %x. When they differ, the main - # prompt is used to allow displaying both filename and function. When - # they match, we use the secondary prompt to avoid displaying duplicate - # information. - local -A ps4_parts - ps4_parts=( - depth '%F{yellow}${(l:${(%)prompt_pure_debug_depth[1]}::+:)}%f' - compare '${${(%)prompt_pure_debug_depth[2]}:#${(%)prompt_pure_debug_depth[3]}}' - main '%F{blue}${${(%)prompt_pure_debug_depth[3]}:t}%f%F{242}:%I%f %F{242}@%f%F{blue}%N%f%F{242}:%i%f' - secondary '%F{blue}%N%f%F{242}:%i' - prompt '%F{242}>%f ' - ) - # Combine the parts with conditional logic. First the `:+` operator is - # used to replace `compare` either with `main` or an ampty string. Then - # the `:-` operator is used so that if `compare` becomes an empty - # string, it is replaced with `secondary`. - local ps4_symbols='${${'${ps4_parts[compare]}':+"'${ps4_parts[main]}'"}:-"'${ps4_parts[secondary]}'"}' - - # Improve the debug prompt (PS4), show depth by repeating the +-sign and - # add colors to highlight essential parts like file and function name. - PROMPT4="${ps4_parts[depth]} ${ps4_symbols}${ps4_parts[prompt]}" - - # Guard against Oh My Zsh themes overriding Pure. - unset ZSH_THEME - - # Guard against (ana)conda changing the PS1 prompt - # (we manually insert the env when it's available). - export CONDA_CHANGEPS1=no -} - -prompt_pure_setup "$@" diff --git a/zsh/.zsh/pure/readme.md b/zsh/.zsh/pure/readme.md deleted file mode 100755 index 2cf2f27..0000000 --- a/zsh/.zsh/pure/readme.md +++ /dev/null @@ -1,277 +0,0 @@ -# Pure - -> Pretty, minimal and fast ZSH prompt - - - -
- ---- - - - ---- - -
- -## Overview - -Most prompts are cluttered, ugly and slow. We wanted something visually pleasing that stayed out of our way. - -### Why? - -- Comes with the perfect prompt character. - Author went through the whole Unicode range to find it. -- Shows `git` branch and whether it's dirty (with a `*`). -- Indicates when you have unpushed/unpulled `git` commits with up/down arrows. *(Check is done asynchronously!)* -- Prompt character turns red if the last command didn't exit with `0`. -- Command execution time will be displayed if it exceeds the set threshold. -- Username and host only displayed when in an SSH session or a container. -- Shows the current path in the title and the [current folder & command](screenshot-title-cmd.png) when a process is running. -- Support VI-mode indication by reverse prompt symbol (Zsh 5.3+). -- Makes an excellent starting point for your own custom prompt. - -## Install - -Can be installed with `npm` or manually. Requires Git 2.15.2+ and ZSH 5.2+. Older versions of ZSH are known to work, but they are **not** recommended. - -### npm - -```console -$ npm install --global pure-prompt -``` - -That's it. Skip to [Getting started](#getting-started). - -### Manually - -1. Clone this repo somewhere. Here we'll use `$HOME/.zsh/pure`. - -```sh -mkdir -p "$HOME/.zsh" -git clone https://github.com/sindresorhus/pure.git "$HOME/.zsh/pure" -``` - -2. Add the path of the cloned repo to `$fpath` in `$HOME/.zshrc`. -```sh -# .zshrc -fpath+=$HOME/.zsh/pure -``` - -## Getting started - -Initialize the prompt system (if not so already) and choose `pure`: - -```sh -# .zshrc -autoload -U promptinit; promptinit -prompt pure -``` - -## Options - -| Option | Description | Default value | -| :------------------------------- | :--------------------------------------------------------------------------------------------- | :------------- | -| **`PURE_CMD_MAX_EXEC_TIME`** | The max execution time of a process before its run time is shown when it exits. | `5` seconds | -| **`PURE_GIT_PULL=0`** | Prevents Pure from checking whether the current Git remote has been updated. | | -| **`PURE_GIT_UNTRACKED_DIRTY=0`** | Do not include untracked files in dirtiness check. Mostly useful on large repos (like WebKit). | | -| **`PURE_GIT_DELAY_DIRTY_CHECK`** | Time in seconds to delay git dirty checking when `git status` takes > 5 seconds. | `1800` seconds | -| **`PURE_PROMPT_SYMBOL`** | Defines the prompt symbol. | `❯` | -| **`PURE_PROMPT_VICMD_SYMBOL`** | Defines the prompt symbol used when the `vicmd` keymap is active (VI-mode). | `❮` | -| **`PURE_GIT_DOWN_ARROW`** | Defines the git down arrow symbol. | `⇣` | -| **`PURE_GIT_UP_ARROW`** | Defines the git up arrow symbol. | `⇡` | -| **`PURE_GIT_STASH_SYMBOL`** | Defines the git stash symbol. | `≡` | - -Showing git stash status as part of the prompt is not activated by default. To activate this you'll need to opt in via `zstyle`: - -`zstyle :prompt:pure:git:stash show yes` - -## Colors - -As explained in ZSH's [manual](http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Character-Highlighting), color values can be: -- A decimal integer corresponding to the color index of your terminal. If your `$TERM` is `xterm-256color`, see this [chart](https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg). -- The name of one of the following nine colors: `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white`, and `default` (the terminal’s default foreground) -- `#` followed by an RGB triplet in hexadecimal format, for example `#424242`. Only if your terminal supports 24-bit colors (true color) or when the [`zsh/nearcolor` module](http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fnearcolor-Module) is loaded. - -Colors can be changed by using [`zstyle`](http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fzutil-Module) with a pattern of the form `:prompt:pure:$color_name` and style `color`. The color names, their default, and what part they affect are: -- `execution_time` (yellow) - The execution time of the last command when exceeding `PURE_CMD_MAX_EXEC_TIME`. -- `git:arrow` (cyan) - For `PURE_GIT_UP_ARROW` and `PURE_GIT_DOWN_ARROW`. -- `git:stash` (cyan) - For `PURE_GIT_STASH_SYMBOL`. -- `git:branch` (242) - The name of the current branch when in a Git repository. -- `git:branch:cached` (red) - The name of the current branch when the data isn't fresh. -- `git:action` (242) - The current action in progress (cherry-pick, rebase, etc.) when in a Git repository. -- `git:dirty` (218) - The asterisk showing the branch is dirty. -- `host` (242) - The hostname when on a remote machine. -- `path` (blue) - The current path, for example, `PWD`. -- `prompt:error` (red) - The `PURE_PROMPT_SYMBOL` when the previous command has *failed*. -- `prompt:success` (magenta) - The `PURE_PROMPT_SYMBOL` when the previous command has *succeded*. -- `prompt:continuation` (242) - The color for showing the state of the parser in the continuation prompt (PS2). It's the pink part in [this screenshot](https://user-images.githubusercontent.com/147409/70068574-ebc74800-15f8-11ea-84c0-8b94a4b57ff4.png), it appears in the same spot as `virtualenv`. You could for example matching both colors so that Pure has a uniform look. -- `user` (242) - The username when on remote machine. -- `user:root` (default) - The username when the user is root. -- `virtualenv` (242) - The name of the Python `virtualenv` when in use. - -The following diagram shows where each color is applied on the prompt: - -``` -┌────────────────────────────────────────────────────── user -│ ┌─────────────────────────────────────────────── host -│ │ ┌─────────────────────────────────── path -│ │ │ ┌──────────────────────── git:branch -│ │ │ │ ┌────────────────── git:dirty -│ │ │ │ │ ┌──────────────── git:action -│ │ │ │ │ │ ┌─────── git:arrow -│ │ │ │ │ │ │ ┌───── git:stash -│ │ │ │ │ │ │ │ ┌─── execution_time -│ │ │ │ │ │ │ │ │ -zaphod@heartofgold ~/dev/pure master* rebase-i ⇡ ≡ 42s -venv ❯ -│ │ -│ └───────────────────────────────────────────────── prompt -└────────────────────────────────────────────────────── virtualenv (or prompt:continuation) -``` - -### RGB colors - -There are two ways to use RGB colors with the hexadecimal format. The correct way is to use a [terminal that support 24-bit colors](https://gist.github.com/XVilka/8346728) and enable this feature as explained in the terminal's documentation. - -If you can't use such terminal, the module [`zsh/nearcolor`](http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fnearcolor-Module) can be useful. It will map any hexadecimal color to the nearest color in the 88 or 256 color palettes of your terminal, but without using the first 16 colors, since their values can be modified by the user. Keep in mind that when using this module you won't be able to display true RGB colors. It only allows you to specify colors in a more convenient way. The following is an example on how to use this module: - -```sh -# .zshrc -zmodload zsh/nearcolor -zstyle :prompt:pure:path color '#FF0000' -``` - -## Example - -```sh -# .zshrc - -autoload -U promptinit; promptinit - -# optionally define some options -PURE_CMD_MAX_EXEC_TIME=10 - -# change the path color -zstyle :prompt:pure:path color white - -# change the color for both `prompt:success` and `prompt:error` -zstyle ':prompt:pure:prompt:*' color cyan - -# turn on git stash status -zstyle :prompt:pure:git:stash show yes - -prompt pure -``` - -## Tips - -In the screenshot you see Pure running in [Hyper](https://hyper.is) with the [hyper-snazzy](https://github.com/sindresorhus/hyper-snazzy) theme and Menlo font. - -The [Tomorrow Night Eighties](https://github.com/chriskempson/tomorrow-theme) theme with the [Droid Sans Mono](https://www.fontsquirrel.com/fonts/droid-sans-mono) font (15pt) is also a [nice combination](https://github.com/sindresorhus/pure/blob/95ee3e7618c6e2162a1e3cdac2a88a20ac3beb27/screenshot.png).
-*Just make sure you have anti-aliasing enabled in your terminal.* - -To have commands colorized as seen in the screenshot, install [zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting). - -## Integration - -### [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) - -1. Set `ZSH_THEME=""` in your `.zshrc` to disable oh-my-zsh themes. -2. Follow the Pure [Install](#install) instructions. -3. Do not enable the following (incompatible) plugins: `vi-mode`, `virtualenv`. - -**NOTE:** `oh-my-zsh` overrides the prompt so Pure must be activated *after* `source $ZSH/oh-my-zsh.sh`. - -### [prezto](https://github.com/sorin-ionescu/prezto) - -Pure is bundled with Prezto. No need to install it. - -Add `prompt pure` to your `~/.zpreztorc`. - -### [zim](https://github.com/Eriner/zim) - -Add `zmodule sindresorhus/pure --source async.zsh --source pure.zsh` to your `.zimrc` and run `zimfw install`. - -### [antigen](https://github.com/zsh-users/antigen) - -Update your `.zshrc` file with the following two lines (order matters). Do not use the `antigen theme` function. - -```sh -antigen bundle mafredri/zsh-async -antigen bundle sindresorhus/pure -``` - -### [antibody](https://github.com/getantibody/antibody) - -Update your `.zshrc` file with the following two lines (order matters): - -```sh -antibody bundle mafredri/zsh-async -antibody bundle sindresorhus/pure -``` - -### [zplug](https://github.com/zplug/zplug) - -Update your `.zshrc` file with the following two lines: - -```sh -zplug mafredri/zsh-async, from:github -zplug sindresorhus/pure, use:pure.zsh, from:github, as:theme -``` - -### [zinit](https://github.com/zdharma/zinit) - -Update your `.zshrc` file with the following two lines (order matters): - -```sh -zinit ice compile'(pure|async).zsh' pick'async.zsh' src'pure.zsh' -zinit light sindresorhus/pure -``` - -## FAQ - -There are currently no FAQs. - -See [FAQ Archive](https://github.com/sindresorhus/pure/wiki/FAQ-Archive) for previous FAQs. - -## Ports - -- **ZSH** - - [therealklanni/purity](https://github.com/therealklanni/purity) - More compact current working directory, important details on the main prompt line, and extra Git indicators. - - [intelfx/pure](https://github.com/intelfx/pure) - Solarized-friendly colors, highly verbose, and fully async Git integration. - - [forivall/pure](https://github.com/forivall/pure) - A minimal fork which highlights the Git repo's root directory in the path. - - [dfurnes/purer](https://github.com/dfurnes/purer) - Compact single-line prompt with built-in Vim-mode indicator. - - [chabou/pure-now](https://github.com/chabou/pure-now) - Fork with [Now](https://zeit.co/now) support. - - [pure10k](https://gist.github.com/romkatv/7cbab80dcbc639003066bb68b9ae0bbf) - Configuration file for [Powerlevel10k](https://github.com/romkatv/powerlevel10k/) that makes it look like Pure. -- **Bash** - - [sapegin/dotfiles](https://github.com/sapegin/dotfiles) - [Prompt](https://github.com/sapegin/dotfiles/blob/dd063f9c30de7d2234e8accdb5272a5cc0a3388b/includes/bash_prompt.bash) and [color theme](https://github.com/sapegin/dotfiles/tree/master/color) for Terminal.app. -- **Fish** - - [brandonweiss/pure.fish](https://github.com/brandonweiss/pure.fish) - Pure-inspired prompt for Fish. Not intended to have feature parity. - - [rafaelrinaldi/pure](https://github.com/rafaelrinaldi/pure) - Support for bare Fish and various framework ([Oh-My-Fish](https://github.com//oh-my-fish/oh-my-fish), [Fisherman](https://github.com//fisherman/fisherman), and [Wahoo](https://github.com//bucaran/wahoo)). -- **Rust** - - [xcambar/purs](https://github.com/xcambar/purs) - Pure-inspired prompt in Rust. -- **Go** - - [talal/mimir](https://github.com/talal/mimir) - Pure-inspired prompt in Go with Kubernetes and OpenStack cloud support. Not intended to have feature parity. -- **PowerShell** - - [nickcox/pure-pwsh](https://github.com/nickcox/pure-pwsh/) - PowerShell/PS Core implementation of the Pure prompt. - -## Team - -[![Sindre Sorhus](https://github.com/sindresorhus.png?size=100)](https://sindresorhus.com) | [![Mathias Fredriksson](https://github.com/mafredri.png?size=100)](https://github.com/mafredri) ----|--- -[Sindre Sorhus](https://github.com/sindresorhus) | [Mathias Fredriksson](https://github.com/mafredri) diff --git a/zsh/.zsh/pure/screenshot-title-cmd.png b/zsh/.zsh/pure/screenshot-title-cmd.png deleted file mode 100755 index 3f4b77c20d712f7f3a1d651ad1f53262f5d00987..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24844 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 Zy{=138 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 diff --git a/zsh/.zsh/pure/screenshot.png b/zsh/.zsh/pure/screenshot.png deleted file mode 100755 index 1a2767874f23197b7d24614cab8c3b37d55cb76a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72121 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 be=0opXdjX-b`?BQPkzttK;J5FTGsyo7yVsp diff --git a/zsh/.zshrc b/zsh/.zshrc index 85ccd45..8d98895 100644 --- a/zsh/.zshrc +++ b/zsh/.zshrc @@ -1,64 +1,79 @@ -# Lines configured by zsh-newuser-install -HISTFILE=~/.cache/zshhistfile -HISTSIZE=1000 -SAVEHIST=1000 -setopt autocd extendedglob -bindkey -v -# End of lines configured by zsh-newuser-install -# The following lines were added by compinstall -zstyle :compinstall filename '/home/rushilwiz/.zshrc' +# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc. +# Initialization code that may require console input (password prompts, [y/n] +# confirmations, etc.) must go above this block; everything else may go below. +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 -autoload -Uz compinit -compinit -# End of lines added by compinstall +# Set the directory we want to store zinit and plugins +ZINIT_HOME="${XDG_DATA_HOME:-${HOME}/.local/share}/zinit/zinit.git" -autoload -U compinit -zstyle ':completion:*' menu select -zmodload zsh/complist -compinit -_comp_options+=(globdots) # Include hidden files.i +# Download Zinit, if it's not there yet +if [ ! -d "$ZINIT_HOME" ]; then + mkdir -p "$(dirname $ZINIT_HOME)" + git clone https://github.com/zdharma-continuum/zinit.git "$ZINIT_HOME" +fi -autoload -Uz vcs_info -precmd_vcs_info() { vcs_info } -precmd_functions+=( precmd_vcs_info ) -setopt prompt_subst -zstyle ':vcs_info:git:*' formats 'on %F{yellow}(%b)%f' -zstyle ':vcs_info:*' enable git +# Source/Load zinit +source "${ZINIT_HOME}/zinit.zsh" -PROMPT="%F{magenta}%n%f at %F{10}%m%f in %F{cyan}%~%f \$vcs_info_msg_0_ - $ " +# Add in Powerlevel10k +zinit ice depth=1; zinit light romkatv/powerlevel10k -RPROMPT="%T" +# Add in zsh plugins +zinit light zsh-users/zsh-syntax-highlighting +zinit light zsh-users/zsh-completions +zinit light zsh-users/zsh-autosuggestions +zinit light Aloxaf/fzf-tab -export WORKON_HOME=$HOME/.virtualenvs -# source ~/.pyenv/versions/3.8.6/bin/virtualenvwrapper_lazy.sh +# Add in OMZ plgins +zinit snippet OMZP::git +zinit snippet OMZP::sudo +zinit snippet OMZP::command-not-found -export NVM_DIR="$HOME/.nvm" -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm -[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion +# Load completions +autoload -U compinit && compinit -[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh -ANTIGEN_LOG=~/antigen.log -source ~/.zsh/antigen.zsh +zinit cdreplay -q -# antigen bundle ytakahashi/igit -antigen bundle wbingli/zsh-wakatime -antigen bundle zsh-users/zsh-autosuggestions -antigen bundle pipenv - -antigen apply +# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh. +[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh +# Keybinds (emacs mode) +bindkey -e bindkey "^[[1;5C" forward-word bindkey "^[[1;5D" backward-word -[ -f "$HOME/.zsh/aliasrc" ] && source "$HOME/.zsh/aliasrc" +# History +HISTFILE=5000 +HISTFILE=~/.zsh_history +SAVEHIST=$HISTSIZE +HISTDUP=erase +setopt appendhistory +setopt sharehistory +setopt hist_ignore_space +setopt hist_ignore_all_dups +setopt hist_save_no_dups +setopt hist_ignore_dups +setopt hist_find_no_dups + +# Completion styling +zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}' +zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" +zstyle ':completion:*' menu no +zstyle ':fzf-tab:complete:cd:*' fzf-preview 'ls --color $realpath' + +# Aliases +alias ls='ls --color' + +# Shell integrations +[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh + +# Additional programs -export PATH=$HOME/bin:/usr/local/bin:$HOME/.local/bin:$PATH -export GPG_TTY=$(tty) -export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS="1" export PATH=$HOME/.yarn/bin:$PATH - export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" +export PATH=$PATH:/home/rushil/.spicetify