1
0
Fork 0
mirror of https://github.com/hcartiaux/dotfiles.git synced 2024-10-18 09:15:24 +02:00
dotfiles/bash/bashrc
2021-11-15 17:44:57 +01:00

272 lines
9.6 KiB
Bash
Executable file

#! /bin/bash
################################################################################
# .bashrc -- my personal Bourne-Again shell (aka bash) configuration
# see https://github.com/hcartiaux/dotfiles
#
# Copyright (c) 2010 Sebastien Varrette <Sebastien.Varrette@uni.lu>
# https://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
# -------------------------------------------------------------------
# USER SHELL ENVIRONMENT
# -------------------------------------------------------------------
# Source bash_environment
if [ -f ~/.bash_environment ]; then
. ~/.bash_environment
fi
# Eventually load you private settings (not exposed here)
test -f ~/.bash_private &&
. ~/.bash_private
# MOTD
test -n "$INTERACTIVE" -a -n "$LOGIN" && (
uname -npsr
uptime
)
# ----------------------------------------------------------------------
# SHELL OPTIONS
# ----------------------------------------------------------------------
# bring in system bashrc
test -r /etc/bashrc &&
. /etc/bashrc
# bring in git prompt
. ~/.git-prompt.sh
# 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 direxpand >/dev/null 2>&1 # replaces variables on filename completion
shopt -s cdable_vars >/dev/null 2>&1
#shopt -s no_empty_cmd_completion >/dev/null 2>&1
shopt -u mailwarn >/dev/null 2>&1
# default umask
umask 0022
# ----------------------------------------------------------------------
# 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
# Lines which begin with a space character are not saved in the history list.
HISTCONTROL=ignorespace
# Add date and time to the history
HISTTIMEFORMAT="[%d/%m/%Y %H:%M:%S] "
# ----------------------------------------------------------------------
# VERSION CONTROL SYSTEM - SVN and GIT
# ----------------------------------------------------------------------
## display the current subversion revision (to be used later in the prompt)
__svn_ps1() {
(
local svnversion
svnversion=$(svnversion | sed -e "s/[:M]//g")
# Continue if $svnversion is numerical
let $svnversion
if [[ $? -eq "0" ]]; then
printf " (svn:%s)" "$(svnversion)"
fi
) 2>/dev/null
}
# 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\]"
WHITE="\[\e[0;37m\]"
RED="\[\e[0;31m\]"
GREEN="\[\e[0;32m\]"
BLUE="\[\e[34;1m\]"
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
# 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
# Test if we are in a screen session
if [ "${SHLVL}" -ge "2" ]; then
PS1_SCREEN='\[\033k\033\\\]'
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)"
}
###########
# my prompt; the format is as follows:
#
# [hh:mm:ss]:$?:username@hostname(domain[,xentype][,extrainfo])[OAR job info] 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="${PS1_SCREEN}$(__colorized_exit_status) ${LIGHT_CYAN}\t${RESET_COLOR} ${COLOR_USER}\u${RESET_COLOR}@${CYAN_UNDERLINE}\h${RESET_COLOR}(${PS1_EXTRAINFO})${RED}\$(__slurm_ps1_remaining_time)\$(__oar_ps1_remaining_time)${RESET_COLOR}${GREEN}\$(__git_ps1 \" (%s)\")\$(__svn_ps1)${RESET_COLOR} ${BLUE}\W${RESET_COLOR} ${P} "
}
__set_training_prompt() {
PS1="$(__colorized_exit_status)${RESET_COLOR} \h${job_info} ${BLUE}\W${RESET_COLOR}${GREEN}\$(__git_ps1 \" (%s)\")${RESET_COLOR} \$ "
}
# Set the color prompt by default when interactive
if [ -n "$PS1" ]; then
__set_training_prompt
export PS1
fi
# ----------------------------------------------------------------------
# DIRCOLORS
# ----------------------------------------------------------------------
# Colored output from ls is nice
export CLICOLOR=1
# 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
# ----------------------------------------------------------------------
# ALIASES
# ----------------------------------------------------------------------
# Source bash_aliases
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# ----------------------------------------------------------------------
# HPC clusters support
# ----------------------------------------------------------------------
# OAR integration
if [ -f ~/.bash_oar ]; then
. ~/.bash_oar
fi
# Slurm integration
if [ -f ~/.bash_slurm ]; then
. ~/.bash_slurm
fi