1
0
Fork 0
mirror of https://github.com/hcartiaux/dotfiles.git synced 2024-10-18 17:25:23 +02:00
dotfiles/bash/bashrc

388 lines
12 KiB
Bash
Raw Normal View History

2013-05-02 23:39:51 +02:00
#! /bin/bash
################################################################################
# .bashrc -- my personal Bourne-Again shell (aka bash) configuration
# see http://github.com/hcartiaux/dotfiles
#
# Copyright (c) 2010 Sebastien Varrette <Sebastien.Varrette@uni.lu>
# http://varrette.gforge.uni.lu
# Copyright (c) 2013 Hyacinthe Cartiaux <Hyacinthe.Cartiaux@uni.lu>
# _ _
# | |__ __ _ ___| |__ _ __ ___
# | '_ \ / _` / __| '_ \| '__/ __|
# _ | |_) | (_| \__ \ | | | | | (__
# (_) |_.__/ \__,_|___/_| |_|_| \___|
#
################################################################################
# This file is NOT part of GNU bash
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program. If not, see <http://www.gnu.org/licenses/>.
################################################################################
# Resources:
# - https://github.com/Falkor/dotfiles/blob/master/bash/.bashrc
# - http://bitbucket.org/dmpayton/dotfiles/src/tip/.bashrc
# - https://github.com/rtomayko/dotfiles/blob/rtomayko/.bashrc
# Basic variables
: ${HOME=~}
: ${LOGNAME=$(id -un)}
: ${UNAME=$(uname)}
# complete hostnames from this file
: ${HOSTFILE=~/.ssh/known_hosts}
# readline config
: ${INPUTRC=~/.inputrc}
# Get ride of mail notification
unset MAILCHECK
# ----------------------------------------------------------------------
# SHELL OPTIONS
# ----------------------------------------------------------------------
# bring in system bashrc
test -r /etc/bashrc &&
. /etc/bashrc
2013-05-03 00:22:46 +02:00
# bring in git prompt
. ~/.git-prompt.sh
2013-05-02 23:39:51 +02:00
# shell opts. see bash(1) for details
shopt -s cdspell >/dev/null 2>&1 # correct minor errors in the spelling
# of a directory in a cd command
shopt -s extglob >/dev/null 2>&1 # extended pattern matching
shopt -s hostcomplete >/dev/null 2>&1 # perform hostname completion
# on '@'
#shopt -s no_empty_cmd_completion >/dev/null 2>&1
shopt -u mailwarn >/dev/null 2>&1
# default umask
umask 0022
# ----------------------------------------------------------------------
# LS AND DIRCOLORS
# ----------------------------------------------------------------------
# Colored output from ls is nice
export CLICOLOR=1
# we always pass these to ls(1)
2013-05-03 01:52:43 +02:00
LS_COMMON="-h"
2013-05-02 23:39:51 +02:00
# if the dircolors utility is available, set that up to
dircolors="$(type -P gdircolors dircolors | head -1)"
test -n "$dircolors" && {
COLORS=/etc/DIR_COLORS
test -e "/etc/DIR_COLORS.$TERM" && COLORS="/etc/DIR_COLORS.$TERM"
test -e "$HOME/.dircolors" && COLORS="$HOME/.dircolors"
test ! -e "$COLORS" && COLORS=
eval `$dircolors --sh $COLORS`
}
unset dircolors
if [ "$UNAME" = Darwin ]; then
# check if you're using gnu core-utils then use --color
test "`which ls`" = "/opt/local/bin/ls" && {
LS_COMMON="$LS_COMMON --color"
} || {
LS_COMMON="$LS_COMMON -G"
}
elif [ "$UNAME" = Linux ]; then
LS_COMMON="$LS_COMMON --color"
2013-05-03 01:52:43 +02:00
alias grep='grep --color=auto'
2013-05-02 23:39:51 +02:00
fi
# setup the main ls alias if we've established common args
test -n "$LS_COMMON" &&
alias ls="command ls $LS_COMMON"
# these use the ls aliases above
alias ll="ls -l"
alias la="ll -a"
alias l.="ls -d .*"
# ----------------------------------------------------------------------
# ALIASES
# ----------------------------------------------------------------------
# Mandatory aliases to confirm destructive operations
alias cp='cp -iv'
alias mv='mv -iv'
alias rm='rm -i'
alias ..='cd ..'
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# ----------------------------------------------------------------------
# ENVIRONMENT CONFIGURATION
# ----------------------------------------------------------------------
# detect interactive shell
case "$-" in
*i*) INTERACTIVE=yes ;;
*) unset INTERACTIVE ;;
esac
# detect login shell
case "$0" in
-*) LOGIN=yes ;;
*) unset LOGIN ;;
esac
# enable en_US locale w/ ISO-8859-15 encodings if not already configured
# : ${LANG:="en_US.ISO-8859-15"}
# : ${LANGUAGE:="en"}
# : ${LC_CTYPE:="en_US.ISO-8859-15"}
# : ${LC_ALL:="en_US.ISO-8859-15"}
# export LANG LANGUAGE LC_CTYPE LC_ALL
# ----------------------------------------------------------------------
# PATH
# ----------------------------------------------------------------------
# we want the various sbins on the path along with /usr/local/bin
PATH="$PATH:/usr/local/sbin:/usr/sbin:/sbin"
PATH="/usr/local/bin:$PATH"
# put ~/bin on PATH if you have it
if [ -d "$HOME/bin" ]; then
PATH="$PATH:$HOME/bin:."
fi
MANPATH="/usr/share/man:/usr/local/share/man:$MANPATH"
# === Programming stuff ===
# pkg-config settings
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
# C/C++ include
C_INCLUDE_PATH=/usr/local/include
CPLUS_INCLUDE_PATH=${C_INCLUDE_PATH}
LIBRARY_PATH=/usr/lib:/usr/local/lib
DYLD_FALLBACK_LIBRARY_PATH=${LIBRARY_PATH}
# RVM specific (see http://beginrescueend.com/)
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function
# ----------------------------------------------------------------------
# PAGER / EDITOR
# ----------------------------------------------------------------------
# Default editor
test -n "$(command -v vim)" && EDITOR=vim || EDITOR=nano
export EDITOR
# Default pager ('less' is so much better than 'more'...)
if test -n "$(command -v less)" ; then
PAGER="less -FirSwX"
MANPAGER="less -FiRswX"
else
PAGER=more
MANPAGER="$PAGER"
fi
export PAGER MANPAGER
# ----------------------------------------------------------------------
# BASH COMPLETION
# ----------------------------------------------------------------------
bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.}
test -n "$PS1" && test $bmajor -gt 1 && {
# search for a bash_completion file to source
for f in /usr/local/etc/bash_completion \
/opt/local/etc/bash_completion \
/etc/bash_completion
do
test -f $f && {
. $f
break
}
done
}
unset bash bmajor bminor
# ----------------------------------------------------------------------
# BASH HISTORY
# ----------------------------------------------------------------------
# Increase the history size
HISTSIZE=10000
HISTFILESIZE=20000
# Add date and time to the history
HISTTIMEFORMAT="[%d/%m/%Y %H:%M:%S] "
# ----------------------------------------------------------------------
# VERSION CONTROL SYSTEM - CVS, SVN and GIT
# ----------------------------------------------------------------------
# === CVS ===
export CVS_RSH='ssh'
# === SVN ===
export SVN_EDITOR=$EDITOR
## display the current subversion revision (to be used later in the prompt)
__svn_ps1() {
local svnversion=`svnversion | sed -e "s/[:M]//g"`
# Continue if $svnversion is numerical
if let $svnversion 2>/dev/null
then
printf " (svn:%s)" `svnversion`
fi
}
# === GIT ===
export GIT_AUTHOR='Hyacinthe Cartiaux'
export GIT_AUTHOR_EMAIL='Hyacinthe.Cartiaux@uni.lu'
export GIT_COMMITER=$GIT_AUTHOR
export GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL
# render __git_ps1 even better so as to show activity in a git repository
export GIT_PS1_SHOWDIRTYSTATE=1
# ----------------------------------------------------------------------
# PROMPT
# ----------------------------------------------------------------------
# Define some colors to use in the prompt
RESET_COLOR="\[\e[0m\]"
BOLD_COLOR="\[\e[1m\]"
# B&W
WHITE="\[\e[0;37m\]"
GRAY="\[\e[1;30m\]"
BLACK="\[\e[0;30m\]"
# RGB
RED="\[\e[0;31m\]"
GREEN="\[\e[0;32m\]"
BLUE="\[\e[34;1m\]"
# other
YELLOW="\[\e[0;33m\]"
LIGHT_CYAN="\[\e[36;1m\]"
CYAN_UNDERLINE="\[\e[4;36m\]"
# Configure user color and prompt type depending on whoami
if [ "$LOGNAME" = "root" ]; then
COLOR_USER="${RED}"
P="#"
else
COLOR_USER="${WHITE}"
P=""
fi
# Configure a set of useful variables for the prompt
2013-05-03 01:52:43 +02:00
if [[ "`echo $UNAME | grep -c -i -e '^.*bsd$'`" == "1" ]] ; then
DOMAIN=`hostname | cut -d '.' -f 2`
else
DOMAIN=`hostname -f | cut -d '.' -f 2`
fi
2013-05-02 23:39:51 +02:00
# get virtualization information
XENTYPE=""
if [ -f "/sys/hypervisor/uuid" ]; then
if [ $(</sys/hypervisor/uuid) == "00000000-0000-0000-0000-000000000000" ]; then
XENTYPE=",Dom0"
else
XENTYPE=",DomU"
fi
fi
# Test the PS1_EXTRA variable
if [ -z "${PS1_EXTRA}" -a -f "/proc/cmdline" ]; then
# Here PS1_EXTRA is not set and/or empty, check additionally if it has not
# been set via kernel comment
kernel_ps1_extra="$(grep PS1_EXTRA /proc/cmdline)"
if [ -n "${kernel_ps1_extra}" ]; then
PS1_EXTRA=` sed -e "s/.*PS1_EXTRA=\"\?\([^ ^\t^\"]\+\)\"\?.*/\1/g" /proc/cmdline `
fi
fi
PS1_EXTRAINFO="${BOLD_COLOR}${DOMAIN}${XENTYPE}${RESET_COLOR}"
if [ -n "${PS1_EXTRA}" ]; then
PS1_EXTRAINFO="${PS1_EXTRAINFO},${YELLOW}${PS1_EXTRA}${RESET_COLOR}"
fi
# This function is called from a subshell in $PS1, to provide the colorized
# exit status of the last run command.
# Exit status 130 is also considered as good as it corresponds to a CTRL-D
__colorized_exit_status() {
printf -- "\`status=\$? ; if [[ \$status = 0 || \$status = 130 ]]; then \
echo -e '\[\e[01;32m\]'\$status; \
else \
echo -e '\[\e[01;31m\]'\$status; fi\`"
}
# Simple (basic) prompt
__set_simple_prompt() {
unset PROMPT_COMMAND
PS1="[\u@\h] \w(${DOMAIN}) ${P}> "
}
# most compact version
__set_compact_prompt() {
unset PROMPT_COMMAND
PS1="${COLOR_USER}${P}${RESET_COLOR}> "
}
###########
# my prompt; the format is as follows:
#
# [hh:mm:ss]:$?: username@hostname(domain[,xentype][,extrainfo]) workingdir(svn/git status)$>
# `--------' ^ `------' `------' `--------'`--------------'
# cyan | root:red cyan light green
# | underline blue (absent if not relevant)
# exit code of
# the previous command
#
# The git/svn status part is quite interesting: if you are in a directory under
# version control, you have the following information in the prompt:
# - under GIT: current branch name, followed by a '*' if the repository has
# uncommitted changes, followed by a '+' if some elements were
# 'git add'ed but not commited.
# - under SVN: show (svn:XX[M]) where XX is the current revision number,
# followed by 'M' if the repository has uncommitted changes
#
# `domain` reflect the current domain of the machine that run the prompt
# (guessed from hostname -f)
# `xentype` is DOM0 or domU depending if the machine is a Xen dom0 or domU
# Finally, is the environment variable PS1_EXTRA is set (or passed to the
# kernel), then its content is displayed here.
#
# This prompt is perfect for terminal with black background, in my case the
# Vizor color set (see http://visor.binaryage.com/) or iTerm2
__set_my_prompt() {
PS1="$(__colorized_exit_status) ${LIGHT_CYAN}[\t]${RESET_COLOR} ${COLOR_USER}\u${RESET_COLOR}@${CYAN_UNDERLINE}\h${RESET_COLOR}(${PS1_EXTRAINFO}) ${BLUE}\W${RESET_COLOR}${GREEN}\$(__git_ps1 \" (%s)\")\$(__svn_ps1)${RESET_COLOR}${P}> "
}
# -------------------------------------------------------------------
# USER SHELL ENVIRONMENT
# -------------------------------------------------------------------
# Set the color prompt by default when interactive
if [ -n "$PS1" ]; then
__set_my_prompt
fi
export PS1
# MOTD
test -n "$INTERACTIVE" -a -n "$LOGIN" && {
uname -npsr
uptime
}
export PKG_CONFIG_PATH
export C_INCLUDE_PATH CPLUS_INCLUDE_PATH LIBRARY_PATH DYLD_FALLBACK_LIBRARY_PATH
# Eventually load you private settings (not exposed here)
test -f ~/.bash_private &&
. ~/.bash_private
PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting