summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bashrc419
1 files 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"