Il y a bien longtemps j'avais découvert que, sous bash, on pouvait empiler des répertoires et s'y balader grâce à
pushd et
dirs qui remplacent avantageusement
cd /tres/long/chemin/penible/a/taper,
cd -,
cd encore/un/autre/chemin.
Donc voici une petite décoration qui rend le résultat de
dirs plus lisible, et rappelle où l'on en est après chaque
pushd (aliasé en p, p2, p3, ...p9)
Le
if 0 permet de sélectionner gawk ou perl selon les outils installés à coté de bash.
### Directory pushing
# Shortcuts + better presentation of the directories pushed.
## Display the directories pushed
if [ 0 == 1 ] ; then
# Si gawk
d() { \dirs | gawk '{gsub(/ ~/, "!~"); gsub(/ \//, "!/") ; n=split($0,arr,"!") ; for (i=1;i<=n;++i) print (i-1)" -> "arr[i] }'
}
else
# Si pas gawk
# d() { \dirs | sed 's# \([/.~]\)#
\1#g' |grep -n . | sed 's#:#-> #'
# d() { \dirs | perl -pe "s# ([/.~])#\n\1#g" |grep -n . | sed 's#:# -> #'
# d() { \dirs | perl -e '@t=<> ; @s = map ( { split(" ",$_) } @t) ; for ($n=0 ; $s[$n] ; ++$n) { print "$n --> " ; print "\033[00;34;34m" if ($n==0) ; print "$s[$n]\n" ; print "\033[01;00;0m" if ($n==0)}'
d() { \dirs | perl -e '@t=<> ; @s = map ( { split(" (?=[/~]+)",$_) } @t) ; for ($n=0 ; $s[$n] ; ++$n) { print "$n --> " ; print "\033[00;34;34m" if ($n==0) ; print "$s[$n]\n" ; print "\033[01;00;0m" if ($n==0)}'
}
fi
alias dirs=d
# Note: We can not directly write «dirs() { \dirs | ... }» as it would
# end in an infinite loop. Hence the declaration of «d(){}» and dirs as
# an alias for d.
## Push a directory
p() {
if [ -z "$*" ] ; then
# If no parameter, we do not want to push the current directory
\pushd > /dev/null
else
# The quotes in «"$*» permit to write «p $vim»
\pushd "$*" > /dev/null
fi
# List the directories pushed
d
}
## Move to a pushed directory
alias p1="p +1"
alias p2="p +2"
alias p3="p +3"
alias p4="p +4"
alias p5="p +5"
alias p6="p +6"
alias p7="p +7"
alias p8="p +8"
alias p9="p +9"
## Pop a directory
# Same workaround than «d()» and «dirs»
popd_int() { \popd $* > /dev/null ; d
}
alias popd=popd_int