.bashrc 8.93 KB
Newer Older
1 2
# .bashrc générique mis à votre disposition
# par les gentils membres actifs du Cr@ns
Vincent Le gallic's avatar
Vincent Le gallic committed
3
# Vous pouvez l'utiliser, le redistribuer, le modifier à votre convenance.
4
# Des questions, des suggestions : {nounou,ca}@lists.crans.org
5 6 7 8 9
# Licence : WTFPL

# Les sections commentées par #~# sont des features qui ne sont pas activées
# par défaut. Sentez-vous libre de les décommenter pour les utiliser. 

10 11
#------------------------------------------------------------------------------

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
# Pour les shells non interactif (sous emacs, avec rcp, ...)
# on ne charge pas le .bashrc
[ -z "$PS1" -o "$TERM" = dumb ] && return

# Hack pour que $COLUMNS contienne le nombre de colonne du terminal
# Sinon, le prompt kikoo risque de déborder/être trop court
COLUMNS=$(tput cols)
shopt -s checkwinsize

# +-------------------------+
# | Customizations diverses |
# +-------------------------+

# Utilisation de lesspipe comme PAGER si il est présent
[[ -x /usr/bin/lesspipe ]] && eval "$(lesspipe)"

# Couleur pour certaines commandes (ls, …)
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
fi

# Bash-complétion
[ -f /etc/bash_completion ] && . /etc/bash_completion
# Placez vos fichiers de bash-complétion custom dans ~/.bash_completion.d/
# ils seront chargés par la ligne suivante
[ -d ~/.bash_completion.d/ ] && for f in ~/.bash_completion.d/*; do source $f; done


#~# # +-----+
#~# # | VCS |
#~# # +-----+
#~# 
#~# # Définition de fonction pour pouvoir afficher dans le prompt
#~# # des infos quand on est dans un dépôt versionné
#~# 
47 48 49
#~# find_up () {
#~#     path="$1"
#~#     shift 1
50
#~#     while [[ "`readlink -f -- \"$path\"`" != "/" ]];
51 52 53 54 55 56
#~#     do
#~#         find "$path"  -maxdepth 1 -mindepth 1 "$@"
#~#         path=${path}/..
#~#     done
#~# }
#~# 
57 58
#~# get_vcs_info () {
#~#     # Donne les infos sur le dépôt VCS courant.
59
#~#     local LBRANCH LTYPE BRANCH TYPE DIR
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
#~#     declare -a DIR
#~#     declare -A TYPE
#~#     declare -A BRANCH
#~#     DIR[0]=".git"
#~#     DIR[1]=".hg"
#~#     DIR[2]="_darcs"
#~#     DIR[3]=".svn"
#~#     TYPE[.git]="git"
#~#     TYPE[.hg]="mercurial"
#~#     TYPE[_darcs]="darcs"
#~#     TYPE[.svn]="svn"
#~#     BRANCH[.git]='git branch 2>/dev/null | sed -r "s/^[^*].*$//" | paste -s -d "" | sed -r "s/^[*] //"'
#~#     BRANCH[.hg]='hg branch 2>/dev/null'
#~#     BRANCH[_darcs]="darcs show repo 2>/dev/null| egrep '^ *Cache' | sed 's@.*/\([^/]*\),.*@\1@'"
#~#     BRANCH[.svn]="svn info 2>/dev/null | head -n 6 | tail -n 1"
#~# 
#~#     DIR=$(eval "find_up \"$PWD\" -name \"\"$(printf -- ' -o -name "%s"' "${DIR[@]}") | head -n 1")
#~#     if [ -n "$DIR" ]; then
#~#         DIR=$(basename "$DIR")
#~#         LBRANCH=$(eval "${BRANCH[$DIR]}")
#~#         LTYPE="${TYPE[$DIR]}"
81
#~#         if [ "$color_prompt" = yes ]; then
82
#~#             VCS_info="${nocolor}${vcs_symbols_color}(${nocolor}$LTYPE${vcs_symbols_color})-${vcs_symbols_color}[${vcs_branch_color}$LBRANCH${vcs_symbols_color}]${nocolor}"
83 84 85
#~#         else
#~#             VCS_info="($LTYPE)-[$LBRANCH]"
#~#         fi
86
#~#         VCS_size=$((${#LTYPE}+${#LBRANCH}+5))
87 88 89 90 91 92
#~#     else
#~#         VCS_info=""
#~#         VCS_size=0
#~#     fi
#~# }

93

Vincent Le gallic's avatar
Vincent Le gallic committed
94 95 96 97 98 99 100
# Pour avoir le bon umask en fonction du dossier où on se trouve
# L'umask définit avec quel droits un fichier est créé.
# Quand on écrit dans un dossier et qu'on veut que, par défaut,
# d'autres personnes puissent modifier les fichiers, il faut changer l'umask.
# Rien de spécial n'arrivera si vous n'avez pas le fichier .umaskrc
function cd {
        builtin cd "$@"
101 102 103 104 105
        if [ -f ~/.umaskrc ]; then
            umask $(/usr/bin/awk 'BEGIN {pwd=ENVIRON["PWD"]; a=length(pwd); cmax=0} {if($1==pwd) {MASK=$2;exit}; c=length($1); if(c>a) {next}; if(substr(pwd,0,c)==$1 && c > cmax) {cmax=c; MASK=$2}} END {print MASK}' ~/.umaskrc) >/dev/null
        else
            return 0
        fi
Vincent Le gallic's avatar
Vincent Le gallic committed
106 107
}

108 109 110 111 112 113
### Attention à ce que vous éditez dans cette section ###
### v v v v v v v v v v ###
# +----------------------+
# | Génération du prompt |
# +----------------------+

114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
cyan='\[\e[1;36m\]'
violet='\[\e[1;35m\]'
violet_thin='\[\e[0;35m\]'
jaune='\[\e[1;33m\]'
rouge='\[\e[1;31m\]'
vert='\[\e[1;32m\]'
vert_thin='\[\e[0;32m\]'
bleu='\[\e[1;34m\]'
nocolor='\[\e[0m\]'

if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # support de la couleur
    color_prompt=yes
    # Couleurs dans "user@host $"
    username_color=$rouge
    host_color=$bleu
    symbols_color=$vert
    # Couleur de la ligne séparatrice de prompt
    line_color=$cyan
    # Couleur du path actuel
    pwd_color=$jaune
    # Couleur de la date
    date_color=$violet
    # Couleur d'affichage de vcs_info
    vcs_symbols_color=$violet_thin
    vcs_type_color=
    vcs_branch_color=$vert_thin
else
    # pas de support de la couleur
    color_prompt=no
fi

146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164

# Génération de la ligne de "-"
function gen_minus_line
{
    local i

    MINUS_LINE=""
    SAVE_COLUMNS=$COLUMNS

    for ((i = COLUMNS-23; i>0; i--)); do
	MINUS_LINE=$MINUS_CHAR$MINUS_LINE
    done
}

# Génération du prompt après chaque commande
function prompt_command
{
    # Attention aux hacks pour que la couleur (et sa taille)
    #  soient évaluées au moment de l'affichage du prompt
165
    local pwd ERR DATE PROMPT DIR POST_DIR
166
    (( SAVE_COLUMNS == COLUMNS )) || gen_minus_line
167

168 169
    #~# #dépend de la section VCS
    #~# get_vcs_info
170 171 172 173 174 175 176 177 178 179 180 181 182 183
    
    pwd=${PWD/#$HOME/'~'}
    if (( ${#pwd} + ${VCS_size} + 27 > COLUMNS )); then
 	    if (( COLUMNS >= 33 )); then
	        DIR='..'${pwd:${#pwd}+${VCS_size}+30-COLUMNS}
            POST_DIR='${MINUS_LINE:0:4-${#?}}'
	    else
	        DIR=$pwd
            POST_DIR=$MINUS_CHAR
	    fi
    else
	    DIR=$pwd
        POST_DIR='${MINUS_LINE:'${#pwd}+${VCS_size}+1'+${#?}}'
    fi
184
    if [ "$color_prompt" = yes ]; then
185 186 187 188 189 190 191 192
        DIR="< ${pwd_color}"$DIR"${line_color} >"
        # On affiche le code de retour en "no color" si c'est 0, en rouge sinon
        # Ceci n'est pas customizable à coup de variable,
        # il faut changer $((31+($?==0)*6)) si vous y tenez vraiment et que vous comprenez ce que vous faites
        ERR='[ \[\e[1;$((31+($?==0)*6))m\]$?'${line_color}' ]'$MINUS_CHAR
        DATE="( ${date_color}\D{%H:%M:%S}${line_color} )"
        PROMPT="${username_color}\u${symbols_color}@${host_color}\h ${symbols_color}\$ ${nocolor}"
        PS1=$TITLE${line_color}$MINUS_CHAR$DATE$MINUS_CHAR$DIR$MINUS_CHAR$VCS_info${line_color}$POST_DIR$ERR'\n'$PROMPT
193 194 195 196 197 198 199
    else
        DIR="< "$DIR" >"
        ERR='[ $? ]'$MINUS_CHAR
        DATE="( \D{%H:%M:%S} )"
        PROMPT="\u@\h \$ "
        PS1=$TITLE$MINUS_CHAR$DATE$MINUS_CHAR$DIR$MINUS_CHAR$VCS_info$POST_DIR$ERR'\n'$PROMPT
    fi
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
}

# On change le titre de la fenêtre dynamiquement si on est sous X
if [[ $TERM = "xterm" ]]; then
    TITLE='\[\e];\u@\h:\w\a\]'
else
    TITLE=''
fi

# On regénére le prompt après chaque commande
PROMPT_COMMAND=prompt_command

# +-------------------+
# | Messages au début |
# +-------------------+

if [[ $(uname) == Linux && ( $(locale charmap) == UTF-8 && $TERM != screen ) ]]; then
    MINUS_CHAR=
    gen_minus_line
    date=$(/bin/date +"%R, %A %d %B %Y")
    redate=${date//é/e}
    redate=${redate//û/u}
222 223
    if [ "$color_prompt" = yes ]; then
        echo -e "\e[1;36m┬─${redate//?/─}──┬${MINUS_LINE:${#date}-18}\n\
224 225
\e[1;37m$date\e[1;31m \e[1;36m │\n\
└─${redate//?/─}──┘\e[0m\n"
226 227 228 229 230
    else
        echo -e "┬─${redate//?/─}──┬${MINUS_LINE:${#date}-18}\n\
$date\n\
└─${redate//?/─}──┘\n"
    fi
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
    unset date
else
    MINUS_CHAR=-
    gen_minus_line
fi
### ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ###
### Attention à ce que vous avez édité dans cette section ###


# +---------------------------------------+
# | Gestion de l'historique des commandes |
# +---------------------------------------+

# On ne sauve pas les lignes dupliquées qui se suivent dans l'historique
# ainsi que les commandes qui commencent par une espace
export HISTCONTROL=ignoreboth

# Nombre de lignes d'historique à garder
export HISTSIZE=5000

# la même chose dans le fichier d'historique
export HISTFILESIZE=5000

254
# Mémoriser le timestamp d'exécution de la commande
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
export HISTTIMEFORMAT='%F %T - '

# pour sauvegarder les commandes de plusieurs lignes (\ ) en une seule
shopt -s cmdhist
# pour enregistrer tout de suite les commandes dans l'historique
# et non pas à la fermeture du shell
shopt -s histappend


# +---------------+
# | Environnement |
# +---------------+

# Pour éviter un troll, aucune ligne de cette section n'est décommentée.
# Choisissez la vôtre.
#~# export EDITOR='/usr/bin/nano'
#~# export EDITOR='/usr/bin/vim'
#~# export EDITOR='/usr/bin/emacs'
#~# export EDITOR='/usr/bin/jed'

# Ajouter ~/bin, /sbin et /usr/sbin à son PATH
PATH=~/bin:$PATH:/sbin:/usr/sbin

# Chargement des alias
if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

# Fichier locaux (utile quand on clone sa config sur plusieurs machines)
[[ -f ~/.bashrc.local ]] && . ~/.bashrc.local

if [ -f ~/.bash_aliases_local ]; then
    . ~/.bash_aliases_local
fi