227 lines
5.2 KiB
Bash
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'
|
|
}
|