Version 0 of pushdpopd.tcl

Updated 2001-12-04 18:47:34

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 ]
   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 ]
 }