diff --git a/aliases/apt b/aliases/apt index 14a2da7..92f4a33 100755 --- a/aliases/apt +++ b/aliases/apt @@ -8,19 +8,27 @@ grep -iq 'ID_LIKE=debian' /etc/os-release || \ grep -iq 'NAME=Debian' /etc/os-release || \ return -alias xq="apt-cache search" -alias xi="sudo apt-get install" alias xowner="dpkg -S" alias xfiles="dpkg -L" + alias sv="systemctl" -xupdate() { - sudo -v - echo "\e[1;32mUpdating package cache...\e[0m" - if sudo apt update 2>&1 | grep -q 'apt list --upgradable'; then - echo "\e[1;92mUpgrades available:\e[0m" - apt list --upgradable - echo "\e[1;92mRun upgrades?\e[0m" - read -q && sudo apt upgrade -y - fi -} +if (( $+commands[nala] )); then + alias xq="nala search" + alias xi="sudo nala install" + alias xupdate="sudo nala upgrade" +else + alias xq="apt-cache search" + alias xi="sudo apt-get install" + + xupdate() { + sudo -v + echo "\e[1;32mUpdating package cache...\e[0m" + if sudo apt update 2>&1 | grep -q 'apt list --upgradable'; then + echo "\e[1;92mUpgrades available:\e[0m" + apt list --upgradable + echo "\e[1;92mRun upgrades?\e[0m" + read -q && sudo apt upgrade -y + fi + } +fi diff --git a/aliases/functions b/aliases/functions index 4de415d..707d0c0 100644 --- a/aliases/functions +++ b/aliases/functions @@ -392,3 +392,10 @@ if exists gron; then gron | grep "$@" | gron -u } fi + +autostash() { + git stash + git "$@" + git stash pop +} +compdef _git autostash diff --git a/aliases/git b/aliases/git index f477c63..a5eb000 100644 --- a/aliases/git +++ b/aliases/git @@ -33,8 +33,8 @@ defvcsfun gcm "commit" "commit" "commit" defvcsfun ga "add" "add" "add" defvcsfun gpu "push" "push" "i_am_not_distributed_please_dont_push_me" +alias gs="git switch" alias gco="git checkout" -alias gca="git commit -a" alias gap="git add --patch" diff --git a/plugins/cdup/cdup.plugin.zsh b/plugins/cdup/cdup.plugin.zsh index 4220071..5c131ae 100644 --- a/plugins/cdup/cdup.plugin.zsh +++ b/plugins/cdup/cdup.plugin.zsh @@ -1,20 +1,64 @@ +PROJECT_ROOT_INDICATORS=(.git .hg package.json build.sbt) + +# These commands find the topmost (i.e. shortest full path) project directory in +# the hierarchy of the given directory. +# cdup: changes to the match +# _cdup: prints the match +# _cdup_r: sets ~r as named dir for the match (set up as a chpwd hook) +# +# args: (cdup|_cdup) [-c] DIR [PROJECT_ROOT_INDICATOR...] +# -c / --closest return the nearest project directory, i.e. least steps up, +# possibly including the current directory +# +# DIR is starting point for the search +# A PROJECT_ROOT_INDICATOR are files to look for to detect project roots. If +# not given, a default list is used. $PROJECT_ROOT_INDICATORS can be used to +# override the default globally + _cdup() { + zparseopts -D -E c=closest -closest=closest local dir=$1; shift local targets=("$@") + local match nextmatch for target in $targets; do if [[ -e $dir/$target ]]; then - cd $dir - return 0 + if [[ $closest ]]; then + echo $dir + return + else + match=$dir + break + fi fi done - if [[ $dir == "/" ]]; then return 1 - else _cdup ${dir:h} ${targets[@]} + if [[ $dir != "/" ]]; then + nextmatch=$(_cdup ${dir:h} ${targets[@]}) + match=${nextmatch:-$match} + fi + + if [[ $match ]]; then echo $match; return 0; + else return 1 fi } cdup() { - if [[ ${#@} -gt 0 ]]; then _cdup ${PWD:h} "$@" - else _cdup ${PWD:h} .git .hg package.json build.sbt + zparseopts -D -E c=closest -closest=closest + local target=$(_cdup $closest ${PWD:h} ${@:-$PROJECT_ROOT_INDICATORS}) + if [[ $? != 0 ]]; then return 1; + else cd $target fi } + +_cdup_r () { + _cdup_project_root=$(_cdup ${PWD} ${PROJECT_ROOT_INDICATORS}) + hash -d r=$_cdup_project_root +} + +_prompt_cdup() { + [[ -n $_cdup_project_root ]] && echo "project: ${_cdup_project_root:h:t}/${_cdup_project_root:t}" +} + +autoload -U add-zsh-hook +add-zsh-hook chpwd _cdup_r +_cdup_r diff --git a/zshrc b/zshrc index 0c1eb6d..1c2e813 100644 --- a/zshrc +++ b/zshrc @@ -128,6 +128,10 @@ if exists mail; then __chromaz_extra_left+=_prompt_cron_mails fi +if exists _prompt_cdup; then + __chromaz_extra_left+=_prompt_cdup +fi + tabs -4 #zprof