From aca379914129f384d21fa70b8e9dab5e5d63e523 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Tue, 14 May 2024 00:18:48 +0200 Subject: [PATCH] Bash, Oh-My-Bash, SSH, Git --- .bash_profile | 10 + .bashrc | 52 ++- .../themes/agnoster-modded/README.md | 5 + .../agnoster-modded/agnoster-modded.theme.sh | 427 ++++++++++++++++++ .config/ssh/config | 11 + .gitconfig | 22 + .gitignore | 12 +- .profile | 3 + .ssh | 1 + 9 files changed, 540 insertions(+), 3 deletions(-) create mode 100644 .bash_profile create mode 100644 .config/oh-my-bash-custom/themes/agnoster-modded/README.md create mode 100644 .config/oh-my-bash-custom/themes/agnoster-modded/agnoster-modded.theme.sh create mode 100644 .config/ssh/config create mode 100644 .gitconfig create mode 100644 .profile create mode 120000 .ssh diff --git a/.bash_profile b/.bash_profile new file mode 100644 index 0000000..78ce8e2 --- /dev/null +++ b/.bash_profile @@ -0,0 +1,10 @@ +# Load login settings and environment variables +if [[ -f ~/.profile ]]; then + source ~/.profile +fi + +# Load interactive settings +if [[ -f ~/.bashrc ]]; then + source ~/.bashrc +fi + diff --git a/.bashrc b/.bashrc index 698d913..eac7f67 100644 --- a/.bashrc +++ b/.bashrc @@ -1,7 +1,55 @@ +################################# +## Check for Interactivy Shell ## +################################# case $- in *i*) ;; *) return;; esac -# Path to the oh-my-bash installation. -export OSH='/home/snoweuph/.config/.oh-my-bash' +################################# +## Oh My Bash ## +################################# +export OSH="$HOME/.config/oh-my-bash" +OSH_CUSTOM="$HOME/.config/oh-my-bash-custom" +OSH_THEME="agnoster-modded" +DEFAULT_USER=$(whoami) +ENABLE_CORRECTION=true +OMB_USE_SUDO=true + +completions=( + git + composer + ssh +) + +aliases=( + general +) + +plugins=( + git + bashmarks +) +source "$OSH"/oh-my-bash.sh + +################################# +## Application Envs ## +################################# + +# Volta +export PATH=$PATH:~/.local/bin +export VOLTA_HOME="$HOME/.volta" +export PATH="$VOLTA_HOME/bin:$PATH" + +# Podman as Docker on Immutable Distros +export DOCKER_HOST=unix:///run/user/1000/podman/podman.sock + +################################# +## Aliases ## +################################# + +alias nvim-conf="nvim ~/.config/nvim" +alias bash-conf="nvim #/.bashrc" + +alias nano="nvim" +alias neofetch="fastfetch" diff --git a/.config/oh-my-bash-custom/themes/agnoster-modded/README.md b/.config/oh-my-bash-custom/themes/agnoster-modded/README.md new file mode 100644 index 0000000..3ada140 --- /dev/null +++ b/.config/oh-my-bash-custom/themes/agnoster-modded/README.md @@ -0,0 +1,5 @@ +# agnoster modded + +```bash +DEFAULT_USER="username" +``` diff --git a/.config/oh-my-bash-custom/themes/agnoster-modded/agnoster-modded.theme.sh b/.config/oh-my-bash-custom/themes/agnoster-modded/agnoster-modded.theme.sh new file mode 100644 index 0000000..1837e72 --- /dev/null +++ b/.config/oh-my-bash-custom/themes/agnoster-modded/agnoster-modded.theme.sh @@ -0,0 +1,427 @@ +#! bash oh-my-bash.module + +PROMPT_DIRTRIM=${PROMPT_DIRTRIM:-2} # bash4 and above + +###################################################################### +## Configurations in Oh My Bash + +OMB_PROMPT_SHOW_PYTHON_VENV=${OMB_PROMPT_SHOW_PYTHON_VENV:=true} + +###################################################################### +DEBUG=0 +function debug { + if [[ ${DEBUG} -ne 0 ]]; then + >&2 echo -e "$@" + fi +} + +###################################################################### +### Segment drawing +# A few utility functions to make it easy and re-usable to draw segmented prompts + +CURRENT_BG='NONE' +CURRENT_RBG='NONE' +SEGMENT_SEPARATOR='' +RIGHT_SEPARATOR='' +LEFT_SUBSEG='' +RIGHT_SUBSEG='' + +function text_effect { + case "$1" in + reset) echo 0;; + bold) echo 1;; + underline) echo 4;; + esac +} + +# to add colors, see +# http://bitmote.com/index.php?post/2012/11/19/Using-ANSI-Color-Codes-to-Colorize-Your-Bash-Prompt-on-Linux +# under the "256 (8-bit) Colors" section, and follow the example for orange below +function fg_color { + case "$1" in + black) echo 30;; + red) echo 31;; + green) echo 32;; + yellow) echo 33;; + blue) echo 34;; + magenta) echo 35;; + cyan) echo 36;; + white) echo 37;; + orange) echo 38\;5\;166;; + esac +} + +function bg_color { + case "$1" in + black) echo 40;; + red) echo 41;; + green) echo 42;; + yellow) echo 43;; + blue) echo 44;; + magenta) echo 45;; + cyan) echo 46;; + white) echo 47;; + orange) echo 48\;5\;166;; + esac; +} + +# TIL: declare is global not local, so best use a different name +# for codes (mycodes) as otherwise it'll clobber the original. +# this changes from BASH v3 to BASH v4. +function ansi { + local seq + local -a mycodes=("${!1}") + + debug "ansi: ${!1} all: $* aka ${mycodes[@]}" + + seq="" + local i + for ((i = 0; i < ${#mycodes[@]}; i++)); do + if [[ -n $seq ]]; then + seq="${seq};" + fi + seq="${seq}${mycodes[$i]}" + done + debug "ansi debug:" '\\[\\033['${seq}'m\\]' + echo -ne '\[\033['${seq}'m\]' + # PR="$PR\[\033[${seq}m\]" +} + +function ansi_single { + echo -ne '\[\033['$1'm\]' +} + +# Begin a segment +# Takes two arguments, background and foreground. Both can be omitted, +# rendering default background/foreground. +function prompt_segment { + local bg fg + local -a codes + + debug "Prompting $1 $2 $3" + + # if commented out from kruton's original... I'm not clear + # if it did anything, but it messed up things like + # prompt_status - Erik 1/14/17 + + # if [[ -z $1 || ( -z $2 && $2 != default ) ]]; then + codes=("${codes[@]}" $(text_effect reset)) + # fi + if [[ -n $1 ]]; then + bg=$(bg_color $1) + codes=("${codes[@]}" $bg) + debug "Added $bg as background to codes" + fi + if [[ -n $2 ]]; then + fg=$(fg_color $2) + codes=("${codes[@]}" $fg) + debug "Added $fg as foreground to codes" + fi + + debug "Codes: " + # local -p codes + + if [[ $CURRENT_BG != NONE && $1 != $CURRENT_BG ]]; then + local -a intermediate=($(fg_color $CURRENT_BG) $(bg_color $1)) + debug "pre prompt " $(ansi intermediate[@]) + PR="$PR $(ansi intermediate[@])$SEGMENT_SEPARATOR" + debug "post prompt " $(ansi codes[@]) + PR="$PR$(ansi codes[@]) " + else + debug "no current BG, codes is $codes[@]" + PR="$PR$(ansi codes[@]) " + fi + CURRENT_BG=$1 + [[ -n $3 ]] && PR="$PR$3" +} + +# End the prompt, closing any open segments +function prompt_end { + if [[ -n $CURRENT_BG ]]; then + local -a codes=($(text_effect reset) $(fg_color $CURRENT_BG)) + PR="$PR $(ansi codes[@])$SEGMENT_SEPARATOR" + fi + local -a reset=($(text_effect reset)) + PR="$PR $(ansi reset[@])" + CURRENT_BG='' +} + +### virtualenv prompt +function prompt_virtualenv { + # Exclude pyenv + [[ $PYENV_VIRTUALENV_INIT == 1 ]] && _omb_util_binary_exists pyenv && return 0 + + if [[ -d $VIRTUAL_ENV ]]; then + # Python could output the version information in both stdout and + # stderr (e.g. if using pyenv, the output goes to stderr). + local VERSION_OUTPUT=$("$VIRTUAL_ENV"/bin/python --version 2>&1) + + # The last word of the output of `python --version` + # corresponds to the version number. + local VENV_VERSION=$(awk '{print $NF}' <<< "$VERSION_OUTPUT") + + prompt_segment cyan white "[v] $(basename "$VENV_VERSION")" + fi +} + +### pyenv prompt +function prompt_pyenv { + if [[ $PYENV_VIRTUALENV_INIT == 1 ]] && _omb_util_binary_exists pyenv; then + # Priority is shell > local > global + # When pyenv shell is set, the environment variable $PYENV_VERSION is set with the value we want + if [[ ! ${PYENV_VERSION-} ]]; then + # If not set, fall back to pyenv local/global to get the version + local PYENV_VERSION=$(pyenv local 2>/dev/null || pyenv global 2>/dev/null) + fi + # If it is not the system's python, then display additional info + if [[ "$PYENV_VERSION" != "system" ]]; then + # It's a pyenv virtualenv, get the version number + if [[ -d $PYENV_VIRTUAL_ENV ]]; then + local VERSION_OUTPUT=$("$PYENV_VIRTUAL_ENV"/bin/python --version 2>&1) + local PYENV_VENV_VERSION=$(awk '{print $NF}' <<< "$VERSION_OUTPUT") + prompt_segment cyan white "[$PYENV_VERSION] $(basename "$PYENV_VENV_VERSION")" + else + prompt_segment cyan white "$PYENV_VERSION" + fi + fi + fi +} + +### conda env prompt +function prompt_condaenv { + if [[ -d $CONDA_PREFIX ]]; then + if [[ ! $CONDA_PROMPT_MODIFIER ]]; then + CONDA_PROMPT_MODIFIER=$(basename "$CONDA_PREFIX") + fi + local CONDA_PYTHON_VERSION=$("$CONDA_PREFIX"/bin/python -c 'import platform;print(platform.python_version())') + prompt_segment cyan white "[c] $CONDA_PROMPT_MODIFIER $CONDA_PYTHON_VERSION" + fi +} + +### Prompt components +# Each component will draw itself, and hide itself if no information needs to be shown + +# Context: user@hostname (who am I and where am I) +function prompt_context { + local user=$(whoami) + + if [[ $user != $DEFAULT_USER || -n $SSH_CLIENT ]]; then + prompt_segment black default "$user@\h" + fi +} + +# prints history followed by HH:MM, useful for remembering what +# we did previously +function prompt_histdt { + prompt_segment black default "\! [\A]" +} + + +function git_status_dirty { + dirty=$(command git status -s 2> /dev/null | tail -n 1) + [[ -n $dirty ]] && echo " ●" +} + +function git_stash_dirty { + stash=$(command git stash list 2> /dev/null | tail -n 1) + [[ -n $stash ]] && echo " ⚑" +} + +# Git: branch/detached head, dirty status +function prompt_git { + local ref dirty + if command git rev-parse --is-inside-work-tree &>/dev/null; then + ZSH_THEME_GIT_PROMPT_DIRTY='±' + dirty=$(git_status_dirty) + stash=$(git_stash_dirty) + ref=$(command git symbolic-ref HEAD 2> /dev/null) || + ref="➦ $(command git describe --exact-match --tags HEAD 2> /dev/null)" || + ref="➦ $(command git show-ref --head -s --abbrev | head -n1 2> /dev/null)" + if [[ -n $dirty ]]; then + prompt_segment yellow black + else + prompt_segment green black + fi + PR="$PR${ref/refs\/heads\// }$stash$dirty" + fi +} + +# Mercurial: clean, modified and uncomitted files +function prompt_hg { + local rev st branch + if hg id &>/dev/null; then + if hg prompt &>/dev/null; then + if [[ $(hg prompt "{status|unknown}") == '?' ]]; then + # if files are not added + prompt_segment red white + st='±' + elif [[ $(hg prompt "{status|modified}") ]]; then + # if any modification + prompt_segment yellow black + st='±' + else + # if working copy is clean + prompt_segment green black $CURRENT_FG + fi + PR="$PR$(hg prompt "☿ {rev}@{branch}") $st" + else + st="" + rev=$(hg id -n 2>/dev/null | sed 's/[^-0-9]//g') + branch=$(hg id -b 2>/dev/null) + if hg st | grep -q "^\?"; then + prompt_segment red white + st='±' + elif hg st | grep -q "^[MA]"; then + prompt_segment yellow black + st='±' + else + prompt_segment green black $CURRENT_FG + fi + PR="$PR☿ $rev@$branch $st" + fi + fi +} + +# Dir: current working directory +function prompt_dir { + prompt_segment blue black '\w' +} + +# Status: +# - was there an error +# - am I root +# - are there background jobs? +function prompt_status { + local symbols + symbols=() + [[ $RETVAL -ne 0 ]] && symbols+="$(ansi_single $(fg_color red))✘" + [[ $UID -eq 0 ]] && symbols+="$(ansi_single $(fg_color yellow))⚡" + [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="$(ansi_single $(fg_color cyan))⚙" + + [[ -n "$symbols" ]] && prompt_segment black default "$symbols" +} + +###################################################################### +# +# experimental right prompt stuff +# requires setting prompt_foo to use PRIGHT vs PR +# doesn't quite work per above + +function rightprompt { + printf "%*s" $COLUMNS "$PRIGHT" +} + +# quick right prompt I grabbed to test things. +function __command_rprompt { + local times= n=$COLUMNS tz + for tz in ZRH:Europe/Zurich PIT:US/Eastern \ + MTV:US/Pacific TOK:Asia/Tokyo; do + [ $n -gt 40 ] || break + times="$times ${tz%%:*}\e[30;1m:\e[0;36;1m" + times="$times$(TZ=${tz#*:} date +%H:%M)\e[0m" + n=$(( $n - 10 )) + done + [ -z "$times" ] || printf "%${n}s$times\\r" '' +} + +# this doens't wrap code in \[ \] +function ansi_r { + local seq + local -a mycodes2=("${!1}") + + debug "ansi: ${!1} all: $* aka ${mycodes2[@]}" + + seq="" + local i + for ((i = 0; i < ${#mycodes2[@]}; i++)); do + if [[ -n $seq ]]; then + seq="${seq};" + fi + seq="${seq}${mycodes2[$i]}" + done + debug "ansi debug:" '\\[\\033['${seq}'m\\]' + echo -ne '\033['${seq}'m' + # PR="$PR\[\033[${seq}m\]" +} + +# Begin a segment on the right +# Takes two arguments, background and foreground. Both can be omitted, +# rendering default background/foreground. +function prompt_right_segment { + local bg fg + local -a codes + + debug "Prompt right" + debug "Prompting $1 $2 $3" + + + # if [[ -z $1 || ( -z $2 && $2 != default ) ]]; then + codes=("${codes[@]}" $(text_effect reset)) + # fi + if [[ -n $1 ]]; then + bg=$(bg_color $1) + codes=("${codes[@]}" $bg) + debug "Added $bg as background to codes" + fi + if [[ -n $2 ]]; then + fg=$(fg_color $2) + codes=("${codes[@]}" $fg) + debug "Added $fg as foreground to codes" + fi + + debug "Right Codes: " + # local -p codes + + local -a intermediate2=($(fg_color $1) $(bg_color $CURRENT_RBG) ) + # PRIGHT="$PRIGHT---" + debug "pre prompt " $(ansi_r intermediate2[@]) + PRIGHT="$PRIGHT$(ansi_r intermediate2[@])$RIGHT_SEPARATOR" + debug "post prompt " $(ansi_r codes[@]) + PRIGHT="$PRIGHT$(ansi_r codes[@]) " + # else + # debug "no current BG, codes is $codes[@]" + # PRIGHT="$PRIGHT$(ansi codes[@]) " + # fi + CURRENT_RBG=$1 + [[ -n $3 ]] && PRIGHT="$PRIGHT$3" +} + +###################################################################### +## Emacs prompt --- for dir tracking + +function prompt_emacsdir { + # no color or other setting... this will be deleted per above + PR="DIR \w DIR$PR" +} + +###################################################################### +## Main prompt + +function build_prompt { + [[ ! -z ${AG_EMACS_DIR+x} ]] && prompt_emacsdir + prompt_status + #[[ -z ${AG_NO_HIST+x} ]] && prompt_histdt + [[ -z ${AG_NO_CONTEXT+x} ]] && prompt_context + if [[ ${OMB_PROMPT_SHOW_PYTHON_VENV-} ]]; then + prompt_virtualenv + prompt_pyenv + prompt_condaenv + fi + prompt_dir + prompt_git + prompt_hg + prompt_end +} + +function _omb_theme_PROMPT_COMMAND { + local RETVAL=$? + local PRIGHT="" + local CURRENT_BG=NONE + local PR="$(ansi_single $(text_effect reset))" + build_prompt + + # uncomment below to use right prompt + # PS1='\[$(tput sc; printf "%*s" $COLUMNS "$PRIGHT"; tput rc)\]'$PR + PS1=$PR +} +_omb_util_add_prompt_command _omb_theme_PROMPT_COMMAND diff --git a/.config/ssh/config b/.config/ssh/config new file mode 100644 index 0000000..cdf9ab3 --- /dev/null +++ b/.config/ssh/config @@ -0,0 +1,11 @@ +Host git.euph.dev + User git + HostName git.euph.dev + PreferredAuthentications publickey + IdentityFile ~/.ssh/gitea-snoweuph + +Host github.com + User git + HostName github.com + PreferredAuthentications publickey + IdentityFile ~/.ssh/github-snoweuph diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 0000000..73aa558 --- /dev/null +++ b/.gitconfig @@ -0,0 +1,22 @@ +[user] + name = Snoweuph + email = snow+git@euph.email + signingKey = A494330694B208EF +[commit] + gpgSign = true +[push] + autosetupremote = true +[help] + autoCorrect = prompt +[merge] + tool = meld + conflictstyle = zdiff3 +[core] + editor = nvim +[diff] + colorMoved = default +[fetch] + prune = true + prunetags = true +[alias] + adog = log --all --decorate --oneline --graph diff --git a/.gitignore b/.gitignore index 42a3cbb..eeaa55c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,16 @@ !.gitignore !.gitmodules +# Include Git config +!.gitconfig + # Include bash config +!.bash_profile !.bashrc -!.config/ \ No newline at end of file +!.profile + +# Include config +!.config/ + +# Include ssh Symlink +!.ssh diff --git a/.profile b/.profile new file mode 100644 index 0000000..ba1d1dd --- /dev/null +++ b/.profile @@ -0,0 +1,3 @@ +# Volta +export VOLTA_HOME="$HOME/.volta" +export PATH="$VOLTA_HOME/bin:$PATH" diff --git a/.ssh b/.ssh new file mode 120000 index 0000000..b268541 --- /dev/null +++ b/.ssh @@ -0,0 +1 @@ +./.config/ssh \ No newline at end of file