dotfiles/dot_config/bash/functions

426 lines
17 KiB
Bash

#!/bin/bash
[ -f "$HOME/.config/bash/functions.priv" ] && source "$HOME/.config/bash/functions.priv";
tdm() {
local awk_preview="/^~/ { next }
/^#+/ { print '\\033[35;3m'\$0'\\033[0m'; next }
/^ *\[\+\] / { print '\\033[32m'\$0'\\033[0m'; next }
/^ *\[x\] / { print '\\033[31m'\$0'\\033[0m'; next }
/^ *\[ \] / { print '\\033[33m'\$0'\\033[0m'; next }
/^ \* / { print '\\033[34m'\$0'\\033[0m'; next }
/^[0-9]+\. / { print '\\033[34m'\$0'\\033[0m'; next }
/^>/ { print '\\033[92m'\$0'\\033[0m'; next }
/^\(!\)/ { print '\\033[91;7m'\$0'\\033[0m'; next }
/.*/ { print \$0; next }";
local act="$1"; shift;
[ -z "$TODO_PATH" ] && return;
case "$act" in
motd) [ "$(tdm num)" -eq 0 ] && return;
printf "\033[33m===== TODO =====\033[0m\n";
tdm print;;
print)
awk "$awk_preview" "$TODO_PATH";;
add) echo "$*" | tee -a "$TODO_PATH";;
num) grep -vcP "^~" "$TODO_PATH";;
ed) case "$EDITOR" in
*vim) $EDITOR -c "set syntax=markdown" "$TODO_PATH";;
*) $EDITOR "$TODO_PATH";;
esac;;
*) echo "tdm [print|add|num|ed]";;
esac;
}
# Project management
#alias p="cd \"\$(find ~/projects/ -type d -name '.git' | sed 's|/.git$||' | gum filter)\""
p() {
_log() {
printf "\033[33m * \033[34m%s\033[0m\n" "$@";
}
local cmd="$1"; shift;
local projects_dir="${HOME}/projects";
case "$cmd" in
ls) find "${projects_dir}" -type d -name .git \
| sed -e 's|/.git$||' -e "s|^${projects_dir}||";;
cd) dirname="$1";
if [ "$dirname" = "" ]; then
dirname="$( (printf -- "--cancel--\n"; p ls) | gum filter)" || return;
if [ "$dirname" = "--cancel--" ]; then return; fi;
fi;
cd "${projects_dir}/${dirname}" || return;
if [ -d "${projects_dir}/${dirname}/venv" ]; then
export VIRTUAL_ENV_DISABLE_PROMPT=1;
source "${projects_dir}/${dirname}/venv/bin/activate";
fi;
;;
mk)
project_name="$(gum input --placeholder="Project name?" --value="$1")" || return;
project_type="$(printf "Python\nC\nPackwiz\nNone\n" | gum choose)" || return;
mkdir -vp "$projects_dir/$project_name";
cd "$projects_dir/$project_name" || return;
case "$project_type" in
Packwiz)
_log "Initializing Packwiz pack";
packwiz init --modloader fabric;
;;
Python)
_log "Creating .gitignore";
printf '*.py[cow]\n__pycache__/\nvenv/\n' > .gitignore;
_log "Creating requirements.txt";
echo > requirements.txt;
_log "Creating $project_name/__main__.py";
mkdir -vp "$project_name";
printf 'def main():\n' > "$project_name/__main__.py";
printf " print('Hi!')\n\n" >> "$project_name/__main__.py";
printf "if __name__ == '__main__':\n" >> "$project_name/__main__.py";
printf " main()\n" >> "$project_name/__main__.py";
_log "Creating virtualenv";
python3 -m virtualenv venv;
;;
C)
_log "Creating directories";
mkdir -vp src obj;
touch Makefile src/main.c obj/.gitkeep;
_log "Creating src/main.c";
printf '#include <stdio.h>\n' > src/main.c;
printf '#include <math.h>\n\n' >> src/main.c;
printf 'int main(void) {\n' >> src/main.c;
printf ' printf("Hi!\\n");\n' >> src/main.c;
printf '}\n' >> src/main.c;
_log "Creating Makefile";
printf 'CFLAGS += \n' > Makefile;
printf 'LDFLAGS := -lm\n' >> Makefile;
printf 'OBJECTS := \n\n' >> Makefile;
printf '%s: lib\n' "$project_name" >> Makefile;
# shellcheck disable=SC2016
printf '\t$(CC) $(CFLAGS) $(OBJECTS) src/main.c $(LDFLAGS) -o %s\n\n' "$project_name" >> Makefile;
printf 'all: %s\n\n' "$project_name" >> Makefile;
# shellcheck disable=SC2016
printf 'lib: $(OBJECTS)\n\n' >> Makefile;
printf 'clean:\n' >> Makefile;
# shellcheck disable=SC2016
printf '\t$(RM) $(OBJECTS) %s\n\n' "$project_name" >> Makefile;
printf 'obj/%%.o: src/%%.c\n' >> Makefile;
# shellcheck disable=SC2016
printf '\t$(CC) $(CFLAGS) -c $^ -o $@\n' >> Makefile;
_log "Creating .gitignore"
printf 'obj/*\n%s\n' "$project_name" > .gitignore;
;;
None) echo "nyan";;
*) echo "k bai"; return;;
esac;
_log "Creating Git repository";
git init; git add -v .;
_log "Commiting base project";
git commit -m 'Initial commit';
_log "Adding remote";
git remote add origin "ssh://git@[201:4230::a949:3323:1d96:1979]:2222/hkc/$project_name";
_log "Pushing";
git push --set-upstream origin master;
;;
esac;
}
pcolor() {
if [ "$1" = "all" ]; then pcolor nrm 256 true; return $?; fi;
if [ "$1" = "" ]; then pcolor nrm; return $?; fi;
_tex() {
if [ "$1" = "" ]; then
printf "\033[40m %-56s \033[0m\n" "";
else
printf "\033[40;37m %-56s \033[0m\n" "$1";
fi;
}
while [ "$#" -ge 1 ]; do
local opt="$1"; shift;
case "$opt" in
sep) _tex "";;
nrm) _tex "Normal";
for((i=40;i<48;i++)); do
printf "\033[40m %3d \033[%dm" "$i" "$i";
for((j=30;j<38;j++)); do
printf "\033[%dm%3d" "$j" "$j";
done;
for((j=90;j<98;j++)); do
printf "\033[%dm%3d" "$j" "$j";
done;
printf "\033[40m \033[0m\n";
done;
for((i=100;i<108;i++)); do
printf "\033[40m %3d \033[%dm" "$i" "$i";
for((j=30;j<38;j++)); do
printf "\033[%dm%3d" "$j" "$j";
done;
for((j=90;j<98;j++)); do
printf "\033[%dm%3d" "$j" "$j";
done;
printf "\033[40m \033[0m\n";
done;
_tex "";;
256) _tex "6x6x6 cube + 24 grayscale";
for((y=0;y<18;y++)); do
printf "\033[40m %02x->%02x " \
"$((y * 12 + 16))" \
"$((y * 12 + 16 + 11))";
for((x=0;x<12;x++)); do
i=$((x + y * 12 + 16));
printf "\033[48;5;%dm %3d" "$i" "$i";
done;
printf "\033[40m \033[0m\n";
done;
printf "\033[40m %02x->%02x " "232" "255";
for((i=232;i<=255;i++)); do
printf "\033[48;5;%dm%02x" "$i" "$i";
done;
printf "\033[40m \033[0m\n";
_tex "";;
true) _tex "24bit RGB TrueColor";
for((y=0;y<48;y+=2)); do
printf "\033[40m ";
for((x=0;x<48;x++)); do
b_r=$((x * 256 / 48));
b_g=$((y * 256 / 48));
b_b=$(((x + y) * 256 / 48));
f_r=$((x * 256 / 48));
f_g=$(((y + 1) * 256 / 48));
f_b=$(((x + y + 1) * 256 / 48));
printf "\033[48;2;%d;%d;%d;38;2;%d;%d;%dm\u2584" \
"$b_r" "$b_g" "$b_b" "$f_r" "$f_g" "$f_b";
done;
printf "\033[40m \033[0m\n";
done;
_tex;;
esac;
done
}
lscolors() {
if [ "$1" = "all" ]; then
lscolors nrm bri 256 true;
return $?;
fi;
if [ "$1" = "" ]; then
lscolors nrm bri;
return $?;
fi;
local fcn="\033[%dm \033[0m";
local fcc="\033[%dm\033[%dm %3d \033[0m";
if [ "$1" = "nrm" ]; then shift;
printf "\033[40m %-56s \033[0m\n" "";
printf "\033[40m %-56s \033[0m\n" "Normal";
printf "\033[40m ";
for((i=40;i<48;i++)); do printf "$fcn" $i; done;
printf "\033[40m \033[0m\n";
printf "\033[40m ";
for((i=40;i<48;i++)); do printf "$fcc" $i 97 $i; done;
printf "\033[40m \033[0m\n";
printf "\033[40m ";
for((i=40;i<48;i++)); do printf "$fcn" $i; done;
printf "\033[40m \033[0m\n";
fi;
if [ "x$1" = "xbri" ]; then shift;
printf "\033[40m %-56s \033[0m\n" "";
printf "\033[40m %-56s \033[0m\n" "Bright";
printf "\033[40m ";
for((i=100;i<108;i++)); do printf "$fcn" $i; done;
printf "\033[40m \033[0m\n";
printf "\033[40m ";
for((i=100;i<108;i++)); do printf "$fcc" $i 30 $i; done;
printf "\033[40m \033[0m\n";
printf "\033[40m ";
for((i=100;i<108;i++)); do printf "$fcn" $i; done;
printf "\033[40m \033[0m\n";
fi;
if [ "x$1" = "x256" ]; then shift;
printf "\033[40m %-56s \033[0m\n" "";
printf "\033[40m %-56s \033[0m\n" "256 Colors palette";
for((y=0;y<32;y++)); do
printf "\033[40m ";
for((x=0;x<8;x++)); do
i=$((y * 8 + x));
if [ "$i" -le 7 ]; then n=15;
elif [ "$i" -le 15 ]; then n=0;
elif [ "$i" -ge 232 ]; then n=$((255 - i + 232));
else
ni=$((i - 16));
nb=$((5 - (ni % 6))); ni=$((ni / 6));
ng=$((5 - (ni % 6))); ni=$((ni / 6));
nr=$((5 - (ni % 6)));
n=$((16 + nb + ng * 6 + nr * 36));
fi
printf "\033[48;5;%d;38;5;%dm %3d \033[40m" $i $n $i;
done;
printf "\033[40m \n";
done
fi;
if [ "x$1" = "x256blk" ]; then shift;
printf "\033[40m %-32s \033[0m\n" "";
printf "\033[40m %-32s \033[0m\n" "256 Colors palette";
for((y=0;y<16;y++)); do
printf "\033[40m ";
for((x=0;x<16;x++)); do
i=$((y * 16 + x));
printf "\033[48;5;%dm \033[40m" $i;
done;
printf "\033[40m \n";
done
fi;
if [ "x$1" = "xtrue" ]; then shift;
printf "\033[40m %-56s \033[0m\n" "";
printf "\033[40m %-56s \033[0m\n" "TrueColor";
for ((y=0;y<56;y=y+2)); do
printf "\033[40m ";
for((x=0;x<56;x++)); do
r1=$((x * 255 / 56));
g1=$((255 * (56 - y) / 56));
b1=$((255-r1));
r2=$((x * 255 / 56));
g2=$((255 * (56 - (y + 1)) / 56));
b2=$((255-r2));
printf "\033[48;2;%d;%d;%d;38;2;%d;%d;%dm\u2584" \
"$r1" "$g1" "$b1" "$r2" "$g2" "$b2";
done;
printf "\033[40m \n";
done;
fi;
printf "\033[40m %-56s \033[0m\n" "";
}
exper() {
case "$1" in
c) filename="$(mktemp "tmpXXXXXXXX.c" --tmpdir)";
printf '#include <stdio.h>\n\nint main(void)\n{\n return 0;\n}' > "$filename";
binary="${filename/.c/}";
echo "filename=${filename} binary=${binary}";
nvim -O "$filename" \
"term://ronchange '$filename' sh -c 'set -xe; \
gcc -o $binary $filename -Wall -pedantic \
-std=c99 -lm; sleep 0.2; time $binary'";
;;
cpp) filename="$(mktemp "tmpXXXXXXXX.cpp" --tmpdir)";
printf 'int main(void)\n{\n return 0;\n}' > "$filename";
binary="${filename/.cpp/}";
echo "filename=${filename} binary=${binary}";
nvim -O "$filename" \
"term://ronchange '$filename' sh -c 'set -xe; \
g++ -o $binary $filename -Wall -pedantic \
-lm; sleep 0.2; time $binary'";
;;
rs) filename="$(mktemp "tmpXXXXXXXX.rs" --tmpdir)";
printf 'fn main() {\n\n}' > "$filename";
binary="${filename/.rs/}";
echo "filename=${filename} binary=${binary}";
nvim -O "$filename" \
"term://ronchange '$filename' sh -c 'set -xe; \
rustc $filename -o $binary; sleep 0.2; time $binary'";
;;
py) filename="$(mktemp "tmpXXXXXXXX.py" --tmpdir)";
printf 'print("Hi")' > "$filename";
nvim -O "$filename" \
"term://ronchange '$filename' python3 '$filename'";
;;
sh) filename="$(mktemp "tmpXXXXXXXX.sh" --tmpdir)";
printf '#!/bin/sh\necho hi' > "$filename";
nvim -O "$filename" \
"term://ronchange '$filename' /bin/sh '$filename'";
;;
lua) filename="$(mktemp "tmpXXXXXXXX.lua" --tmpdir)";
printf 'print("meow")' > "$filename";
nvim -O "$filename" \
"term://ronchange '$filename' /sbin/lua '$filename'";
;;
java) dirname="$(mktemp "tmpXXXXXXXX-java" --tmpdir -d)";
printf "public class Experiment {\n public static void main(String[] args) {\n\n }\n}\n" > "$dirname/Experiment.java";
nvim -O "$dirname/Experiment.java" \
"term://ronchange '$dirname/Experiment.java' sh -c 'cd $dirname; set -xe; javac Experiment.java; java Experiment'";
;;
*) return;;
esac;
}
k8shelper() {
cmd="$1"; shift;
case "$cmd" in
pod_name_from_ip)
kubectl get --all-namespaces --output json pods | jq -r ".items[] | select(.status.podIP==\"$1\").metadata | \"\\(.namespace)/\\(.name)\"";;
logwatch) kubectl logs -n "${1}" -f "$(kubectl get pod -n "${1}" | grep "${2}" | head -n 1 | awk '{print$1}')";;
logall)
namespace="${1}";
local pid_list=()
while read -r pod_name; do
kubectl logs -n "${namespace}" "${pod_name}" -f | awk "{print\"${pod_name}: \"\$0}" & bg >/dev/null 2>&1;
pid_list+=("$$");
done < <(kubectl get pod -n "${namespace}" | grep -v 'NAME' | awk '{print$1}');
read -r;
for log_pid in "${pid_list[@]}"; do
kill "${log_pid}";
done;
;;
shell)
namespace="${1}"; shift;
partial_name="${1}"; shift;
pod_name="$(kubectl get pod -n "${namespace}" | grep "${partial_name}" | head -n 1 | awk '{print$1}')";
kubectl exec -n "${namespace}" -it "${pod_name}" -- sh -c "bash || ash || sh";;
exec)
namespace="${1}"; shift;
partial_name="${1}"; shift;
pod_name="$(kubectl get pod -n "${namespace}" | grep "${partial_name}" | head -n 1 | awk '{print$1}')";
kubectl exec -n "${namespace}" -it "${pod_name}" -- "${@}";;
nodeport)
NODE_PORT=$(kubectl get --namespace "${1}" -o jsonpath="{.spec.ports[0].nodePort}" services "${2}");
NODE_IP=$(kubectl get nodes --namespace "${1}" -o jsonpath="{.items[0].status.addresses[0].address}");
echo "${NODE_IP}:${NODE_PORT}";
;;
*) return;;
esac;
}
bandcampdl() {
url="${1}";
YT_DLP_COMMAND="yt-dlp -f "'bestaudio[ext=mp3]/bestaudio'" --add-metadata --embed-thumbnail --extract-audio --audio-format mp3 --retries infinite";
echo "${YT_DLP_COMMAND}";
curl "${url}" -fsSL | grep -oP '/(track|album)/[^"]+' | sort -r | uniq \
| while read -r name; do
if [[ "${name}" =~ /album/ ]]; then
$YT_DLP_COMMAND -o '%(playlist)s/%(playlist_autonumber)2d - %(title)s.%(ext)s' "${url}${name}"
elif [[ "${name}" =~ /track/ ]]; then
$YT_DLP_COMMAND -o '%(title)s.%(ext)s' "${url}${name}"
else
echo "oopsie! ${name} is invalid";
fi
done
}
fded() {
readarray -t filelist < <(fd "$@");
if [ "${#filelist[@]}" = 0 ]; then
echo "No files found";
elif [ "${#filelist[@]}" = 1 ]; then
nvim "${filelist[0]}";
else
printf "%s\n" "${filelist[@]}" | gum filter | xargs nvim
fi
}