.bashrc 10.3 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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
# +-----+
# | VCS |
# +-----+

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

find_up () {
    path="$1"
    shift 1
    while [[ "`readlink -f -- \"$path\"`" != "/" ]];
    do
        find "$path"  -maxdepth 1 -mindepth 1 "$@"
        path=${path}/..
    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
82
            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}"
83 84 85 86 87 88 89 90 91
        else
            VCS_info="($LTYPE)-[$LBRANCH]"
        fi
        VCS_size=$((${#LTYPE}+${#LBRANCH}+5))
    else
        VCS_info=""
        VCS_size=0
    fi
}
92

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
	ret=$?
102
        if [ -f ~/.umaskrc ]; then
103
            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
104
        fi
105
        return $ret
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
# 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
119
cyan_thin='\e[0;36m'
120 121 122 123 124
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
125
rouge_thin='\e[0;31m'
126 127 128
vert='\e[1;32m'
vert_thin='\e[0;32m'
bleu='\e[1;34m'
Vincent Le gallic's avatar
Vincent Le gallic committed
129
bleu_thin='\e[0;34m'
130
blanc='\e[1;37m'
Vincent Le gallic's avatar
Vincent Le gallic committed
131
blanc_thin='\e[0;37m'
132 133
nocolor='\e[0m'
cyan_prompt="\[${cyan}\]"
Vincent Le gallic's avatar
Vincent Le gallic committed
134
cyan_thin_prompt="\[${cyan_thin}\]"
135 136 137 138 139
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
140
rouge_thin_prompt="\[${rouge_thin}\]"
141 142 143
vert_prompt="\[${vert}\]"
vert_thin_prompt="\[${vert_thin}\]"
bleu_prompt="\[${bleu}\]"
Vincent Le gallic's avatar
Vincent Le gallic committed
144 145 146
bleu_thin_prompt="\[${bleu_thin}\]"
blanc_prompt="\[${blanc}\]"
blanc_thin_prompt="\[${blanc_thin}\]"
147
nocolor_prompt="\[${nocolor}\]"
148 149 150 151 152

if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # support de la couleur
    color_prompt=yes
    # Couleurs dans "user@host $"
153 154 155
    username_color=${rouge_prompt}
    host_color=${bleu_prompt}
    symbols_color=${vert_prompt}
156
    # Couleur de la ligne séparatrice de prompt
157 158
    line_color=${cyan}
    line_color_prompt=${cyan_prompt}
159
    # Couleur du path actuel
160 161 162 163 164
    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}
165
    # Couleur d'affichage de vcs_info
166 167 168
    vcs_symbols_color=${violet_thin_prompt}
    vcs_type_color=${jaune_thin_prompt}
    vcs_branch_color=${vert_thin_prompt}
169 170 171 172 173
else
    # pas de support de la couleur
    color_prompt=no
fi

174 175 176 177 178
# 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

179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197

# 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
198
    local pwd ERR DATE PROMPT DIR POST_DIR
199
    (( SAVE_COLUMNS == COLUMNS )) || gen_minus_line
200

201 202 203 204 205
    # À décommenter si on veut des infos
    # quand on se trouve dans un dépôt versionné
    if [ "$display_vcs_info" = yes ]; then
        get_vcs_info
    fi
206 207 208 209 210 211 212 213 214 215 216 217 218 219
    
    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
220
    if [ "$color_prompt" = yes ]; then
221
        DIR="< ${pwd_color}"$DIR"${line_color_prompt} >"
222 223 224
        # 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
225 226
        ERR='[ \[\e[1;$((31+($?==0)*6))m\]$?'${line_color_prompt}' ]'$MINUS_CHAR
        DATE="( ${date_color}\D{%H:%M:%S}${line_color_prompt} )"
227
        PROMPT="${username_color}\u${symbols_color}@${host_color}\h ${symbols_color}\$ ${nocolor_prompt}"
228
        PS1=$TITLE${line_color_prompt}$MINUS_CHAR$DATE$MINUS_CHAR$DIR$MINUS_CHAR$VCS_info${line_color_prompt}$POST_DIR$ERR'\n'$PROMPT
229 230 231 232 233 234 235
    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
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
}

# 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 |
# +-------------------+

252 253 254 255 256 257 258 259 260 261 262 263 264 265
function welcome_message ()
{
    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}
        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
266
    else
267 268
        MINUS_CHAR=-
        gen_minus_line
269
    fi
270
}
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
### ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ###
### 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

289
# Mémoriser le timestamp d'exécution de la commande
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 317 318 319 320 321 322 323 324
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

325 326 327
# On n'exécute le welcome_message que à ce moment, parce que la customisation
# local a pu changer des couleurs
welcome_message