Skip to content

Instantly share code, notes, and snippets.

@patricknelson
Last active December 14, 2020 10:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save patricknelson/384e760e45da518e180ed24566d954b9 to your computer and use it in GitHub Desktop.
Save patricknelson/384e760e45da518e180ed24566d954b9 to your computer and use it in GitHub Desktop.
My personal .bash_profile script πŸŽ‰
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# Launches ssh-pageant.exe (instead of ssh-agent) to connect to PuTTY's pageant.exe, an SSH key management process for Windows.
if [ -x /usr/bin/ssh-pageant ]; then
eval $(/usr/bin/ssh-pageant -r -a "/tmp/.ssh-pageant-$USERNAME")
fi
#############################
## CUSTOM ENVIRONMENT VARS ##
#############################
# LS colors. See here for reference: http://linux-sxs.org/housekeeping/lscolors.html
dircolors ~/dircolors.txt > ~/dircolors.tmp
source ~/dircolors.tmp
rm -f ~/dircolors.tmp
# Other odds and ends.
PATH="$PATH:$HOME/bin:/sbin:/usr/sbin"
####################
## COMMAND PROMPT ##
####################
# Match last two directories, replace entire result with that group. Using this for setting title via PS1 below.
# TODO: This is slow, I think because it has to run pwd and sed separately. Maybe try some extra special ${PWD...} instead?
last-two-dirs() {
pwd | sed -E 's/.*\/([^\/]+\/[^\/]+)$/\1/g'
}
# Code below was modified from: https://gist.github.com/Ragnoroct/c4c3bf37913afb9469d8fc8cffea5b2f
# Copyright (c) 2019 Will Bender. All rights reserved.
#
# This work is licensed under the terms of the MIT license.
# For a copy, see <https://opensource.org/licenses/MIT>.
#
# Very very fast __git_ps1 implementation
# 100% pure Bash (no forking) function to determine the name of the current git branch
#
# Which was inspired by https://gist.github.com/wolever/6525437
function __fastgit_ps1 () {
branch=""
local headfile head branch
local dir="$PWD"
while [ -n "$dir" ]; do
if [ -e "$dir/.git/HEAD" ]; then
headfile="$dir/.git/HEAD"
break
fi
dir="${dir%/*}"
done
if [ -e "$headfile" ]; then
read -r head < "$headfile" || return
case "$head" in
ref:*) branch="${head##*/}" ;;
"") branch="" ;;
*) branch="${head:0:7}" ;; #Detached head. You can change the format for this too.
esac
fi
if [ ! -z "$branch" ]; then
branch="($branch)"
fi
# Note: Set title via \e]0;...\a. Could use \W (uppercase) to show the TOP level folder, \w (lowercse) shows full path.
# However, want to show the last two directories instead, so executing function in backticks for that more complex logic.
# For title format: https://stackoverflow.com/questions/10456228/bash-ps1-window-title
# TODO: Optimize last-two-dirs with maybe just a simple bash variable, since it's so slow right now.
#export PS1="\[\e]0;`last-two-dirs`\a\]\n\[\e[32m\]\u@\H \[\e[33m\]\w\[\e[0m\] \[\033[36m\]$branch\[\033[0m\]\n\$ "
export PS1="\[\e]0;\W\a\]\n\[\e[32m\]\u@\H \[\e[33m\]\w\[\e[0m\] \[\033[36m\]$branch\[\033[0m\]\n\$ "
}
export PROMPT_COMMAND=__fastgit_ps1
#############
## ALIASES ##
#############
# General.
alias ll='ls -lah --color=auto'
alias profile='vim ~/.bash_profile && source ~/.bash_profile'
# Git aliases
alias gp='git push'
alias gpt='git push && git push --tags'
alias gc='git checkout $1'
# Git tags
# tags-named explained:
# 1. Get all tags, formatted to include commit message
# 2. Filter out only those tags which start with letters (e.g. front-end/0.0.1)
# 3. Sort *that* using version sort (since 0.0.10 is bigger than 0.0.2)
# 4. Reverse order (tac vs. cat) to prepare for next sorting stage...
# 5. Sort by picking first unique entry (-u flag), break comparison up into columns with divider being slash (-t/ flag)
# based on value from column 1 (-k1,1 flag). Also, automatically outputs list alphabetically once done (normal sort).
alias tags-named='git tag -n | grep '^[-a-zA-Z]' | sort -V | tac | sort -u -t/ -k1,1'
alias tags-numbered='git tag -n | sort -V | grep '^[^-a-zA-Z]' | tail'
alias tags='echo "" && tags-named && echo "" && tags-numbered'
# Gt functions
gd() {
if [[ ! $1 ]]; then
echo 'Please provide a branch name.'
return;
fi
git branch -d $1
git push origin :$1
}
merge-dev() {
GIT_BRANCH=$(git symbolic-ref --short HEAD)
if [ "$GIT_BRANCH" == "dev" ]; then
echo 'Already on dev branch. Please checkout the branch you want to merge into dev first.'
return;
fi
git checkout dev
git pull
git merge $GIT_BRANCH --no-ff --no-edit
git push origin
git checkout $GIT_BRANCH
}
##########
## MoTD ##
##########
if [ -x /usr/games/cowsay -a -x /usr/games/fortune ]; then
# Using 'find' instead of 'ls' since the path to the cow files varies between Debian and CentOS.
fortune | cowsay -f $(find /usr/share/cowsay/ -name '*.cow' | shuf -n1)
fi
# Configuration file for dircolors, a utility to help you set the
# LS_COLORS environment variable used by GNU ls with the --color option.
# The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the
# slackware version of dircolors) are recognized but ignored.
# Below, there should be one TERM entry for each termtype that is colorizable
TERM linux
TERM linux-c
TERM mach-color
TERM console
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM cygwin
TERM dtterm
TERM putty
TERM xterm
TERM xterm-color
TERM xterm-debian
TERM rxvt
TERM screen
TERM screen-bce
TERM screen-w
TERM vt100
TERM Eterm
# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
NORMAL 00 # global default, although everything should be something.
FILE 00 # normal file
DIR 01;94 # directory
LINK 01;36 # symbolic link. (If you set this to 'target' instead of a
# numerical value, the color is as for the file pointed to.)
FIFO 40;33 # pipe
SOCK 01;35 # socket
DOOR 01;35 # door
BLK 40;33;01 # block device driver
CHR 40;33;01 # character device driver
ORPHAN 40;31;01 # symlink to nonexistent file
SETUID 37;41 # file that is setuid (u+s)
SETGID 30;43 # file that is setgid (g+s)
STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w)
OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky
STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable
# This is for files with execute permission:
EXEC 01;32
# List any file extensions like '.gz' or '.tar' that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a '#')
# If you use DOS-style suffixes, you may want to uncomment the following:
#.cmd 01;32 # executables (bright green)
#.exe 01;32
#.com 01;32
#.btm 01;32
#.bat 01;32
.tar 01;31 # archives or compressed (bright red)
.tgz 01;31
.arj 01;31
.taz 01;31
.lzh 01;31
.zip 01;31
.z 01;31
.Z 01;31
.gz 01;31
.bz2 01;31
.deb 01;31
.rpm 01;31
.jar 01;31
# image formats
.jpg 01;35
.jpeg 01;35
.gif 01;35
.bmp 01;35
.pbm 01;35
.pgm 01;35
.ppm 01;35
.tga 01;35
.xbm 01;35
.xpm 01;35
.tif 01;35
.tiff 01;35
.png 01;35
.mov 01;35
.mpg 01;35
.mpeg 01;35
.avi 01;35
.fli 01;35
.gl 01;35
.dl 01;35
.xcf 01;35
.xwd 01;35
# audio formats
.flac 01;35
.mp3 01;35
.mpc 01;35
.ogg 01;35
.wav 01;35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment