diff --git a/.config/zsh/.zshrc b/.config/zsh/.zshrc index f711a59..5866093 100644 --- a/.config/zsh/.zshrc +++ b/.config/zsh/.zshrc @@ -2,16 +2,16 @@ # HELPER FUNCTIONS # #################### -precmd_vcs_info() { vcs_info } +precmd_vcs_info() { vcs_info; } -precmd_functions+=( precmd_vcs_info ) +precmd_functions+=(precmd_vcs_info) zle-line-init() { - zle -K viins - echo -ne "\e[5 q" + zle -K viins + echo -ne "\e[5 q" } -preexec() { echo -ne '\e[5 q' ;} +preexec() { echo -ne '\e[5 q'; } local copy_widgets=( vi-yank vi-yank-eol vi-delete vi-backward-kill-word vi-change-whole-line @@ -22,14 +22,14 @@ local paste_widgets=( ) function zle-keymap-select { - if [[ ${KEYMAP} == vicmd ]] || - [[ $1 = 'block' ]]; then - echo -ne '\e[1 q' - elif [[ ${KEYMAP} == main ]] || - [[ ${KEYMAP} == viins ]] || - [[ ${KEYMAP} == '' ]]; then - echo -ne '\e[5 q' - fi + if [[ ${KEYMAP} == vicmd ]] || + [[ $1 = 'block' ]]; then + echo -ne '\e[1 q' + elif [[ ${KEYMAP} == main ]] || + [[ ${KEYMAP} == viins ]] || + [[ ${KEYMAP} == '' ]]; then + echo -ne '\e[5 q' + fi } function x11-clip-wrap-widgets() { @@ -59,23 +59,23 @@ function +vi-git-st() { local ahead behind remote local -a gitstatus remote=${$(git rev-parse --verify ${hook_com[branch]}@{upstream} \ - --symbolic-full-name 2>/dev/null)/refs\/remotes\/} - if [[ -n ${remote} ]] ; then + --symbolic-full-name 2>/dev/null)/refs\/remotes\//} + if [[ -n ${remote} ]]; then # for git prior to 1.7 # ahead=$(git rev-list origin/${hook_com[branch]}..HEAD | wc -l) ahead=$(git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l) - (( $ahead )) && gitstatus+=( " ${c3}+${ahead}${c2}" ) + (($ahead)) && gitstatus+=(" ${c3}+${ahead}${c2}") # for git prior to 1.7 # behind=$(git rev-list HEAD..origin/${hook_com[branch]} | wc -l) behind=$(git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l) - (( $behind )) && gitstatus+=( "${c4}-${behind}${c2}" ) + (($behind)) && gitstatus+=("${c4}-${behind}${c2}") hook_com[branch]="${hook_com[branch]} [${remote}${(j:/:)gitstatus}]" fi } function +vi-git-stash() { local -a stashes - if [[ -s ${hook_com[base]}/.git/refs/stash ]] ; then + if [[ -s ${hook_com[base]}/.git/refs/stash ]]; then stashes=$(git stash list 2>/dev/null | wc -l) hook_com[misc]+=" (${stashes} stashed)" fi @@ -86,56 +86,99 @@ function +vi-git-stash() { ################## mkcd() { - mkdir -p -- "$1" && - cd -- "$1" + mkdir -p -- "$1" && + cd -- "$1" } uv() { - if [[ "$1" == "init" ]]; then - shift + if [[ "$1" == "init" ]]; then + shift - if [[ "$1" == "--normal" ]]; then - shift - command uv init "$@" - else - command uv init --bare "$@" || return + if [[ "$1" == "--normal" ]]; then + shift + command uv init "$@" + else + command uv init --bare "$@" || return - if [[ $# -eq 0 ]]; then - command uv venv || return + if [[ $# -eq 0 ]]; then + command uv venv || return - if [[ -f ".venv/bin/activate" ]]; then - source .venv/bin/activate + if [[ -f ".venv/bin/activate" ]]; then + source .venv/bin/activate + fi + fi fi - fi + else + command uv "$@" fi - else - command uv "$@" - fi } -_find_venv_upwards() { - local dir="$PWD" +find_uv_root() { + local target="$1" + local dir - while [[ "$dir" != "/" ]]; do - if [[ -f "$dir/.venv/pyvenv.cfg" ]]; then - echo "$dir/.venv" - return + if [[ -n "$target" && -e "$target" ]]; then + dir="$(cd "$(dirname "$target")" && pwd)" + else + dir="$PWD" fi - dir=$(dirname "$dir") - done + + while [[ "$dir" != "/" ]]; do + if [[ -f "$dir/.python-version" ]] || [[ -f "$dir/pyproject.toml" ]]; then + echo "$dir" + return 0 + fi + + dir="$(dirname "$dir")" + done + + return 1 +} + +uvshim() { + local cmd="$1" + shift + + local uv_root="" + local first_arg="$1" + + uv_root="$(find_uv_root "$first_arg")" + + if [[ -n "$uv_root" ]]; then + uv run --project "$uv_root" "$cmd" "$@" + else + command -- "$cmd" "$@" + fi +} + +python() { uvshim python "$@"; } +python3() { uvshim python3 "$@"; } +pip() { uvshim pip "$@"; } +pytest() { uvshim pytest "$@"; } + +_find_venv_upwards() { + local dir="$PWD" + + while [[ "$dir" != "/" ]]; do + if [[ -f "$dir/.venv/pyvenv.cfg" ]]; then + echo "$dir/.venv" + return + fi + dir=$(dirname "$dir") + done } _auto_venv() { - local venv_dir - venv_dir=$(_find_venv_upwards) + local venv_dir + venv_dir=$(_find_venv_upwards) - if [[ -n "$VIRTUAL_ENV" && "$VIRTUAL_ENV" != "$venv_dir" ]]; then - deactivate 2>/dev/null - fi + if [[ -n "$VIRTUAL_ENV" && "$VIRTUAL_ENV" != "$venv_dir" ]]; then + deactivate 2>/dev/null + fi - if [[ -n "$venv_dir" && "$VIRTUAL_ENV" != "$venv_dir" ]]; then - source "$venv_dir/bin/activate" - fi + if [[ -n "$venv_dir" && "$VIRTUAL_ENV" != "$venv_dir" ]]; then + source "$venv_dir/bin/activate" + fi } autoload -U add-zsh-hook @@ -144,89 +187,89 @@ _auto_venv _accept_line() { - # automatically push to remote - if [[ "$BUFFER" == "git push" ]]; then - local branch - branch=$(git symbolic-ref --short HEAD 2>/dev/null) + # automatically push to remote + if [[ "$BUFFER" == "git push" ]]; then + local branch + branch=$(git symbolic-ref --short HEAD 2>/dev/null) - if [[ -n "$branch" ]]; then - git rev-parse --abbrev-ref --symbolic-full-name @{u} &>/dev/null - if [[ $? -ne 0 ]]; then - BUFFER="git push -u origin $branch" - fi - fi - fi - - # use keifu instead of git log --graph - if [[ "$BUFFER" =~ ^([a-zA-Z0-9_-]+)[[:space:]]+([a-zA-Z0-9_-]+)(.*)$ ]]; then - - local cmd=${match[1]} - local subcmd=${match[2]} - local rest=${match[3]} - - # directly via git log --graph - if [[ "$cmd" == "git" && "$subcmd" == "log" && "$rest" == *"--graph"* ]]; then - BUFFER="keifu" - zle accept-line - return + if [[ -n "$branch" ]]; then + git rev-parse --abbrev-ref --symbolic-full-name @{u} &>/dev/null + if [[ $? -ne 0 ]]; then + BUFFER="git push -u origin $branch" + fi + fi fi - # check for git-alias - if [[ "$cmd" == "git" ]]; then - local alias_expansion - alias_expansion=$(git config --get "alias.$subcmd" 2>/dev/null) + # use keifu instead of git log --graph + if [[ "$BUFFER" =~ ^([a-zA-Z0-9_-]+)[[:space:]]+([a-zA-Z0-9_-]+)(.*)$ ]]; then - if [[ -n "$alias_expansion" && "$alias_expansion" == log*--graph* ]]; then - BUFFER="keifu" - zle accept-line - return - fi - fi + local cmd=${match[1]} + local subcmd=${match[2]} + local rest=${match[3]} - # shell-alias - if alias "$cmd" &>/dev/null; then - local expansion=$(alias "$cmd") - expansion=${expansion#*=} - expansion=${expansion#\'} - expansion=${expansion%\'} - - if [[ "$expansion" =~ --git-dir=([^[:space:]]+) ]]; then - local gitdir=${match[1]} - - if [[ "$subcmd" == "log" && "$rest" == *"--graph"* ]]; then - BUFFER="(cd $gitdir && keifu)" - zle accept-line - return + # directly via git log --graph + if [[ "$cmd" == "git" && "$subcmd" == "log" && "$rest" == *"--graph"* ]]; then + BUFFER="keifu" + zle accept-line + return fi - # git-alias within shell-alias - local alias_expansion - alias_expansion=$(git --git-dir="$gitdir" config --get "alias.$subcmd" 2>/dev/null) + # check for git-alias + if [[ "$cmd" == "git" ]]; then + local alias_expansion + alias_expansion=$(git config --get "alias.$subcmd" 2>/dev/null) - if [[ -n "$alias_expansion" && "$alias_expansion" == log*--graph* ]]; then - BUFFER="(cd $gitdir && keifu)" - zle accept-line - return + if [[ -n "$alias_expansion" && "$alias_expansion" == log*--graph* ]]; then + BUFFER="keifu" + zle accept-line + return + fi fi - fi - fi - fi - # swap main and master Fix - if [[ $BUFFER == git\ * ]]; then - local has_main=0 - local has_master=0 - git rev-parse --verify main >/dev/null 2>&1 && has_main=1 - git rev-parse --verify master >/dev/null 2>&1 && has_master=1 - if [[ $has_main -eq 1 && $has_master -eq 0 ]]; then - BUFFER=${BUFFER//" master"/" main"} - fi - if [[ $has_master -eq 1 && $has_main -eq 0 ]]; then - BUFFER=${BUFFER//" main"/" master"} - fi - fi + # shell-alias + if alias "$cmd" &>/dev/null; then + local expansion=$(alias "$cmd") + expansion=${expansion#*=} + expansion=${expansion#\'} + expansion=${expansion%\'} - zle accept-line + if [[ "$expansion" =~ --git-dir=([^[:space:]]+) ]]; then + local gitdir=${match[1]} + + if [[ "$subcmd" == "log" && "$rest" == *"--graph"* ]]; then + BUFFER="(cd $gitdir && keifu)" + zle accept-line + return + fi + + # git-alias within shell-alias + local alias_expansion + alias_expansion=$(git --git-dir="$gitdir" config --get "alias.$subcmd" 2>/dev/null) + + if [[ -n "$alias_expansion" && "$alias_expansion" == log*--graph* ]]; then + BUFFER="(cd $gitdir && keifu)" + zle accept-line + return + fi + fi + fi + fi + + # swap main and master Fix + if [[ $BUFFER == git\ * ]]; then + local has_main=0 + local has_master=0 + git rev-parse --verify main >/dev/null 2>&1 && has_main=1 + git rev-parse --verify master >/dev/null 2>&1 && has_master=1 + if [[ $has_main -eq 1 && $has_master -eq 0 ]]; then + BUFFER=${BUFFER//" master"/" main"} + fi + if [[ $has_master -eq 1 && $has_main -eq 0 ]]; then + BUFFER=${BUFFER//" main"/" master"} + fi + fi + + zle accept-line } zle -N _accept_line @@ -275,7 +318,7 @@ setopt prompt_subst # copy to x11 clipboard x11-clip-wrap-widgets copy $copy_widgets -x11-clip-wrap-widgets paste $paste_widgets +x11-clip-wrap-widgets paste $paste_widgets # enable colors autoload -U colors && colors @@ -343,7 +386,7 @@ fi eval $(thefuck --alias) # opam -[[ ! -r "$HOME/.opam/opam-init/init.zsh" ]] || source "$HOME/.opam/opam-init/init.zsh" > /dev/null 2> /dev/null +[[ ! -r "$HOME/.opam/opam-init/init.zsh" ]] || source "$HOME/.opam/opam-init/init.zsh" >/dev/null 2>/dev/null ########################## # COMMANDS BEFORE PROMPT # diff --git a/.local/bin/etc/nvim/compiler b/.local/bin/etc/nvim/compiler index 372d59f..2283cf0 100755 --- a/.local/bin/etc/nvim/compiler +++ b/.local/bin/etc/nvim/compiler @@ -14,43 +14,60 @@ vipercmd="carbon" #"silicon" cd "$dir" || exit -textype() { \ - command="pdflatex --shell-escape" - ( sed 5q "$file" | grep -i -q 'xelatex' ) && command="xelatex" - $command --output-directory="$dir" "$base" && - grep -i addbibresource "$file" >/dev/null && - biber --input-directory "$dir" "$base" && - $command --output-directory="$dir" "$base" && +has_uv_project() { + dir="$PWD" + while [ "$dir" != "/" ]; do + if [ -f "$dir/.python-version" ] || [ -f "$dir/pyproject.toml" ]; then + return 0 + fi + dir=$(dirname "$dir") + done + return 1 +} + +textype() { + command="pdflatex --shell-escape" + (sed 5q "$file" | grep -i -q 'xelatex') && command="xelatex" + $command --output-directory="$dir" "$base" && + grep -i addbibresource "$file" >/dev/null && + biber --input-directory "$dir" "$base" && + $command --output-directory="$dir" "$base" && makeglossaries "$basenodir" && - $command --output-directory="$dir" "$base" - } + $command --output-directory="$dir" "$base" +} case "$file" in - *\.[0-9]) refer -PS -e "$file" | groff -mandoc -T pdf > "$base".pdf ;; - *\.bash) bash "$file" ;; - *\.go) go run "$file" ;; - *\.lua) lua "$file" ;; - *\.md) pandoc "$file" --pdf-engine=xelatex -o "$base".pdf ;; - *\.mom) refer -PS -e "$file" | groff -mom -kept -T pdf > "$base".pdf ;; - *\.ms) refer -PS -e "$file" | groff -me -ms -kept -T pdf > "$base".pdf ;; - *\.py) python3 "$file" ;; - *\.rmd) echo "require(rmarkdown); render('$file')" | R -q --vanilla ;; - *\.sent) setsid sent "$file" 2>/dev/null & ;; - *config.h) sudo make install ;; - *\.c) if [ -f Makefile ]; then make run; else cc "$file" -o "$base" && "$base"; fi ;; - *\.java) java "$file" ;; - *\.js) node "$file" ;; - *\.m) octave -qW "$file" ;; - *\.nim) nim c -r -d:noColors "$file" ;; - *\.r|*\.R) Rscript "$file" ;; - *\.rs) (cd "$dir" && cargo locate-project >/dev/null 2>&1) \ - && (cd "$(dirname "$(cd "$dir" && cargo locate-project --message-format plain)")" && cargo run) \ - || (rustc "$file" && "./$(basename "${file%.rs}")") ;; - *\.sh) dash "$file" ;; - *\.smt2) z3 "$file" ;; - *\.tex) textype "$file" ;; - *\.vpr) $vipercmd "$file" ;; - *\.zsh) zsh "$file" ;; - *\.ly) lilypond "$file" ;; - *) sed 1q "$file" | grep "^#!/" | sed "s/^#!//" | xargs -r -I % "$file" ;; +*\.[0-9]) refer -PS -e "$file" | groff -mandoc -T pdf >"$base".pdf ;; +*\.bash) bash "$file" ;; +*\.go) go run "$file" ;; +*\.lua) lua "$file" ;; +*\.md) pandoc "$file" --pdf-engine=xelatex -o "$base".pdf ;; +*\.mom) refer -PS -e "$file" | groff -mom -kept -T pdf >"$base".pdf ;; +*\.ms) refer -PS -e "$file" | groff -me -ms -kept -T pdf >"$base".pdf ;; +*\.py) + if has_uv_project; then + uv run python "$file" + else + python3 "$file" + fi + ;; +*\.rmd) echo "require(rmarkdown); render('$file')" | R -q --vanilla ;; +*\.sent) setsid sent "$file" 2>/dev/null & ;; +*config.h) sudo make install ;; +*\.c) if [ -f Makefile ]; then make run; else cc "$file" -o "$base" && "$base"; fi ;; +*\.java) java "$file" ;; +*\.js) node "$file" ;; +*\.m) octave -qW "$file" ;; +*\.nim) nim c -r -d:noColors "$file" ;; +*\.r | *\.R) Rscript "$file" ;; +*\.rs) (cd "$dir" && cargo locate-project >/dev/null 2>&1) && + (cd "$(dirname "$(cd "$dir" && cargo locate-project --message-format plain)")" && cargo run) || + (rustc "$file" && "./$(basename "${file%.rs}")") ;; +*\.sh) dash "$file" ;; +*\.smt2) z3 "$file" ;; +*\.tex) textype "$file" ;; +*\.vpr) $vipercmd "$file" ;; +*\.zsh) zsh "$file" ;; +*\.ly) lilypond "$file" ;; +*) sed 1q "$file" | grep "^#!/" | sed "s/^#!//" | xargs -r -I % "$file" ;; esac