'''Functional equivalents to pushd and popd, mostly ;^)''' proc pushd { dir } { if { ! [ file isdirectory $dir ] } { return -code error "${dir}: No such file or directory." } set home $::env(HOME) regsub ^~ $dir $home dir set here [ pwd ] regsub {^\.\.} $dir [ file dirname $here ] if { [ info exists ::__pushdpopd ] } { set last [ lindex $::__pushdpopd end ] if { ! [ string equal $here $last ] } { lappend ::__pushdpopd $here } else { return {} } } else { set ::__pushdpopd $here } lappend ::__pushdpopd $dir cd $dir } proc popd {} { if { ! [ info exists ::__pushdpopd ] } { return {} } set last [ lindex $::__pushdpopd end ] set prev [ lindex $::__pushdpopd end-1 ] if { ! [ string length $prev ] } { return -code error "Directory stack empty." } if { ! [ file isdirectory $prev ] } { set parent [ file dirname $prev ] if { [ file isdirectory $parent ] } { cd $parent } else { return -code error "${prev}: Parent directory missing." } } else { cd $prev } set ::__pushdpopd [ lrange $::__pushdpopd 0 end-2 ] }