.bashrc 20.7 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
# Licence : WTFPL

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

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
# 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
35
# Placez vos fichiers de bash-complétion custom dans ~/.bash/completion.d/
36
# ils seront chargés par la ligne suivante
37
[ -d ~/.bash/completion.d/ ] && for f in ~/.bash/completion.d/*; do source $f; done
38

39 40 41 42 43 44 45
# +-----+
# | VCS |
# +-----+

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

46 47 48 49 50 51 52 53 54 55 56
# Checks if the command provided is in the commands list and is
# executable
check_command(){
    [[ -n ${commands[$1]} ]] && [ -x ${commands[$1]} ] && return 0
    return 1
}

# If name should be overwritten (eg for git-svn), do it.
vcs_adjust(){
    [[ -n ${vcs_comm[overwrite_name]} ]] && vcs=${vcs_comm[overwrite_name]}
    return 0
57 58
}

59 60 61 62 63 64 65
# Formats two VCS_info messages, one with colors, and one without
vcs_formats(){
    local action=$1 branch=$2 base=$3 rev=$4
    local msg
    local -i i

    # printf is for readability (it's easier to find %s)
66
    msg="(%s)${MINUS_CHAR}[%s/%s"
67 68 69 70 71 72 73 74 75 76 77 78 79
    msg=$(printf $msg $vcs ${base/*\/} $branch)

    # If there is a revnumber, print it
    if [ ! -z ${rev} ]; then
        msg="${msg}:%s"
        msg=$(printf $msg $rev)
    fi

    # Print the current cvs action state
    if [ ! -z ${action} ] ; then
        msg="${msg}|%s"
        msg=$(printf $msg $action)
    fi
80
    msg="${msg}]${MINUS_CHAR}"
81 82 83 84

    msgs[1]=$msg

    # Same shit with colors
85
    msg="${nocolor_prompt}${vcs_symbols_color}(${vcs_type_color}%s${vcs_symbols_color})${vcs_sep_color}${MINUS_CHAR}${vcs_symbols_color}[${vcs_repo_color}%s${vcs_sep_color}/${vcs_branch_color}%s"
86 87 88 89 90 91 92 93 94
    msg=$(printf $msg $vcs ${base/*\/} $branch)
    if [ ! -z ${rev} ]; then
        msg="${msg}${vcs_colon_color}:${vcs_rev_color}%s"
        msg=$(printf $msg $rev)
    fi
    if [[ ! -z ${action} ]] ; then
        msg="${msg}${nocolor_prompt}|${vcs_action_color}%s"
        msg=$(printf $msg $action)
    fi
95
    msg="${msg}${vcs_symbols_color}]${line_color_prompt}${MINUS_CHAR}"
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
    msgs[0]=$msg

    return 0
}

# Uses -P option for cd in order to resolve symlinks
vcs_realpath(){
    (
        cd -P $1 2>/dev/null && pwd
    )
}

# Feature to detect a special dir, at the top of
# the current repo
detect_by_dir(){
    local dirname=$1
    local basedir="." realbasedir

    realbasedir="$(vcs_realpath ${basedir})"
    while [[ ${realbasedir} != '/' ]]; do
        [[ -r ${realbasedir} ]] || return 1

        # Tries to find detect_need_file (eg formats) in the dir
        if [[ -n ${vcs_comm[detect_need_file]} ]] ; then
            [[ -d ${basedir}/${dirname} ]] && \
            [[ -e ${basedir}/${dirname}/${vcs_comm[detect_need_file]} ]] && \
                break
123
        else
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
            [[ -d ${basedir}/${dirname} ]] && break
        fi

        basedir=${basedir}/..
        realbasedir="$(vcs_realpath ${basedir})"
    done

    [[ ${realbasedir} == "/" ]] && return 1
    vcs_comm[basedir]=${realbasedir}
    return 0
}

# Git is powerfull
git_detect(){
    if check_command git && git rev-parse --is-inside-work-tree &> /dev/null; then
        vcs_comm[gitdir]="$(git rev-parse --git-dir 2> /dev/null)" || return 1
        if   [[ -d ${vcs_comm[gitdir]}/svn ]]             ; then vcs_comm[overwrite_name]='git-svn'
        elif [[ -d ${vcs_comm[gitdir]}/refs/remotes/p4 ]] ; then vcs_comm[overwrite_name]='git-p4' ; fi
        return 0
    fi
    return 1
}

# Mercurial isn't
hg_detect(){
    check_command hg || return 1
150 151 152
    vcs_comm[detect_need_file]=store
    detect_by_dir '.hg'
    return $?
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
}

# .svn in each directories
svn_detect() {
    check_command svn || return 1
    [[ -d ".svn" ]] && return 0
    return 1
}

bzr_detect(){
    check_command bzr || return 1
    vcs_comm[detect_need_file]=branch/format
    detect_by_dir '.bzr'
    return $?
}

cdv_detect(){
    check_command cdv || return 1
    vcs_comm[detect_need_file]=format
    detect_by_dir '.cdv'
    return $?
}

cvs_detect(){
    check_command svn || return 1
    [[ -d "./CVS" ]] && [[ -r "./CVS/Repository" ]] && return 0
    return 1
}

darcs_detect(){
    check_command darcs || return 1
184 185
    # darcs diff seems a good choice since big diff is not the
    # common state
186
    darcs diff 2> /dev/null 1>&2 || return 1
187 188
    vcs_comm[basedir]=$(darcs show repo |awk '{if($1 == "Root:") print $2}')
    return 0
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
}

# Find git's branch
git_getbranch (){
    local gitbranch gitdir=$1 tmp actiondir
    local gitsymref='git symbolic-ref HEAD'

    # In certain circumstances, we have to take into account
    # actions
    actiondir=''
    for tmp in "${gitdir}/rebase-apply" \
               "${gitdir}/rebase"       \
               "${gitdir}/../.dotest"; do
        if [[ -d ${tmp} ]]; then
            actiondir=${tmp}
            break
        fi
    done
    if [[ -n ${actiondir} ]]; then
        gitbranch="$(${gitsymref} 2> /dev/null)"
        [[ -z ${gitbranch} ]] && [[ -r ${actiondir}/head-name ]] \
            && gitbranch="$(< ${actiondir}/head-name)"

    # MERGE_HEAD state
    elif [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
        gitbranch="$(eval $gitsymref 2> /dev/null)"
        [[ -z ${gitbranch} ]] && gitbranch="$(< ${gitdir}/MERGE_HEAD)"

    # rebase
    elif [[ -d "${gitdir}/rebase-merge" ]] ; then
        gitbranch="$(< ${gitdir}/rebase-merge/head-name)"

    # dotest
    elif [[ -d "${gitdir}/.dotest-merge" ]] ; then
        gitbranch="$(< ${gitdir}/.dotest-merge/head-name)"

    # Normal case
226
    else
227 228 229 230 231 232 233 234 235 236 237 238
        gitbranch="$(eval $gitsymref 2> /dev/null)"

        # shit happens
        if [[ $? -ne 0 ]] ; then
            gitbranch="refs/tags/$(git describe --exact-match HEAD 2>/dev/null)"

            # big shit happens
            if [[ $? -ne 0 ]] ; then
                gitbranch=$(< $gitdir/HEAD)
                gitbranch="${gitbranch:0:7}..."
            fi
        fi
239
    fi
240 241 242 243

    # keep only the last part of gitbranch
    printf '%s' "${gitbranch#refs/[^/]*/}"
    return 0
244
}
245

246 247 248 249 250 251 252 253 254 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 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
git_getaction(){
    local gitaction='' gitdir=$1
    local tmp

    for tmp in "${gitdir}/rebase-apply" \
               "${gitdir}/rebase"       \
               "${gitdir}/../.dotest" ; do
        if [[ -d ${tmp} ]] ; then
            if   [[ -f "${tmp}/rebasing" ]] ; then
                gitaction="rebase"
            elif [[ -f "${tmp}/applying" ]] ; then
                gitaction="am"
            else
                gitaction="am/rebase"
            fi
            printf '%s' ${gitaction}
            return 0
        fi
    done

    for tmp in "${gitdir}/rebase-merge/interactive" \
               "${gitdir}/.dotest-merge/interactive" ; do
        if [[ -f "${tmp}" ]] ; then
            printf '%s' "rebase-i"
            return 0
        fi
    done

    for tmp in "${gitdir}/rebase-merge" \
               "${gitdir}/.dotest-merge" ; do
        if [[ -d "${tmp}" ]] ; then
            printf '%s' "rebase-m"
            return 0
        fi
    done

    if [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
        printf '%s' "merge"
        return 0
    fi

    if [[ -f "${gitdir}/BISECT_LOG" ]] ; then
        printf '%s' "bisect"
        return 0
    fi
    return 1
}

git_get_data(){
    local gitdir gitbase gitbranch gitaction

    gitdir=${vcs_comm[gitdir]}
    gitbranch="$(git_getbranch ${gitdir})"

    if [[ -z ${gitdir} ]] || [[ -z ${gitbranch} ]] ; then
        return 1
    fi

    vcs_adjust
    gitaction="$(git_getaction ${gitdir})"
    gitprefix=$(git rev-parse --show-prefix)
    gitbase=${PWD%/${gitprefix%/}}
    vcs_formats "${gitaction}" "${gitbranch}" "${gitbase}" ''
    return 0
}

hg_get_data(){
    local hgbranch hgbase file

    hgbase=${vcs_comm[basedir]}

317 318
    # Check if hg branch is efficient
    hgbranch=$(hg branch)
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340

    vcs_formats '' "${hgbranch}" "${hgbase}" ''
    return 0
}

svn_get_data(){
    local svnbase svnbranch
    local -a svninfo

    svnbase="."
    while [[ -d "${svnbase}/../.svn" ]]; do
        svnbase="${svnbase}/.."
    done
    svnbase="$(vcs_realpath ${svnbase})"
    svnrev=$(svn info | awk '{if($1 == "Révision :") print $2}')
    svnbranch=$(svn info | awk '{if($1 == "URL :") print $2}'|awk -F "/" '{ print $NF }')

    vcs_formats '' "${svnbranch}" "${svnbase}" "${svnrev}"
    return 0
}

bzr_get_data(){
341
    local bzrbase bzrrev bzrbranch bzrinfo
342 343 344

    bzrbase=$(bzr info|awk '{if ($1 == "branch" && $2 == "root:") print $3}')
    bzrbase="$(vcs_realpath ${bzrbase})"
345 346 347
    bzrinfo=$(bzr version-info|awk '{if ($1 == "branch-nick:"||$1 == "revno:") print $2}')
    bzrrev=$(echo $bzrinfo|awk '{print $1}')
    bzrbranch=$(echo $bzrinfo|awk '{print $2}')
348

349
    vcs_formats '' "${bzrbranch}" "${bzrbase}" "${bzrrev}"
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
    return 0
}

cdv_get_data(){
    local cdvbase

    cdvbase=${vcs_comm[basedir]}
    vcs_formats '' "${cdvbase/*\/}" "${cdvbase}" ''
    return 0
}

cvs_get_data(){
    local cvsbranch cvsbase basename

    cvsbase="."
    while [[ -d "${cvsbase}/../CVS" ]]; do
        cvsbase="${cvsbase}/.."
    done
    cvsbase="$(vcs_realpath ${cvsbase})"
    cvsbranch=$(< ./CVS/Repository)
    basename=${cvsbase/*\/}
    cvsbranch=${cvsbranch#${basename}/}

    [[ -z ${cvsbranch} ]] && cvsbranch=${basename}
    vcs_formats '' "${cvsbranch}" "${cvsbase}" ''
    return 0
}

darcs_get_data(){
    local darcsbase

    darcsbase=${vcs_comm[basedir]}
    vcs_formats '' "${darcsbase/*\/}" "${darcsbase}" ''
    return 0
}

vcs_info(){
    local -i found
    local -ax msgs
    local -Ax vcs_comm commands
    local -x vcs
    local -a vcss
392
    local -A disabled
393 394

    vcs="init"
395 396 397 398
    vcss=(git hg darcs svn bzr cvs cdv)
    disabled[cdv]=1
    disabled[cvs]=1
    disabled[bzr]=1
399
    for i in $(seq 0 $(( ${#vcss[*]} - 1 ))); do
400 401 402
        if [[ disabled[${vcss[$i]}] -eq 1 ]]; then
            continue
        fi
403
        commands[${vcss[$i]}]=$( (which ${vcss[$i]} 2>/dev/null >&2 && which ${vcss[i]})||echo true);
404 405 406 407
    done;

    found=0
    for vcs in ${vcss[*]}; do
408 409 410
        if [[ disabled[${vcs}] -eq 1 ]]; then
            continue
        fi
411 412 413 414 415 416 417 418 419 420 421 422
        ${vcs}_detect && found=1 && break
    done

    (( found == 1 )) && ${vcs}_get_data

    if [ ${color_prompt} = "yes" ]; then
        VCS_info=${msgs[0]}
    else
        VCS_info=${msgs[1]}
    fi
    VCS_size=${#msgs[1]}
}
423

Vincent Le gallic's avatar
Vincent Le gallic committed
424 425 426 427 428 429 430
# 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 "$@"
431
	ret=$?
432
        if [ -f ~/.umaskrc ]; then
433
            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
434
        fi
435
        return $ret
Vincent Le gallic's avatar
Vincent Le gallic committed
436 437
}

438 439 440 441 442 443
### Attention à ce que vous éditez dans cette section ###
### v v v v v v v v v v ###
# +----------------------+
# | Génération du prompt |
# +----------------------+

444 445 446 447 448
# 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
449
cyan_thin='\e[0;36m'
450 451 452 453 454
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
455
rouge_thin='\e[0;31m'
456 457 458
vert='\e[1;32m'
vert_thin='\e[0;32m'
bleu='\e[1;34m'
Vincent Le gallic's avatar
Vincent Le gallic committed
459
bleu_thin='\e[0;34m'
460
blanc='\e[1;37m'
Vincent Le gallic's avatar
Vincent Le gallic committed
461
blanc_thin='\e[0;37m'
462 463
nocolor='\e[0m'
cyan_prompt="\[${cyan}\]"
Vincent Le gallic's avatar
Vincent Le gallic committed
464
cyan_thin_prompt="\[${cyan_thin}\]"
465 466 467 468 469
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
470
rouge_thin_prompt="\[${rouge_thin}\]"
471 472 473
vert_prompt="\[${vert}\]"
vert_thin_prompt="\[${vert_thin}\]"
bleu_prompt="\[${bleu}\]"
Vincent Le gallic's avatar
Vincent Le gallic committed
474 475 476
bleu_thin_prompt="\[${bleu_thin}\]"
blanc_prompt="\[${blanc}\]"
blanc_thin_prompt="\[${blanc_thin}\]"
477
nocolor_prompt="\[${nocolor}\]"
478 479


480 481 482
# 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
483
display_vcs_info=no
484

485 486 487 488 489 490 491

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

    MINUS_LINE=""
492 493
    # Pas la peine de refaire le travail tant qu'on ne change
    # pas le nombre de colonnes.
494 495 496 497 498 499 500 501 502 503
    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
{
504
    local pwd ERR DATE PROMPT DIR POST_DIR
505 506 507 508 509 510 511 512 513
    # 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
514
    (( SAVE_COLUMNS == COLUMNS )) || gen_minus_line
515 516
    
    # À décommenter si on veut afficher des infos
517 518
    # quand on se trouve dans un dépôt versionné
    if [ "$display_vcs_info" = yes ]; then
519
        vcs_info
520
    fi
521
    
522
    # Chemin courant, en faisant attention à la largeur de la fenêtre
523 524 525 526 527 528 529 530 531 532 533 534 535
    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
536 537
    
    # Génération des différents morceaux du prompt, avec ou sans la couleur
538
    if [ "$color_prompt" = yes ]; then
539
        DIR="< ${pwd_color}"$DIR"${line_color_prompt} >"
540 541 542
        # 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
543
        ERR='[ \[\e[1;$((31+($?==0)*6))m\]$?'${line_color_prompt}' ]'$MINUS_CHAR
544 545
        # Affichage de l'heure courante
        # pratique pour savoir quand on a tapé la commande précédente
546
        DATE="( ${date_color}\D{%H:%M:%S}${line_color_prompt} )"
547 548
        # Deuxième ligne du prompt "user@host $"
        # Attention "\\\$" devient \$, c'est-à-dire # pour root, $ pour les autres
549
        PROMPT="${username_color}\u${symbols_color}@${host_color}\h ${symbols_color}\\\$ ${nocolor_prompt}"
550
        # On fusionne tout ça
551
        PS1=$TITLE${line_color_prompt}$MINUS_CHAR$DATE$MINUS_CHAR$DIR$MINUS_CHAR${line_color_prompt}$POST_DIR$VCS_info$ERR'\n'$PROMPT
552 553 554 555
    else
        DIR="< "$DIR" >"
        ERR='[ $? ]'$MINUS_CHAR
        DATE="( \D{%H:%M:%S} )"
556
        PROMPT="\u@\h \\\$ "
557
        PS1=$TITLE$MINUS_CHAR$DATE$MINUS_CHAR$DIR$MINUS_CHAR$POST_DIR$VCS_info$ERR'\n'$PROMPT
558
    fi
559 560
}

561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590
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_prompt}
    host_color=${bleu_prompt}
    symbols_color=${vert_prompt}
    # Couleur de la ligne séparatrice de prompt
    line_color=${cyan}
    line_color_prompt=${cyan_prompt}
    # Couleur du path actuel
    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}
    # Couleur d'affichage de vcs_info
    vcs_symbols_color=${violet_thin_prompt}
    vcs_type_color=${jaune_thin_prompt}
    vcs_branch_color=${vert_thin_prompt}
    vcs_repo_color=${vert_thin_prompt}
    vcs_action_color=${rouge_thin_prompt}
    vcs_sep_color=${jaune_thin_prompt}
    vcs_rev_color=${jaune_thin_prompt}
    vcs_colon_color=${rouge_thin_prompt}
else
    # pas de support de la couleur
    color_prompt=no
fi

591 592 593 594 595 596 597
# 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

598
# On régénére le prompt après chaque commande
599 600 601 602 603 604
PROMPT_COMMAND=prompt_command

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

605 606
function welcome_message ()
{
607 608 609
    # 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
610 611 612 613
    if [[ $(uname) == Linux && ( $(locale charmap) == UTF-8 && $TERM != screen ) ]]; then
        MINUS_CHAR=
        gen_minus_line
        date=$(/bin/date +"%R, %A %d %B %Y")
614 615
        # ${redate} sert à connaître la taille de la chaine $date,
        # mais sans se planter sur le nombre d'octet/nombre de caractères
616 617 618 619 620 621 622 623
        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
624
    # Sinon, on se contente d'une ligne de tirets
625
    else
626 627
        MINUS_CHAR=-
        gen_minus_line
628
    fi
629
}
630 631 632 633 634 635 636 637
### ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ###
### Attention à ce que vous avez édité dans cette section ###


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

638 639 640 641 642
# On spécifie explicitement le fichier d'historique.
# En effet, si on jongle entre bash et zsh, per exemple,
# comme ils n'utilisent pas le même format pour stocker le timestamp
# des commandes, on se retrouve avec des comportements non souhaités
# si on ne change pas le fichier d'historique entre les deux.
643
export HISTFILE=~/.bash/history/$HOSTNAME
Fardale's avatar
Fardale committed
644
if [ ! -d ~/.bash/history ]; then
645 646
    mkdir -p ~/.bash/history
fi
647

648 649 650 651 652 653 654 655 656 657
# 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

658
# Mémoriser le timestamp d'exécution de la commande
659 660 661 662 663 664 665 666 667 668 669 670 671 672 673
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.
674 675 676 677
#~# export EDITOR='nano'
#~# export EDITOR='vim'
#~# export EDITOR='emacs'
#~# export EDITOR='jed'
678 679 680 681

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

682 683 684 685
#~# # Décommentez les lignes suivantes et peuplez-les correctement si
#~# # vous avez besoin de commiter en tant que root *et* que votre
#~# # /etc/sudoers contient bien la directive
#~# # Defaults env_keep += "<les variables en question>"
686 687
#~# export GIT_AUTHOR_NAME="$(git config user.name)"
#~# export GIT_AUTHOR_EMAIL="$(git config user.email)"
688 689 690 691 692

# +----------+
# | Sourcing |
# +----------+

693
# Chargement des alias
694 695
if [ -f ~/.bash/aliases ]; then
    . ~/.bash/aliases
696 697 698
fi

# Fichier locaux (utile quand on clone sa config sur plusieurs machines)
Fardale's avatar
Fardale committed
699
if [ -f ~/.bash/bashrc.local ]; then
700 701
    . ~/.bash/bashrc.local
fi
702

703 704
if [ -f ~/.bash/aliases_local ]; then
    . ~/.bash/aliases_local
705 706
fi

707 708 709 710 711

# +-----+
# | End |
# +-----+

712 713 714
# On n'exécute le welcome_message que à ce moment, parce que la customisation
# local a pu changer des couleurs
welcome_message