bash/.bash_aliases
2025-05-25 22:41:22 +02:00

707 lines
25 KiB
Bash
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Basic Colors
BLACK=$'\e[30m'
RED=$'\e[31m'
GREEN=$'\e[32m'
YELLOW=$'\e[33m'
BLUE=$'\e[34m'
MAGENTA=$'\e[35m'
CYAN=$'\e[36m'
WHITE=$'\e[37m'
# Styles
BOLD=$'\e[1m'
ITALIC=$'\e[3m'
UNDERLINE=$'\e[4m'
BLINK=$'\e[5m' # May not work in all terminals
INVERT=$'\e[7m' # Invert foreground/background
STRIKE=$'\e[9m' # Strikethrough
# Reset
NC=$'\e[0m' # Reset all styles/colors
# Functions to store messages
echo_error() {
_MESSAGES[error]+="${RED}$@${NC}\n"
}
echo_missing() {
_MESSAGES[missing]+="${YELLOW} 󱥸 $@${NC}\n"
}
echo_warning() {
_MESSAGES[warn]+="${YELLOW}⚠️ $@${NC}\n"
}
echo_info() {
_MESSAGES[info]+="${CYAN} $@${NC}\n"
}
alias sudo="sudo -E"
alias please="sudo"
alias whoami="command echo 'Ghost in a shell..'"
# ─< easier dir up >────────────────────────────────────────────────────────────────────────
alias ..="cd .."
# ─< colored ip >───────────────────────────────────────────────────────────────────
alias ip="ip --color=always"
if command_exists curl; then
# ─< linutil >────────────────────────────────────────────────────────────────────────────
alias linutil="curl -fsSL https://christitus.com/linux | sh"
alias "linutil-dev"="curl -fsSL https://christitus.com/linuxdev | sh"
# ─< weather >──────────────────────────────────────────────────────────────────────────────
alias www="curl wttr.in/Ulm"
else
echo_missing "curl"
fi
# ─< check for rg >─────────────────────────────────────────────────────────────────────────
if command_exists rg; then
alias grep="rg --color=always"
alias hl="rg --passthrough"
else
echo_missing "ripgrep"
alias grep="grep --color=always"
alias hl="grep --passthrough"
fi
# ─< define copy command >────────────────────────────────────────────────────────────────
if command_exists wl-copy; then
copy() {
if cat "$1"; then
command cat "$1" | wl-copy
else
"$1" | wl-copy
fi
}
elif command_exists xclip; then
copy() {
if cat "$1"; then
command cat "$1" | wl-copy
else
"$1" | xclip -selection clipboard
fi
}
else
echo_missing "wl-clipboard | xclip"
fi
# ─< telnet (starwars) >────────────────────────────────────────────────────────────────────
if command_exists telnet; then
alias starwars="telnet -a telehack.com"
fi
if command_exists hyprpanel; then
alias get_cpu='for i in /sys/class/hwmon/hwmon*/temp*_input; do echo "$(<$(dirname $i)/name): $(cat ${i%_*}_label 2>/dev/null || echo $(basename ${i%_*})) $(readlink -f $i)"; done'
fi
# ─< rsync >────────────────────────────────────────────────────────────────────────────────
if command_exists rsync; then
alias scp="rsync -avP"
alias cp="rsync -avP"
else
echo_missing "rsync"
fi
# ─< Function to determine which Neovim command to use >──────────────────────────────────
choose_nvim() {
if [ -n "$TMUX" ]; then
# If inside an active tmux session, use nvim
echo "command nvim"
return
elif [ -n "$DISPLAY" ] || [ -n "$WAYLAND_DISPLAY" ]; then
# If in a graphical environment, use Neovide
if command_exists neovide; then
echo "neovide --fork"
return
fi
fi
# Default to nvim
echo "command nvim"
}
# Set up Neovim aliases based on environment
if command_exists nvim; then
alias cnvim="command nvim"
alias nvim="$(choose_nvim)"
nv() {
appname="$1"
shift
if [ "$#" -eq 0 ]; then
NVIM_APPNAME="$appname" command nvim
else
NVIM_APPNAME="$appname" command nvim "$@"
fi
}
if [ -d "$HOME/.config/nvdev" ]; then
alias nvdev='NVIM_APPNAME="nvdev" command nvim'
alias neodev='NVIM_APPNAME="nvdev" neovide --fork'
fi
else
echo_missing "neovim"
fi
# ─< cli explorer >───────────────────────────────────────────────────────────────────────
if command_exists yazi; then
echo_info "yazi is the explorer of choice"
# ─< yazi move when exit >────────────────────────────────────────────────────────────────
function y() {
local tmp="$(mktemp -t "yazi-cwd.XXXXXX")" cwd
yazi "$@" --cwd-file="$tmp"
if cwd="$(command cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then
builtin cd -- "$cwd"
fi
rm -f -- "$tmp"
}
alias lf="y || ya pack -i"
elif command_exists ranger; then
echo_info "ranger is the explorer of choice"
alias lf="ranger"
elif command_exists lf; then
echo_info "lf is the explorer of choice"
else
echo_missing "yazi"
fi
# ─< colorized ls >─────────────────────────────────────────────────────────────────────────
if command_exists exa; then
alias ls="exa --icons -l --git"
alias l="exa --long --no-filesize --no-permissions --no-time --git --colour-scale --icons"
alias ll="exa --all --long --no-filesize --no-permissions --no-time --git --colour-scale --icons"
alias tree="exa --icons -l --tree"
elif command_exists lsd; then
alias ls="lsd -l -1 -h1 --almost-all --git"
alias l="lsd -1"
alias ll="lsd -1 --almost-all"
alias clearl="command clear && l"
alias tree="lsd --tree"
elif command_exists eza; then
alias ls="eza --icons --long --git"
alias l="eza --icons -l"
alias ll="eza --icons -laa"
alias tree="eza --icons -l --tree"
else
echo_missing "exa | eza | lsd"
alias ls="ls --color=always -lAph"
alias l="ls --color=always -lph -w1"
alias ll="ls --color=always -lph"
fi
# ─< t stands for trash(-cli) >───────────────────────────────────────────────────────────────
if command_exists trash; then
alias rm="trash $@"
alias t="trash"
elif command_exists trash-cli; then
alias rm="trash-cli $@"
alias t="trash-cli"
else
echo_missing "trash-cli"
fi
# ─< bat alias >────────────────────────────────────────────────────────────────────────────
if command_exists batcat; then
alias cat="batcat --color=always -p --paging=never"
alias less="batcat --paging always --color=always"
# alias gd="batcat --diff"
elif command_exists bat; then
alias cat="bat --color=always -p"
alias less="bat --paging always --color=always"
# alias gd="bat --diff"
else
echo_missing "bat"
fi
# ─< fastfetch >────────────────────────────────────────────────────────────────────────────
if command_exists fastfetch; then
alias ff="fastfetch"
alias clearff="command clear & fastfetch"
alias clearf="command clear & fastfetch"
if fastfetch --config os >/dev/null 2>&1; then
alias f="fastfetch --config os"
else
git clone https://git.k4li.de/mirrors/fastfetch.git "$HOME/.local/share/fastfetch" >/dev/null 2>&1
exec "$SHELL"
fi
else
echo_missing "fastfetch"
fi
# INFO:
# ╭──────────────────╮
# │ containerization │
# ╰──────────────────╯
__podman__() {
alias up="podman-compose up"
alias down="podman-compose down"
alias pull="podman-compose pull"
alias dr="podman run --rm -it"
alias drs="podman-compose down && podman-compose up -d --remove-orphans --force-recreate"
alias ds="podman ps -a --format 'table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'"
alias dcs="podman-compose ps -a --format 'table {{.Name}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'"
alias dl="podman-compose logs -f"
alias dc="podman-compose"
}
__docker__() {
alias up="docker compose up"
alias down="docker compose down"
alias pull="docker compose pull"
alias d="docker"
alias dr="docker run --rm -it"
alias drs="docker compose down && docker compose up -d --remove-orphans --force-recreate"
alias ds="docker ps -a --format 'table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'"
alias dcs="docker compose ps -a --format 'table {{.Name}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'"
alias dl="docker compose logs -f"
alias dc="docker compose"
# check_for_updates() {
# if ! command -v jq &>/dev/null; then
# echo -e "${RED}Error: jq is required but not installed. Please install jq.${NC}"
# return 1
# fi
#
# if ! docker compose version &>/dev/null; then
# echo -e "${RED}Error: docker compose is not available.${NC}"
# return 1
# fi
#
# local updated=false
# local images
# images=$(docker compose config --format json | jq -r '.services[] | .image' 2>/dev/null)
#
# if [[ -z "$images" ]]; then
# echo -e "${RED}Error: No Docker images found in the compose configuration.${NC}"
# return 1
# fi
#
# for image in $images; do
# echo -e "${CYAN}Checking for updates for image: ${YELLOW}$image${NC}"
#
# # Get local image digest
# local local_digest
# local_digest=$(docker image inspect "$image" --format '{{index .RepoDigests 0}}') # 2>/dev/null
#
# # If no local digest exists, force check
# if [[ -z "$local_digest" ]]; then
# echo -e "${YELLOW}Image not present locally. Update needed.${NC}"
# updated=true
# continue
# fi
#
# # Get remote digest using pull --dry-run
# local remote_digest
# remote_digest=$(docker pull --quiet "$image" 2>/dev/null | awk '/Digest:/{print $2}')
#
# # Fallback to manifest inspect if dry-run fails
# if [[ -z "$remote_digest" ]]; then
# remote_digest=$(DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect -v "$image" | jq -r '.Descriptor.digest')
# fi
#
# if [[ -z "$remote_digest" ]]; then
# echo -e "${RED}Failed to retrieve remote digest. Performing forced check...${NC}"
# # Fallback method: Pull image and compare before/after digests
# local pre_pull_digest=$(docker image inspect "$image" --format '{{index .RepoDigests 0}}')
# docker pull --quiet "$image" >/dev/null
# local post_pull_digest=$(docker image inspect "$image" --format '{{index .RepoDigests 0}}')
#
# if [[ "$pre_pull_digest" != "$post_pull_digest" ]]; then
# echo -e "${GREEN}Update found during forced pull${NC}"
# updated=true
# fi
# continue
# fi
#
# # Compare digests
# if [[ "$local_digest" != "$remote_digest" ]]; then
# echo -e "${GREEN}Update available for $image${NC}"
# updated=true
# else
# echo -e "${YELLOW}No update available for $image${NC}"
# fi
# done
#
# if $updated; then
# echo -e "${CYAN}Pulling updates and recreating containers...${NC}"
# docker compose pull --quiet && docker compose up -d --force-recreate
# else
# echo -e "${GREEN}All images are up to date. No action needed.${NC}"
# fi
# }
# Check for required dependencies
check_for_updates() {
local compose_cmd
# Determine available compose command
if command -v docker-compose &>/dev/null; then
compose_cmd="docker-compose"
elif docker compose version &>/dev/null; then
compose_cmd="docker compose"
else
echo "Error: docker-compose or docker compose not found."
return 1
fi
# Check for compose file
if [ ! -f docker-compose.yml ] && [ ! -f docker-compose.yaml ] && [ ! -f compose.yml ]; then
echo "Error: No docker-compose.yml/yaml found in current directory."
return 1
fi
# Pull images and capture output
local pull_output
if ! pull_output=$(LC_ALL=C $compose_cmd pull 2>&1); then
echo "Error pulling images:"
echo "$pull_output"
return 1
fi
# Check for updated images
local updated=0
if echo "$pull_output" | grep -q "Downloaded newer image"; then
updated=1
fi
# Update containers if needed
if [ $updated -eq 1 ]; then
echo "Updates found. Updating containers..."
$compose_cmd up -d
echo "Cleaning up old images..."
docker system prune -f
echo "Update completed."
else
echo "All containers are up to date. Current versions:"
$compose_cmd images | awk '{if(NR>1) print $2, $3, $4}'
fi
}
alias appupdate="check_for_updates"
if ! command_exists gmd; then
alias gmd='bash -c "$(curl -sLo- https://raw.githubusercontent.com/ajayd-san/gomanagedocker/main/install.sh)" && "$SHELL"'
fi
# ─< install lazydocker >─────────────────────────────────────────────────────────────────
alias inst_lazydocker="curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash"
}
# INFO:
# ╭─────╮
# │ git │
# ╰─────╯
__git__() {
# ─< lazygit >────────────────────────────────────────────────────────────────────────────
if command_exists lazygit; then
alias lg="lazygit"
fi
# ───────────────────────────────────────< aliases >─────────────────────────────────────
alias g="git"
alias gs="git status -sb"
alias gsl="git status"
alias gm='git checkout main && git merge'
alias gc="git clone --recurse-submodule"
alias gd="git diff"
# alias ga="gd $1 && git add"
alias gp='echo "${CYAN}Updating submodules..${NC}" && git submodule update --init --recursive && echo "${CYAN}Pulling down submodules..${NC}" && git pull --recurse-submodule'
alias gms='git maintenance start'
alias gcm="git commit -m"
alias gpu="git push --recurse-submodule=on-demand"
# ╭──────────────────────────────────────╮
# │ git add with commit like.. │
# │ `git add "<file>" "<commitmessage>"` │
# │ .. or like `git add "<file>"` │
# ╰──────────────────────────────────────╯
ga() {
if [ -n "$2" ]; then
git diff ${1:-.}
git add ${1:-.}
git commit -m "$2"
else
git diff ${1:-.}
git add ${1:-.}
fi
}
# ──────────────────────────────────────< functions >────────────────────────────────────
# use git clone directly with <username>/<repo>
# ex: gcl pik4li/ReDeploy.git --> https://github.com/pik4li/ReDeploy.git
gcl() {
if [ -z "$2" ]; then
git clone --depth=1 "https://github.com/$1"
else
git clone --depth=1 "https://github.com/$1" "$2"
fi
}
# the same with my own github server
gck() {
if [ -z "$2" ]; then
git clone --recurse-submodules --depth=1 "https://git.k4li.de/$1"
else
git clone --recurse-submodules --depth=1 "https://git.k4li.de/$1" "$2"
fi
}
# and to clone with ssh
gcs() {
if [ -z "$2" ]; then
git clone --recurse-submodules --depth=1 "git@git.k4li.de:$1"
else
git clone --recurse-submodules --depth=1 "git@git.k4li.de:$1" "$2"
fi
}
# submodule update, goes in every submodule, put't it to main, and pulls down the changes
# It then pulls down every change and commits it
gsu() {
echo "${CYAN}Updating submodules recursively with -> ${YELLOW}${BOLD}git submodule update --init --recursive${NC}"
git submodule update --init --recursive &&
echo "${CYAN}${BOLD}-- Updated submodules recursively --${NC}"
echo "${CYAN}${BOLD}-- Checking submodule branches... --${NC}"
git submodule foreach '
echo "${RED}Submodule: $name ${NC}"
branch=$(git symbolic-ref --short HEAD 2>/dev/null || echo "detached")
if [ "$branch" = "detached" ]; then
default_branch=$(git config -f $toplevel/.gitmodules submodule.$name.branch || echo "main")
echo "${RED}${BOLD}Submodule $name is detached. Checking out ${YELLOW} $default_branch${RED}...${NC}"
git checkout $default_branch
else
echo "${GREEN}${BOLD}Submodule $name is on branch $branch.${NC}"
fi
'
echo "${CYAN}Pulling down updates recursively with -> ${YELLOW}${BOLD}git submodule foreach git pull --recurse-submodule${NC}"
git submodule foreach git pull --recurse-submodule &&
echo "${GREEN}${BOLD}-- pulled down submodules recursively --${NC}"
gUpdateModules() {
if ! git diff --exit-code .; then
echo "${CYAN}${BOLD}Staging changes...${NC}"
git add . || echo "GIT ADD MISSFUNCTION"
sleep 0.3
if git commit -m " update: submodules"; then
echo "${GREEN}${BOLD}commit message ${RED}' update: submodules'${GREEN} successfully commited${NC}"
else
echo "${RED}${BOLD}Failed to commit changes.${NC}"
return 1
fi
else
echo "${GREEN}${BOLD}No changes to commit.${NC}"
return 1
fi
}
if gUpdateModules; then
if git push; then
echo "${GREEN}${BOLD}Push successful.${NC}"
else
echo "${RED}${BOLD}Failed to push changes.${NC}"
return 1
fi
fi
}
# gwip command, to quickly add files and commit and push them directly in one command
# ex: gwip . -> will git add . && git commit -m "gwip" && git push
# ex: gwip "Files changed" -> "Files changed" is now the description, instead of gwip.
# ex: gwip install.sh -> will only add and commit/push the file 'install.sh' and commit with wip
gwip() {
# Fetch the latest changes from the remote
git fetch
# Get the current branch name
local branch
branch=$(git rev-parse --abbrev-ref HEAD)
# Check if there are any changes on the remote branch
if git diff --quiet "$branch" "origin/$branch"; then
if [ -n "$2" ]; then
local commit_files="${1:-.}"
local commit_message="${2:-wip}"
else
local commit_message="${1:-wip}"
fi
echo "${CYAN}No changes on the remote branch. Adding changes and pushing with ${RED}${BOLD}'$commit_message'${NC}${CYAN} commit.${NC}"
git add "${commit_files:-.}"
git commit -m "$commit_message"
git push
else
echo "${RED}${BOLD}There are changes on the remote branch. Please pull the latest changes first.${NC}"
fi
}
[[ -f "$HOME/go/bin/lazygit" ]] &&
alias lazygit="$HOME/go/bin/lazygit" &&
alias lg="lazygit"
}
# ─< wireshark / termshark alias >────────────────────────────────────────────────────────
if command_exists termshark; then
alias ws="$_sudo termshark"
fi
# Tmux session manager
if command_exists tmux; then
ta() {
if tmux list-sessions >/dev/null 2>&1; then
echo "-- tmux session active! | Connecting to active session --"
sleep 0.1
tmux attach
else
echo "-- No tmux session found! | Creating one --"
sleep 0.1
tmux
fi
}
alias ts="tmux source $HOME/.tmux.conf"
else
echo_missing "tmux"
fi
# Zellij session manager
# if command_exists zellij; then
# za() {
# # local zsession='zellij list-sessions | tail -1 | grep -q EXITED'
# if ! zellij list-sessions >/dev/null 2>&1; then
# echo "-- Zellij session active! | Connecting to existing session --"
# sleep 0.3
# zellij attach
# elif ! zellij list-sessions | tail -1 | grep -q EXITED; then
# echo "-- Zellij session active! | Connecting to existing session --"
# sleep 0.3
# zellij attach
# else
# echo "-- No Zellij session active! | Creating one --"
# sleep 0.3
# zellij
# fi
# }
# alias ta="za"
#
# # alias zs="zellij setup --dump-config > $HOME/.config/zellij/config.yaml"
# fi
# Function to get the IP address
get_ip() {
ip a | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d/ -f1 | head -n 1
}
# ─< h stands for HUGO >──────────────────────────────────────────────────────────────────
if command_exists hugo; then
alias h='hugo'
alias hs='hugo server -D --noHTTPCache --disableFastRender' # --bind "$(get_ip)"'
fi
__get_Packager__() {
# Load OS release information
[ -f /etc/os-release ] && . /etc/os-release || return 1
DISTRO="${ID}:${ID_LIKE}"
case "$DISTRO" in
*debian*)
pkg_install() {
if command_exists nala; then
$_sudo nala install --assume-yes "$@"
else
$_sudo apt install --assume-yes "$@"
fi
}
if command_exists nala; then
alias search="nala search"
alias update="$_sudo nala update && $_sudo nala upgrade --full"
alias remove="$_sudo nala purge"
else
alias search="apt-cache search"
alias update="$_sudo apt update && $_sudo apt upgrade"
alias remove="$_sudo apt purge"
fi
alias unbreak="$_sudo dpkg --configure -a"
alias install="pkg_install"
;;
*arch*)
pkg_install() {
if command_exists paru; then
paru -S --color always --noconfirm --needed "$@"
elif command_exists yay; then
yay -S --color always --noconfirm --needed "$@"
else
$_sudo pacman -S --color always --noconfirm --needed "$@"
fi
}
if command_exists paru; then
alias search="paru -Ss --color always"
# alias install="paru -S --color always --noconfirm"
alias update="paru -Syu --color always"
alias remove="paru -R --color always"
elif command_exists yay; then
alias search="yay -Ss --color always"
# alias install="yay -S --noconfirm --color always"
alias update="yay -Syu --color always"
alias remove="yay -R --color always"
else
alias search="$_sudo pacman -Ss --color always"
# alias install="$_sudo pacman -S --noconfirm --color always"
alias update="$_sudo pacman -Syu --color always"
alias remove="$_sudo pacman -R --color always"
fi
alias install="pkg_install"
;;
*rhel* | *fedora*)
alias search="dnf search"
alias install="$_sudo dnf install -y --skip-missing"
alias update="$_sudo dnf update -y"
alias remove="$_sudo dnf remove -y"
;;
*suse*)
alias search="zypper search"
alias install="$_sudo zypper install --no-confirm"
alias update="$_sudo zypper update"
alias remove="$_sudo zypper remove"
;;
*alpine*)
alias install="$_sudo apk add"
alias update="$_sudo apk update && $_sudo apk upgrade"
alias remove="$_sudo apk del"
;;
*nixos*)
echo_info "Using NIX!!"
alias update="$_sudo nixos-rebuild switch"
# alias install="$_sudo nix-env -iA nixos."
install() {
"$_sudo nix-end -iA nixos.$@"
}
alias edit="$_sudo -E $EDITOR /etc/nixos/configuration.nix"
;;
*)
echo_error "Unsupported distro: $ID"
;;
esac
}
main() {
__get_Packager__
# ─< g stands for GIT >─────────────────────────────────────────────────────────────────────
if command_exists git; then
__git__
else
echo_missing "git"
fi
# ─< d stands for docker >──────────────────────────────────────────────────────────────────
if command_exists docker; then
__docker__
elif command_exists podman-compose; then
__podman__
else
echo_missing "docker | podman"
fi
}
main