#!/bin/sh # Copyright (c) 2017 rehashedsalt/vintagesalt # Licensed under the terms of the MIT license ## POSIX NOTICE # This script, or at least the parts expected to be run by a standard sh # implementation, should be fully POSIX-compliant. If it is not, open a bug # report at git.9iron.club/salt/home and I'll take care of it. ## SHELLCHECK # Not finding these sources is none of my concern; they're out of scope # shellcheck disable=1091 # shellcheck disable=1090 # I'm well aware of when functions are defined vs used # Those choices are deliberate # shellcheck disable=2139 # shellcheck disable=2016 # Some variables will not be used here, but in the shell # shellcheck disable=2034 # Quit being pedantic # shellcheck disable=1117 # Environment variables _baseshell="$(basename -- "$0")" # Patch PATH for dir in \ "$HOME/.bin" \ "$HOME/.local/bin" \ "$HOME/.firestarter" \ "/usr/local/opt/coreutils/libexec/gnubin" \ "/usr/local/opt/gnu-sed/libexec/gnubin" \ "/usr/local/opt/grep/libexec/gnubin" \ "/usr/local/opt/util-linux/bin" \ "/usr/local/opt/util-linux/sbin" do if [ -d "$dir" ]; then PATH="$dir:$PATH" fi done # Grab bash_completion, if it exists [ -f "/etc/profile.d/bash_completion.sh" ] && . "/etc/profile.d/bash_completion.sh" # Source ~/.functions, if it exists [ -r "$HOME/.functions" ] \ && [ "$_baseshell" != "sh" ] \ && [ "$_baseshell" != "dash" ] \ && . "$HOME/.functions" # Define a require function has() { [ -z "$1" ] && return 1 command -v "$1" > /dev/null 2>&1 } # Doot if ! has doot; then alias doot="echo Doot doot." fi # Grab pip completion, if it exists if has pip; then case "$_baseshell" in *bash) if ! [ -f "$HOME/.pip-completion-bash" ]; then pip completion --bash > "$HOME/.pip-completion-bash" echo ".profile: Created pip completion for bash" fi . "$HOME/.pip-completion-bash" ;; zsh) if ! [ -f "$HOME/.pip-completion-zsh" ]; then pip completion --zsh > "$HOME/.pip-completion-zsh" echo ".profile: Created pip completion for zsh" fi . "$HOME/.pip-completion-zsh" ;; *) ;; esac fi # Set up go, if we have it if has go; then export GOPATH="$HOME/.local/go" [ "${PATH#*$GOPATH}" = "$PATH" ] && export PATH="$PATH:$GOPATH/bin" fi # Grab dircolors, if it exists if has dircolors; then dircolorsfile="$HOME/.config/dircolors" if [ -r "$dircolorsfile" ]; then eval "$(dircolors "$dircolorsfile")" else eval "$(dircolors -b)" fi fi # Set up our text editor for editor in vim vi nano; do if has "$editor"; then export EDITOR="$editor" break fi done alias e='$EDITOR' # Now for a shitton of aliases if ! has define; then if has mate-dictionary; then alias define='mate-dictionary -n --look-up' fi fi if ! has helpme; then # https://breanneboland.com/blog/2020/02/28/you-can-put-what-in-dns-txt-records-a-blog-post-for-con-west-2020/ alias helpme='dig +short txt "$(( RANDOM % 50 )).maybethiscould.work"' fi if has emerge; then alias e-depclean='sudo emerge -a --depclean' alias e-inst='sudo emerge -a --jobs --tree --quiet-build y' alias e-upgrade='sudo emerge -DNUua --jobs --tree --quiet-build y --with-bdeps=y --keep-going --backtrack=1000 @world' alias e-newuse='sudo emerge -Uva --jobs --tree --quiet-build y @world' alias e-search='emerge -s' alias e-sync='sudo emerge --sync' if has eclean; then alias e-cleanup='sudo eclean -d distfiles && sudo eclean -d packages' fi fi if has firestarter and ! has fs; then alias fs="firestarter" fi if has fork; then alias dup="fork $TERMINAL $PWD" fi if has git; then # Thanks Bash-it! alias g='git' alias ga='git add' alias gall='git add -A' alias gap='git add -p' alias gb='git branch' alias gbD='git branch -D' alias gba='git branch -a' alias gbd='git branch -d' alias gbm='git branch -m' alias gbt='git branch --track' alias gc='git commit -v' alias gca='git commit -v -a' alias gcam="git commit -v -am" alias gcb='git checkout -b' alias gci='git commit --interactive' alias gcl='git clone' alias gclean='git clean -fd' alias gcm='git commit -v -m' alias gco='git checkout' alias gcob='git checkout -b' alias gcom='git checkout master' alias gcount='git shortlog -sn' alias gcp='git cherry-pick' alias gcpd='git checkout master; git pull; git branch -D' alias gcpx='git cherry-pick -x' alias gcsam="git commit -S -am" alias gct='git checkout --track' alias gd='git diff' alias gdel='git branch -D' alias gds='git diff --staged' alias gdv='git diff -w "$@" | vim -R -' alias get='git' alias gexport='git archive --format zip --output' alias gf='git fetch --all --prune' alias gft='git fetch --all --prune --tags' alias gftv='git fetch --all --prune --tags --verbose' alias gfv='git fetch --all --prune --verbose' alias ggs="gg --stat" alias ggui="git gui" alias gh='cd "$(git rev-parse --show-toplevel)"' alias gl='git pull' alias gll='git log --graph --pretty=oneline --abbrev-commit' alias glum='git pull upstream master' alias gm="git merge" alias gmu='git fetch origin -v; git fetch upstream -v; git merge upstream/master' alias gmv='git mv' alias gp='git push' alias gpatch="git format-patch -1" alias gpo='git push origin' alias gpom='git push origin master' alias gpp='git pull && git push' alias gpr='git pull --rebase' alias gpristine='git reset --hard && git clean -dfx' alias gpu='git push --set-upstream' alias gpuo='git push --set-upstream origin' alias gpuoc='git push --set-upstream origin $(git symbolic-ref --short HEAD)' alias gr='git remote' alias gra='git remote add' alias grm='git rm' alias grv='git remote -v' alias gs='git status' alias gsl="git shortlog -sn" alias gss='git status -s' alias gst="git stash" alias gstb="git stash branch" alias gstd="git stash drop" alias gstl="git stash list" alias gstp="git stash pop" alias gsu='git submodule update --init --recursive' alias gt="git tag" alias gta="git tag -a" alias gtd="git tag -d" alias gtl="git tag -l" alias gtls='git tag -l | sort -V' alias gup='git fetch && git rebase' alias gus='git reset HEAD' alias gwc="git whatchanged" # Add uncommitted and unstaged changes to the last commit alias gcaa="git commit -a --amend -C HEAD" # From http://blogs.atlassian.com/2014/10/advanced-git-aliases/ # Show commits since last pull alias gnew="git log HEAD@{1}..HEAD@{0}" # Show untracked files alias gu='git ls-files . --exclude-standard --others' fi if has nc; then # I'm not sorry alias blinkenlights='nc -v towel.blinkenlights.nl 23' fi if has ptgdp; then song() { if [ -z "$*" ]; then echo "song: Requires an argument" return 1 fi echo "$*" | ptgdp -p } fi if has sudo; then case $_baseshell in *bash|*zsh) export SUDO_PROMPT=$'[\e[34msudo\e[0m as %U]: Password for %p: ' ;; *) export SUDO_PROMPT='[sudo as %U]: Password for %p: ' esac fi if has tree; then treeargs='-qF --dirsfirst' alias tree="tree $treeargs" alias t="tree $treeargs -L 2" alias tl="tree $treeargs -pughL 2" alias tp="tree $treeargs -pL 2" alias ts="tree $treeargs -hL 2" unset treeargs fi if has vault; then alias vlogin="vault login -method=ldap username=$(whoami)" alias vls="vault list" alias vr="vault read" fi # Dotfile management aliases if [ -d "$HOME/.dotfiles" ]; then dotcmd='git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME' alias dot="$dotcmd" alias dotupdate="\ printf 'Pulling...\n' $dotcmd pull printf 'Updating submodules...\n' $dotcmd submodule update --init --recursive --remote' $dotcmd status" alias dotupgrade="\ printf 'Pulling...\n' $dotcmd pull printf 'Updating submodules...\n' $dotcmd submodule update --init printf 'Checking out masters...\n' $dotcmd submodule -q foreach --recursive 'git checkout -q master && git pull' && \ $dotcmd status" unset dotcmd fi # Aliases for common utilities if [ "$(uname)" = "Linux" ] || has brew; then # Assume we have GNU coreutils lsarguments='-Fh --color=auto --group-directories-first' alias l="ls -l --file-type $lsarguments" alias la="ls -A --file-type $lsarguments" alias ls="ls $lsarguments" alias ll="ls -Al --file-type $lsarguments" unset lsarguments alias rm='rm -I' else # Else only assume POSIX/BSD lsarguments='-F' alias l="ls -$lsarguments" alias la="ls -A $lsarguments" alias ls="ls $lsarguments" alias ll="ls -Ahl $lsarguments" fi alias cp='cp -i' alias d='du -hs' # Set up a default PS1 for bash _ps1bash() { exitcode="$?" r="\[\e[0m\]" bg_red="\[\e[41m\]" bg_yellow="\[\e[43m\]" bg_blue="\[\e[44m\]" fg_black="\[\e[30m\]" fg_red="\[\e[31m\]" fg_green="\[\e[32m\]" fg_yellow="\[\e[33m\]" fg_blue="\[\e[34m\]" fg_magenta="\[\e[35m\]" fg_grey="\[\e[37m\]" fg_bold="\[\e[1m\]" # Add hostname prefix in SSH sessions unset prefix # Alert if in an SSH session if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then prefix="${fg_bold}${fg_red}$(hostname -s)${r}${fg_red}:${r}${prefix}" fi # Change PWD color depending on the shell case $0 in *bash) prefix="${prefix}${fg_blue}" ;; *ksh) prefix="${prefix}${fg_green}" ;; *) ;; esac # Show the tilde instead of $HOME if [ "${PWD#$HOME}" != "$PWD" ]; then cpwd="~${PWD#$HOME}" else cpwd="$PWD" fi # Show read-only status in certain directories if [ "$UID" = 0 ]; then # Fuck you I'm root prompt="${fg_red}#${r}" elif ! [ -d "$PWD" ]; then # What the fuck happened to my directory prompt="${bg_red}${fg_black}!${r}" elif ! [ -r "$PWD" ]; then # Can't read is worst case prompt="${fg_red}"'$'"${r}" elif ! [ -x "$PWD" ]; then # Can read it but can't search it is weird but also bad if [ -w "$PWD" ]; then # Fixable prompt="${bg_blue}${fg_black}"'$'"${r}" else # Unfixable prompt="${bg_yellow}${fg_black}"'$'"${r}" fi elif ! [ -w "$PWD" ]; then # Can't write is really common but also good to know prompt="${fg_magenta}"'~'"${r}" else # Otherwise we should be fine prompt="${fg_green}"'$'"${r}" fi # Alert us if the last command failed unset fail if ! [ "$exitcode" = "0" ]; then fail="${fg_bold}${fg_red}?" fi # shellcheck disable=2059 PS1="[${prefix}${cpwd}${r}]${fail}${r}${prompt}${r} " } # And export our PS1 case "$_baseshell" in zsh) # Don't do this on ZSH # I have a custom theme for that ;; *bash) export PS1="" export PROMPT_COMMAND=_ps1bash ;; *) export PS1='[\e[31m\w\e[0m]\e[32m\$\e[0m ' ;; esac # Clean up unset gnubin unset -v _baseshell unset -f has # Source in a site-specific profile localprofile="$HOME/.local/profile" if [ -f "$localprofile" ]; then . "$localprofile" fi