From c4ee2f878f954b01f667f2033e5747bafabefffb Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sun, 3 Nov 2024 14:32:02 +0200 Subject: feat(bash): Complete revamp of bashrc --- .bashrc | 419 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 403 insertions(+), 16 deletions(-) diff --git a/.bashrc b/.bashrc index ad4581e..577470f 100644 --- a/.bashrc +++ b/.bashrc @@ -1,27 +1,414 @@ # .bashrc +# vi:foldmethod=marker # Source global definitions -if [ -f /etc/bashrc ]; then - . /etc/bashrc -fi +[ -f /etc/bashrc ] && . /etc/bashrc + +# Prompt {{{ + [ "$(tput colors)" -ge 256 ]; _hc=$? + hc_mode() { return $_hc ; } + + # $1 foreground color [REQUIRED] + # $2 background color [REQUIRED] + colors_prt() { + printf "\001\e[38;5;${1}m\e[48;5;${2}m\002" + } + colors_res() { + printf "\001\e[39m\e[49m\002" + } + + ___first="n" + # $1 cap colour [OPTIONAL] + # $2 cap character [OPTIONAL] + # + # Entering "o" for $1 and $2 or leaving them unset uses the defaults + left_cap() { + defleft="$PS_LEFT_SEMI" + [ -z "$___first" ] && { defleft=" $PS_TRIANGLE█"; ___first="n"; } + + [ "$1" = 'o' -o -z "$1" ] && set "$PS_USER_BG" "$2" + [ "$2" = 'o' -o -z "$2" ] && set "$1" "$defleft" + + colors_prt "$1" "$PS_BG" + printf "$2" + colors_prt "$PS_FG" "$1" + } + right_cap() { + [ "$2" = 'o' -o -z "$2" ] && set "$1" "$PS_RIGHT_SEMI" + left_cap "$1" "$2" + colors_res + } + + PS_FG=223 + PS_BG=0 + PS_USER_BG=66 + [ -n "$IN_NIX_SHELL" ] && PS_USER_BG=67 + + # Colors for reporting changes + PS_ERR=160 + PS_WARN=172 + PS_INFO=97 + + hc_mode && PS_TRIANGLE='' || PS_TRIANGLE='/' + hc_mode && PS_TRIANGLE_BOT='' || PS_TRIANGLE='\' + hc_mode && PS_LEFT_SEMI='' || PS_LEFT_SEMI='(' + hc_mode && PS_RIGHT_SEMI='' || PS_RIGHT_SEMI=')' + hc_mode && PS_PREC='' || PS_PREC='>' + + ___dirchanged="" + + ___slab="" + ps_condition() { + has="" + for i in $@ + do + case $i in + (ex) + [ "$EXSTAT" != '0' ] && has="y" && break ;; + (dur) + [ -n "$___timer" -a "$seconds" -gt 10 ] && has="y" && break ;; + (dir) + [ -n "$___dirchanged" ] && has="y" && break ;; + esac + done + return $([ -n $has ]; echo $?) + } + left_slab() { + ps_condition $@ && echo "█" + } + right_slab() { + ps_condition $@ && echo "█" + } + + ps_git() { + if [ -n "$___dirchanged" ] && git rev-parse --is-inside-work-tree >/dev/null 2>&1 + then + branch_name=$(git symbolic-ref -q HEAD) + branch_name=${branch_name##refs/heads/} + branch_name=${branch_name:-HEAD} + + ___changes="$(git status --porcelain)" + + left_cap $PS_USER_BG + printf "$branch_name" + + right_cap $PS_USER_BG "$(right_slab ex dur dir)" + fi + } + + ps_exit() { + if [ "$EXSTAT" != '0' ] + then + left_cap $PS_ERR "$(left_slab ex)" + printf "$EXSTAT" + + right_cap $PS_ERR "$(right_slab dur dir)" + fi + } + + ps_duration() { + [ -n "$___timer" ] && return + + if [ "$seconds" -gt 10 ] + then + left_cap $PS_INFO "$(left_slab ex dur)" + if [ "$seconds" -lt 60 ]; then printf '%ds' "$seconds" + elif [ "$seconds" -le 3600 ]; then printf '%(%Mm %Ss)T' "$seconds" + else printf '%($Hh %Mm $%Ss)T' "$seconds" + fi + right_cap $PS_INFO "$(right_slab dir)" + fi + } -# User specific environment -if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]] + ps_dir() { + DIRCOLOR=$PS_INFO + [ ! -w . ] && DIRCOLOR=$PS_WARN + + DIR="${PWD/#$HOME/\~}" + [ -z "$___dirchanged" ] && DIR='' || ___dirchanged='' + + if [ -n "$DIR" ] + then + left_cap $DIRCOLOR "$(left_slab ex dur dir)" + printf "$DIR" + right_cap $DIRCOLOR + fi + } + + jobs_count() { + info="$(jobs -p | tr "\012" " ")" + info="${info//[^ ]}" + echo ${#info} + } + + ps_user() { + name="${user#kamen}@$HOSTNAME" + + njobs="$(jobs_count)" + # Our git rev-parse adds a background process, so if we have git, we'll + # always get at least one job. But, without git, we'll always get at least 0 jobs. + [ "$njobs" -gt "$(command -v git >/dev/null 2>&1; [ $? != 0 ]; echo $?)" ] \ + && name="\001\e[4m\\002$name\001\e[24m\002" + + printf "$name" + } + + ps_precursor() { + if [ -n "$___changes" ] + then + printf "" + else + printf "$PS_PREC" + fi + } + + trap "SECONDS=0;___timer=''" SIGUSR2 + + export PS_COMM="ps_git; ps_exit; ps_duration; ps_dir" + export PS1="$(left_cap)\$(ps_user)$(right_cap) \$(ps_precursor) " + export PS0=" $(left_cap 'o' "$PS_TRIANGLE_BOT") \A$(right_cap)\n\$(kill -s SIGUSR2 $$)" + + export PROMPT_COMMAND='EXSTAT="$?";seconds="$SECONDS";___first="";___slab="";'$PS_COMM'; ___timer="n"; [ -n "$___first" ] && printf "\n"' + # Honorable mention to: https://lists.gnu.org/archive/html/help-bash/2022-02/msg00023.html +# }}} + +# vi mode {{{ + bind 'set editing-mode vi' + bind 'set show-mode-in-prompt on' + bind "set vi-ins-mode-string \"$(left_cap)i$(right_cap)\"" + bind "set vi-cmd-mode-string \"$(left_cap $PS_WARN)n$(right_cap $PS_WARN)\"" +# }}} + +# History {{{ + bind '"\e[A":history-search-backward' + bind '"\e[B":history-search-forward' +# }}} + +# Changing directory {{{ + pushd() { + ___dirchanged="y" + builtin pushd "${1:-$HOME}" >/dev/null + } + popd() { + ___dirchanged="y" + builtin popd >/dev/null 2>&1 || true + } + alias cd="pushd" # change directory + alias bd="popd" # back directory +# }}} + +# Processes {{{ + fg() { + builtin fg >/dev/null + } + alias fg="fg" +# }}} + +# Variables {{{ + export NIX_SHELL_PRESERVE_PROMPT=1 +# }}} + +if [ -n "$ZSHRC_FUNTOO" ] then - PATH="$HOME/.local/bin:$HOME/bin:$PATH" + pre-sync() { + echo '(.zshrc) Running pre-sync function...' + + # Since in post-sync I change the EAPI of a lot of the ebuilds, + # the overlay can't be synced properly + _pwd=$(pwd) + cd /var/db/repos/gentoo + sudo git reset --hard + cd $_pwd + + echo '(.zshrc) pre-sync finished! :}' + } + + post-sync() { + echo '(.zshrc) Running post-sync function...' + + # Fixes the elusive + # "!!! Repository name or alias 'gentoo', defined for repository 'core-kit', overrides existing alias or repository." + # error when enabling gentoo overlay + sudo sed -i 's/aliases = gentoo/#aliases = gentoo/g' /var/git/meta-repo/kits/core-kit/metadata/layout.conf + + # In the gentoo overlay, most packages don't actually use EAPI 8 specific features, so + # they can safely be rolled back to EAPI 7 (funtoo's portage doesn't support EAPI 8 yet). + # However, there are still some that do need EAPI 8, so they should be left alone. + # Since I'm incredibly lazy, for now, this is how I'm gonna do it. + find '/var/db/repos/gentoo' -type f -name "*.ebuild" ! -path "*dev-qt*" ! -path "*kde-frameworks*" ! -path "*kde-plasma*" \ + | xargs sudo sed -i 's/EAPI=8/EAPI=7/g' + + echo '(.zshrc) post-sync finished! :]' + } + + alias sen="pre-sync && sudo ego sync && post-sync && sudo emerge --quiet-build -vuDN @world" fi -export PATH -# Uncomment the following line if you don't like systemctl's auto-paging feature: -# export SYSTEMD_PAGER= +# plumb.sh +# plumb-store-cwd () { +# pwd > /tmp/plumb-cwd +# } +# zle -N plumb-store-cwd +# bindkey "^[[5;7~" plumb-store-cwd -# User specific aliases and functions -if [ -d ~/.bashrc.d ]; then - for rc in ~/.bashrc.d/*; do - if [ -f "$rc" ]; then - . "$rc" - fi +# Run in the background +bgr() { + nohup sh -c "$@" >~/nohup.out 2>&1 & + disown +} + +# Kill process and run in the background +res() { + pkill $@ + bgr $@ +} + +# Open vim with .vim-session file, if it exists and the vim command doesn't have any parameters +v() { + if [ -f ".vim-session" ] && [ -z "$1" ]; then + vim -S .vim-session + else + vim $@ + fi +} + +# Add to grit parent, where first value is parent number and everything else is node value +grap() { + parent="$1" + shift + grit add -p $parent -- $@ +} + +onemo() { + bgr "nemo ./" +} + +# Launch .desktop application (either full path or just name) +dela() { + name=$1 + if [[ ${name:0:1} != "/" ]]; then + name="/usr/share/applications/${name}" + fi + if [[ ! $name =~ .desktop$ ]]; then + name+=".desktop" + fi + comm=($(awk -F= '$1=="Exec"{$1=""; print}' "$name")) + bgr "$comm" +} + +metas() { + for file in *; do + [ "$file" != 'cover.jpeg' ] && \ + kid3-cli -c "set title \"$(echo "$file" | sed -e "s/\.[^.]*$//")\"" \ + -c "set artist \"$1\"" -c "set album \"$2\"" -c "set date \"$3\"" \ + -c 'set picture:"./cover.jpeg" ""' "$file" \ + || : done +} + +# +# Aliases +# + +if [ -x "$(command -v emerge)" ] +then + alias seq="sudo emerge --quiet-build -v" + alias sep="sudo emerge -pv" + alias ses="sudo emerge -s" + alias seS="sudo emerge -S" + alias senc="sudo emaint sync -A" + alias sen="sudo emaint sync -A && sudo emerge --quiet-build -vuDN @world" + alias senp="sudo emaint sync -A && sudo emerge --quiet-build -pvuDN @world" + alias seN="sudo emerge --quiet-build -vuDN @world" + alias seNp="sudo emerge --quiet-build -pvuDN @world" + sedi() { + sudo emerge --deselect "$1" && sudo emerge --depclean "$1" + } + + alias use="sudo vim /etc/portage/package.use" + alias unmask="sudo vim /etc/portage/package.unmask" + alias mask="sudo vim /etc/portage/package.mask" +fi + +if [ -x "$(command -v dnf)" ] +then + alias sdi="sudo dnf install -y" + alias sdr="sudo dnf remove -y" + alias sda="sudo dnf autoremove -y" + # If you're using dotnet from the "packages-microsoft-com-prod" repo, make sure to + # add "exclude=dotnet* aspnetcore* netstandard*" inside the /etc/yum.repos.d/fedora.repo, /etc/yum.repos.d/fedora-updates.repo and potentially /etc/yum.repos.d/fedora33.repo + alias sdu="sudo dnf upgrade -y && sudo dnf autoremove -y && sudo youtube-dl --update && wget -O - https://raw.githubusercontent.com/laurent22/joplin/master/Joplin_install_and_update.sh | bash && needs-restarting -r" + alias sdudiscord="wget -O discord.tar.gz \"https://discord.com/api/download?platform=linux&format=tar.gz\" && tar -xzf discord.tar.gz && sudo rm -rf /opt/Discord && sudo mv Discord /opt" + + alias ds="dnf search" + alias dcs="dnf copr search" + alias dp="dnf provides" + alias di="dnf info" + + alias sdce="sudo dnf copr enable -y" + alias sdcei='f() { sudo dnf copr enable -y $1 && sudo dnf install -y $2; unset -f f }; f' +fi + +if [ -x "$(command -v apt-get)" ]; then + alias sasy="sudo apt install -y" + alias sary="sudo apt remove -y" + alias saty="sudo apt autoremove -y" + alias sagt="sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y && sudo youtube-dl --update && wget -O - https://raw.githubusercontent.com/laurent22/joplin/master/Joplin_install_and_update.sh | bash" +fi + +if [ -x "$(command -v exa)" ] +then + alias ll="exa --icons --group-directories-first --git --time-style long-iso -a -labh" + alias lk="exa --icons --group-directories-first --git --time-style long-iso -labhTL" + alias l.="exa --icons --group-directories-first --git --time-style long-iso -labhTL 2" + alias l="exa --icons --group-directories-first --time-style long-iso -abh" +else + alias ll="la -alF" + alias la="ls -A" + alias l="ls -CF" fi -unset rc +if [ -x "$(command -v grit)" ] +then + alias gr="grit" + alias gra="grit add --" + alias grc="grit check" + alias grls="grit tree" +fi + +if [ -x "$(command -v youtube-dl)" ] +then + alias ydl="youtube-dl -o '%(title)s.%(ext)s'" + alias ydlba="youtube-dl -o '%(title)s.%(ext)s' --audio-format best -x" +fi + +if [ -x "$(command -v combinepdf)" ] +then + alias lg="lazygit" +fi + +if [ -x "$(command -v gs)" ] +then + alias combinepdf="gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=temp.pdf" +fi + +cdrepo () { + [ -n "$2" ] && cd "$HOME/Programming/$1/$2" \ + || cd "$HOME/Programming/$1" +} +alias cdg="cdrepo GitHub-repos" +alias cdl="cdrepo GitLab-repos" +alias cds="cdrepo source" + +alias wudo="sudo -u www-data" + +alias q="exit" +alias x="exit" + +# +# Added by scripts: +# + +export PATH="/home/kamen/bin/Sencha/Cmd:$PATH" + +export NVM_DIR="$HOME/.nvm" -- cgit v1.2.3