#!/bin/bash ### tmux auto attach if command -v tmux &> /dev/null && [ -z "$TMUX" ]; then tmux attach -t default || tmux new -s default fi ### keychain eval "$(keychain -q --eval --timeout 60 --agents ssh,gpg)" export GPG_TTY=$(tty) ### PS1 # Farben BLUE='\[\e[34m\]' GREEN='\[\e[32m\]' RED='\[\e[31m\]' YELLOW='\[\e[33m\]' WHITE='\[\e[97m\]' BLACK='\[\e[30m\]' RESET='\[\e[0m\]' ORANGE='\[\e[0;33m\]' # git-symbole: * unstaged, + staged, $ stashed, % untracked export GIT_PS1_SHOWUNTRACKEDFILES=1 export GIT_PS1_SHOWDIRTYSTATE=1 export GIT_PS1_SHOWSTASHSTATE=1 export GIT_PS1_SHOWUPSTREAM="verbose" export GIT_PS1_SHOWCONFLICTSTATE="yes" export PS1="\n${BLUE}\u${GREEN}@${ORANGE}\$(cat /etc/hostname) \$(pwd | sed -E -e "s#/#${RED}/${RESET}${GREEN}#g")${YELLOW}\$(__git_ps1)${RESET}\n> " # https://unix.stackexchange.com/questions/105958/terminal-prompt-not-wrapping-correctly # alle Farben sind mit \[\] escaped, sonst kann die shelle die länge nicht richtig ausrechnen # https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh # https://gist.github.com/justintv/168835 # https://misc.flogisoft.com/bash/tip_colors_and_formatting # Zeige letzte Exit-Code: https://stackoverflow.com/questions/16715103/bash-prompt-with-the-last-exit-code ### Praktische Dinge # Deaktiviere FlowControl # https://unix.stackexchange.com/questions/332791/how-to-permanently-disable-ctrl-s-in-terminal stty -ixon # farben fur manpages # https://opensource.com/article/18/5/bash-tricks export LESS_TERMCAP_mb=$'\E[01;31m' export LESS_TERMCAP_md=$'\E[01;33m' export LESS_TERMCAP_me=$'\E[0m' export LESS_TERMCAP_se=$'\E[0m' export LESS_TERMCAP_so=$'\E[01;42;30m' export LESS_TERMCAP_ue=$'\E[0m' export LESS_TERMCAP_us=$'\E[01;36m' # bash history bei mehreren Session shopt -s histappend # bach History Zeitstempel am Anfang der Zeile export HISTTIMEFORMAT='[%F_%T] ' # typo bei cd entfernen shopt -s cdspell # less mit maus scrollen export LESS='--mouse --wheel-lines=3 eFRX' # deaktiviere alias von ll # weiter unten ist die FUnktion ll definiert die entweder exa oder ls ausführt unalias ll 2>/dev/null ### Funktionen function rgf { if [[ "$1" == "--help" ]]; then echo "Finde alle Dateien die "\$1" im Namen haben." echo "" echo " Usage: rgf " return 0 fi if [ -z "$1" ]; then echo "[ERROR] Suchbegriff fehlt..." return 1 fi if command -v rg >/dev/null ; then rg --ignore-case --files --hidden --glob=!.git/ *"$1"* else echo "[INFO] ripgrep ist nicht installiert... suche mit 'find'" find . -type f -not -path '*/\.git/*' -name *"$1"* fi } function rgi { if [[ "$1" == "--help" ]]; then echo "Finde alle Dateien die "\$1" im Inhalt haben." echo "" echo " Usage: rgi " return 0 fi if [ -z "$1" ]; then echo "[ERROR] Suchbegriff fehlt..." return 1 fi if command -v rg >/dev/null ; then rg --ignore-case --hidden --glob=!.git/ "$1" else echo "[INFO] ripgrep ist nicht installiert... suche mit 'grep'" grep --recursive --line-number --ignore-case --exclude-dir=".git" "$1" . fi } function ssh { # benennt das aktuelle tmux-windows nach dem ssh-ziel # baut ssh-verbindung auf if [ -n "${TMUX}" ]; then tmux rename-window "${@: -1}" fi command ssh "$@" if [ -n "${TMUX}" ]; then tmux rename-window "$(hostname -f)" fi } function gcm { if [ -z "$1" ]; then echo "Commit-Message fehlt, setze Default-Message..." git commit -s -m "changed Files: $(git diff --name-only --staged)" else # übergibt alle argumente an git commit -m als commit nachricht git commit -s -m "$*" fi } function gc { case "$1" in --help | -h) cat <>> Create new branch "'"$2"'"') || (git checkout --quiet "$2" > /dev/null 2>&1 && echo '>>> Branch already exists, checking out... ') ;; *) if [ ! -z $1 ] ; then (echo ">>> Try local checkout" && git checkout --quiet "$1" > /dev/null 2>&1) || (echo ">>> Try remote checkout" && git checkout --quiet -b "$1" origin/"$1" > /dev/null 2>&1 || echo ">>> Unkown branch!") else (git checkout --quiet master > /dev/null 2>&1 && echo '>>> Try checking out master') || (git checkout --quiet main > /dev/null 2>&1 && echo '>>> Try checking out main') || (git checkout --quiet release > /dev/null 2>&1 && echo '>>> Try checking out release') fi esac } function glogs { # https://git-scm.com/docs/pretty-formats # https://stackoverflow.com/questions/3631005/git-log-tabular-formatting # https://stackoverflow.com/questions/7736781/how-to-make-git-log-not-prompt-to-continue if [ -z "$1" ]; then ncommits=30; else ncommits="$1"; fi; git log --pretty=format:'%C(auto) %<|(16,trunc)%h %Cred %G?%Creset %<|(60,trunc)%s %<(20,trunc)%Cgreen%cr%Creset %<(15,trunc)%Cblue%an%Creset %Cred%D' --graph --all -$ncommits } function gp { git pull "$@" } function mdtoc { grep --recursive --include="*.md" ^# | sort --version-sort --field-separator=":" | awk 'BEGIN {FS=":"}{print $2 "&&" $1}' | column --table --separator "&&" --table-truncate 1,2 } # "scrolle" durch die commit-history ghist() { local total_commits=$(git rev-list HEAD --count) local current_commit=$total_commits show_commit_diff() { if [ $current_commit -le $total_commits ] && [ $current_commit -ge 1 ]; then local commit_hash=$(git rev-list --reverse HEAD | sed -n "${current_commit}p") git --no-pager show $commit_hash fi } while true; do clear # Clear the terminal show_commit_diff # Display navigation options echo "-----------------------------------------------------------" echo "Navigation: N - Next Commit, P - Previous Commit, Q - Quit" echo "-----------------------------------------------------------" read -n1 -s option case $option in p|P) if [ $current_commit -gt 1 ]; then ((current_commit--)) fi ;; n|N) if [ $current_commit -lt $total_commits ]; then ((current_commit++)) fi ;; q|Q) break ;; *) echo "Invalid option" ;; esac done } ### Aliase # tmux alias tmuxa="tmux a -t " alias tmuxn="tmux new -s " alias tmuxl="tmux ls" alias tmuxk="tmux kill-session -t" # abkuerzungen alias ip="ip --color=auto" alias cls="clear" alias tracert="traceroute" alias df="df -h" alias du="du -h" alias grep="grep -i --color=auto" alias hostname="hostname -f" alias untar="tar -xzf" alias unmount="umount" alias ru="rip url --max-quality 3 --codec fla" alias mkdir="mkdir -p" alias last="last -w" alias ll="ls -lAh" alias tree="tree -a -I **.git**" # git alias gs="git status" alias gf="git fetch" alias gdel="git reset --hard ; git clean -f" alias glast="git log -1 HEAD --stat" alias gd="git diff" alias gsp="git stage -p" # docker alias dcu="docker-compose up" alias dcd="docker-compose down" alias dcr="docker-compose down && docker-compose up -d" # safeguard alias mv="mv -i " alias cp="cp -i " alias rm="rm -i " # rest alias suspend="~/dotfiles/scripts/pwr.sh -sd" alias hibernate="~/dotfiles/scripts/pwr.sh -hb" alias restart="~/dotfiles/scripts/pwr.sh -r" alias shutdown="~/dotfiles/scripts/pwr.sh -s" alias reboot="~/dotfiles/scripts/pwr.sh -r"