elas-arch-config/zsh/.zsh.d/functions.zsh
2024-07-22 22:18:54 +02:00

227 lines
5.2 KiB
Bash

# Create a directory and enter it
mkcd() {
mkdir --parents "$@" && cd "$_" || exit
}
# cd into directory using fuzzy search
fcd() {
local dir
dir=$(fd --type d --follow | fzf --preview 'tree -l -L 1 {}' +m) &&
cd "$dir"
}
# Edit a directory or a file using fuzzy search
fe() {
local target fzf_cmd
fzf_cmd='fd --follow --hidden --no-ignore \
--exclude .git \
--exclude vendor \
--exclude node_modules \
--exclude .terraform \
--exclude target \
--exclude bin \
--exclude build \
--exclude dist \
--exclude coverage \
--exclude .DS_Store'
target=$(eval $fzf_cmd | fzf +m) &&
if [ -d "$target" ]; then
cd "$target" && "$EDITOR"
fi
if [ -f "$target" ]; then
"$EDITOR" "$target"
fi
}
# Checkout Git branches or tags using fuzzy search
fco() {
local tags branches target
tags=$(
git tag | awk '{print "\x1b[31;1mtag\x1b[m\t" $1}'
) || return
branches=$(
git branch --all | grep -v HEAD |
sed "s/.* //" | sed "s#remotes/[^/]*/##" |
sort -u | awk '{print "\x1b[34;1mbranch\x1b[m\t" $1}'
) || return
target=$(
(
echo "$tags"
echo "$branches"
) |
fzf-tmux -l30 -- --no-hscroll --ansi +m -d "\t" -n 2
) || return
git checkout "$(echo "$target" | awk '{print $2}')"
}
# Kill any process with fuzzy search
fkill() {
local pid
if [ "$UID" != "0" ]; then
pid=$(ps -f -u $UID | sed 1d | fzf -m | awk '{print $2}')
else
pid=$(ps -ef | sed 1d | fzf -m | awk '{print $2}')
fi
if [ "x$pid" != "x" ]; then
echo "$pid" | xargs kill "-${1:-9}"
fi
}
# Git commit browser with fuzzy search
fshow() {
git log --graph --color=always \
--format="%C(auto)%h%d %s %C(black)%C(bold)%cr" "$@" |
fzf --ansi --no-sort --reverse --tiebreak=index --bind=ctrl-s:toggle-sort \
--bind "ctrl-m:execute:
(grep -o '[a-f0-9]\{7\}' | head -1 |
xargs -I % sh -c 'git show --color=always % | less -R') << 'FZF-EOF'
{}
FZF-EOF"
}
# Open tmux and Vim in an IDE like layout
ide() {
if [ -n "$1" ]; then
cd "$1" || exit
fi
if [ -z "${TMUX}" ]; then
tmux new-session -A -s ide
fi
tmux split-window -vb -p 90
tmux select-pane -t 0
tmux send-keys 'nvim -c NvimTreeOpen' C-m
}
# Update project dependencies
depu() {
# Git submodules
if [ -e .gitmodules ]; then
printf "Updating Git submodules for %s...\n\n" "${PWD##*/}"
git submodule update --init --remote --rebase --recursive
fi
# npm
if [ -e package-lock.json ]; then
printf "Updating npm dependencies for %s...\n\n" "${PWD##*/}"
npm update
npm outdated
fi
# Go
if [ -e go.mod ]; then
printf "Updating Go dependencies for %s...\n\n" "${PWD##*/}"
go get -t -u ./...
go mod tidy
fi
# Rust
if [ -e Cargo.toml ]; then
printf "Updating Cargo dependencies for %s...\n\n" "${PWD##*/}"
cargo update
fi
# Python
if [ -e poetry.lock ]; then
printf "Updating Python dependencies for %s...\n\n" "${PWD##*/}"
poetry update
poetry show --outdated
fi
# Terraform
if [ -e .terraform.lock.hcl ]; then
printf "Updating Terraform dependencies for %s...\n\n" "${PWD##*/}"
terraform init -upgrade
fi
}
# System update
pacu() {
processes=()
# Dotfiles repo
printf '\e[1mUpdating dotfiles repo\e[0m\n'
(cd "${HOME}/dotfiles" && git pull)
case "$(uname)" in
'Linux')
# On Linux, use the respective package manager
if [ -x "$(command -v paru)" ]; then
printf '\e[1mUpdating Paru packages\e[0m\n'
paru -Syu --noconfirm
orphans=$(paru -Qtdq) || orphans=''
if [ -n "${orphans}" ]; then
printf '\e[1mRemoving orphan packages\e[0m\n'
paru -Rns $orphans --noconfirm
fi
paru -Sc --noconfirm
paru --clean --noconfirm
elif [ -x "$(command -v pacman)" ]; then
printf '\e[1mUpdating pacman packages\e[0m\n'
sudo pacman -Syu --noconfirm
orphans=$(sudo pacman -Qtdq) || orphans=''
if [ -n "${orphans}" ]; then
printf '\e[1mRemoving orphan packages\e[0m\n'
sudo pacman -Rns $orphans --noconfirm
fi
sudo pacman -Sc --noconfirm
fi
if [ -x "$(command -v pacmanfile)" ]; then
printf '\e[1mSyncing packages with pacmanfile\e[0m\n'
pacmanfile sync
fi
if [ -x "$(command -v pacdiff)" ]; then
printf '\e[1mChecking for Pacman maintenance issues\e[0m\n'
sudo DIFFPROG="${EDITOR} -d" pacdiff
fi
# Update status bar indicator for pending updates
pkill -SIGRTMIN+8 waybar
# Update firmwares
if [ -x "$(command -v fwupdmgr)" ]; then
printf '\e[1mUpdating firmwares\e[0m\n'
fwupdmgr refresh
fwupdmgr update
fi
;;
esac
# zprezto
if type zprezto-update 2>/dev/null | grep -q function; then
printf '\e[1mUpdating zprezto\e[0m\n'
zprezto-update &
processes+=("$!")
fi
# npm
if [ -x "$(command -v npm)" ]; then
printf '\e[1mUpdating globally installed npm packages\e[0m\n'
npm update -g
fi
# Yarn
if [ -x "$(command -v yarn)" ]; then
printf '\e[1mUpdating globally installed Yarn packages\e[0m\n'
(yarn global upgrade >/dev/null) &
processes+=("$!")
fi
# Neovim
if [ -x "$(command -v nvim)" ]; then
printf '\e[1mUpdating Neovim plugins\e[0m\n'
nvim --headless -c 'Lazy! sync' -c 'qa'
nvim --headless -c 'autocmd User MasonUpdateAllComplete quitall' -c 'MasonUpdateAll'
fi
# Wait for all processes to finish
for p in ${processes[*]}; do
wait "$p"
done
printf '\n\e[1mSystem update finished\e[0m\n'
}