.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} )"
Vincent Le gallic's avatar
Vincent Le gallic committed
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
    else
        DIR="< "$DIR" >"
        ERR='[ $? ]'$MINUS_CHAR
        DATE="( \D{%H:%M:%S} )"
233
        PROMPT="\u@\h \\\$ "
234
235
        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