.bashrc 11.8 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
# 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


40 41 42 43 44 45 46 47
# +-----+
# | VCS |
# +-----+

# Définition de fonction pour pouvoir afficher dans le prompt
# des infos quand on est dans un dépôt versionné

find_up () {
48
    local path normalized_path normalized_ret
49 50
    path="$1"
    shift 1
51 52 53
    normalized_path=`readlink -f -- "$path"`
    normalized_ret=$?
    while [[ "$normalized_path" != "/" ]] && [ $normalized_ret -eq 0 ];
54 55 56
    do
        find "$path"  -maxdepth 1 -mindepth 1 "$@"
        path=${path}/..
57 58
        normalized_path=`readlink -f -- "$path"`
        normalized_ret=$?
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
    done
}

get_vcs_info () {
    # Donne les infos sur le dépôt VCS courant.
    local LBRANCH LTYPE BRANCH TYPE DIR
    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]}"
        if [ "$color_prompt" = yes ]; then
87
            VCS_info="${nocolor_prompt}${vcs_symbols_color}(${vcs_type_color}$LTYPE${vcs_symbols_color})-${vcs_symbols_color}[${vcs_branch_color}$LBRANCH${vcs_symbols_color}]${nocolor_prompt}"
88 89 90 91 92 93 94 95 96
        else
            VCS_info="($LTYPE)-[$LBRANCH]"
        fi
        VCS_size=$((${#LTYPE}+${#LBRANCH}+5))
    else
        VCS_info=""
        VCS_size=0
    fi
}
97

98

Vincent Le gallic's avatar
Vincent Le gallic committed
99 100 101 102 103 104 105
# 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 "$@"
106
	ret=$?
107
        if [ -f ~/.umaskrc ]; then
108
            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)==$1 && c > cmax) {cmax=c; MASK=$2}} END {print MASK}' ~/.umaskrc) >/dev/null
109
        fi
110
        return $ret
Vincent Le gallic's avatar
Vincent Le gallic committed
111 112
}

113 114 115 116 117 118
### Attention à ce que vous éditez dans cette section ###
### v v v v v v v v v v ###
# +----------------------+
# | Génération du prompt |
# +----------------------+

119 120 121 122 123
# Définition des couleurs
# Pour les utiliser dans le prompt,
# les couleurs doivent être entourés de \[ et \] pour délimiter les caractères
# invisibles
cyan='\e[1;36m'
Vincent Le gallic's avatar
Vincent Le gallic committed
124
cyan_thin='\e[0;36m'
125 126 127 128 129
violet='\e[1;35m'
violet_thin='\e[0;35m'
jaune='\e[1;33m'
jaune_thin='\e[0;33m'
rouge='\e[1;31m'
Vincent Le gallic's avatar
Vincent Le gallic committed
130
rouge_thin='\e[0;31m'
131 132 133
vert='\e[1;32m'
vert_thin='\e[0;32m'
bleu='\e[1;34m'
Vincent Le gallic's avatar
Vincent Le gallic committed
134
bleu_thin='\e[0;34m'
135
blanc='\e[1;37m'
Vincent Le gallic's avatar
Vincent Le gallic committed
136
blanc_thin='\e[0;37m'
137 138
nocolor='\e[0m'
cyan_prompt="\[${cyan}\]"
Vincent Le gallic's avatar
Vincent Le gallic committed
139
cyan_thin_prompt="\[${cyan_thin}\]"
140 141 142 143 144
violet_prompt="\[${violet}\]"
violet_thin_prompt="\[${violet_thin}\]"
jaune_prompt="\[${jaune}\]"
jaune_thin_prompt="\[${jaune_thin}\]"
rouge_prompt="\[${rouge}\]"
Vincent Le gallic's avatar
Vincent Le gallic committed
145
rouge_thin_prompt="\[${rouge_thin}\]"
146 147 148
vert_prompt="\[${vert}\]"
vert_thin_prompt="\[${vert_thin}\]"
bleu_prompt="\[${bleu}\]"
Vincent Le gallic's avatar
Vincent Le gallic committed
149 150 151
bleu_thin_prompt="\[${bleu_thin}\]"
blanc_prompt="\[${blanc}\]"
blanc_thin_prompt="\[${blanc_thin}\]"
152
nocolor_prompt="\[${nocolor}\]"
153 154 155 156 157

if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # support de la couleur
    color_prompt=yes
    # Couleurs dans "user@host $"
158 159 160
    username_color=${rouge_prompt}
    host_color=${bleu_prompt}
    symbols_color=${vert_prompt}
161
    # Couleur de la ligne séparatrice de prompt
162 163
    line_color=${cyan}
    line_color_prompt=${cyan_prompt}
164
    # Couleur du path actuel
165 166 167 168 169
    pwd_color=${jaune_prompt}
    # Couleur de la date (à chaque affichage du prompt)
    date_color=${violet_prompt}
    # Couleur de la date au premier affichage (à l'ouverture du terminal)
    announce_date_color=${blanc}
170
    # Couleur d'affichage de vcs_info
171 172 173
    vcs_symbols_color=${violet_thin_prompt}
    vcs_type_color=${jaune_thin_prompt}
    vcs_branch_color=${vert_thin_prompt}
174 175 176 177 178
else
    # pas de support de la couleur
    color_prompt=no
fi

179 180 181 182 183
# Est-ce qu'on veut que le prompt affiche les information sur l'éventuel dépôt
# versionné dans lequel on se trouve
#~# # Changez cette variable en "yes" pour l'afficher
display_vcs_info=no

184 185 186 187 188 189 190

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

    MINUS_LINE=""
191 192
    # Pas la peine de refaire le travail tant qu'on ne change
    # pas le nombre de colonnes.
193 194 195 196 197 198 199 200 201 202
    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
{
203
    local pwd ERR DATE PROMPT DIR POST_DIR
204 205 206 207 208 209 210 211 212
    # Cette fonction génère un prompt sur deux lignes
    # ayant cette allure :
    # ─( 12:59:05 )─< ~ >───────────────────────────────────────────────────────[ 0 ]─
    # user@host $
    
    # Attention aux hacks (échappement, interprétation des variables)
    # pour que les couleurs (et leurs tailles)
    # soient évaluées au moment de l'affichage du prompt
    # Si le terminal a été redimensionné, on régénère la ligne de tirets
213
    (( SAVE_COLUMNS == COLUMNS )) || gen_minus_line
214 215
    
    # À décommenter si on veut afficher des infos
216 217 218 219
    # quand on se trouve dans un dépôt versionné
    if [ "$display_vcs_info" = yes ]; then
        get_vcs_info
    fi
220
    
221
    # Chemin courant, en faisant attention à la largeur de la fenêtre
222 223 224 225 226 227 228 229 230 231 232 233 234
    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
235 236
    
    # Génération des différents morceaux du prompt, avec ou sans la couleur
237
    if [ "$color_prompt" = yes ]; then
238
        DIR="< ${pwd_color}"$DIR"${line_color_prompt} >"
239 240 241
        # 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
242
        ERR='[ \[\e[1;$((31+($?==0)*6))m\]$?'${line_color_prompt}' ]'$MINUS_CHAR
243 244
        # Affichage de l'heure courante
        # pratique pour savoir quand on a tapé la commande précédente
245
        DATE="( ${date_color}\D{%H:%M:%S}${line_color_prompt} )"
246 247
        # Deuxième ligne du prompt "user@host $"
        # Attention "\\\$" devient \$, c'est-à-dire # pour root, $ pour les autres
Vincent Le gallic's avatar
Vincent Le gallic committed
248
        PROMPT="${username_color}\u${symbols_color}@${host_color}\h ${symbols_color}\\\$ ${nocolor_prompt}"
249
        # On fusionne tout ça
250
        PS1=$TITLE${line_color_prompt}$MINUS_CHAR$DATE$MINUS_CHAR$DIR$MINUS_CHAR$VCS_info${line_color_prompt}$POST_DIR$ERR'\n'$PROMPT
251 252 253 254
    else
        DIR="< "$DIR" >"
        ERR='[ $? ]'$MINUS_CHAR
        DATE="( \D{%H:%M:%S} )"
255
        PROMPT="\u@\h \\\$ "
256 257
        PS1=$TITLE$MINUS_CHAR$DATE$MINUS_CHAR$DIR$MINUS_CHAR$VCS_info$POST_DIR$ERR'\n'$PROMPT
    fi
258 259 260 261 262 263 264 265 266
}

# 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

267
# On régénère le prompt après chaque commande
268 269 270 271 272 273
PROMPT_COMMAND=prompt_command

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

274 275
function welcome_message ()
{
276 277 278
    # Si on supporte l'utf-8 et qu'on n'est pas dans un screen,
    # on affiche un joli cadre avec la date.
    # On utilise aussi un caractère plus sympa pour faire les lignes de tirets
279 280 281 282
    if [[ $(uname) == Linux && ( $(locale charmap) == UTF-8 && $TERM != screen ) ]]; then
        MINUS_CHAR=
        gen_minus_line
        date=$(/bin/date +"%R, %A %d %B %Y")
283 284
        # ${redate} sert à connaître la taille de la chaine $date,
        # mais sans se planter sur le nombre d'octet/nombre de caractères
285 286 287 288 289 290 291 292
        redate=${date//é/e}
        redate=${redate//û/u}
        if [ "$color_prompt" = yes ]; then
            echo -e "${line_color}┬─${redate//?/─}─┬${MINUS_LINE:${#date}-19}\n${announce_date_color}$date ${line_color}\n└─${redate//?/─}─┘\e[0m\n"
        else
            echo -e "┬─${redate//?/─}──┬${MINUS_LINE:${#date}-18}\n$date\n└─${redate//?/─}──┘\n"
        fi
        unset date
293
    # Sinon, on se contente d'une ligne de tirets
294
    else
295 296
        MINUS_CHAR=-
        gen_minus_line
297
    fi
298
}
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
### ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ###
### 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

317
# Mémoriser le timestamp d'exécution de la commande
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
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

353 354 355
# On n'exécute le welcome_message que à ce moment, parce que la customisation
# local a pu changer des couleurs
welcome_message