Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: `popd' is blocked on non-existent directory



Bart Schaefer writes:
 > The compatible-with-other-shells behavior in this case would be to issue a
 > `directory stack empty' error message.  (However, I could see an argument
 > that PUSHD_TO_HOME ought to apply to popd as well.)

Thanks.  I've added a little code to do what you suggest and have popd also
honor the PUSHD_TO_HOME option.  Now, if you popd when there's a single
dirstack entry and PUSHD_TO_HOME is set, it'll pop you to your home
directory:

160 kontiki%> setopt pushdtohome 
162 kontiki%> dirs /usr/bin /tmp
163 kontiki%> dirs
~ /usr/bin /tmp
164 kontiki%> popd
/usr/bin /tmp
165 kontiki%> popd
/tmp
165 kontiki%> popd
~

.. and with pushdtohome unset:

156 kontiki%> unsetopt pushdtohome
157 kontiki%> dirs /usr/bin /tmp
158 kontiki%> dirs
~ /usr/bin /tmp
159 kontiki%> popd
/usr/bin /tmp
160 kontiki%> popd
/tmp
160 kontiki%> popd
popd: directory stack empty


I've attached the diffs (which include your changes):


*** builtin.c	Wed Oct 16 17:31:48 1996
--- builtin.c.orig	Wed Oct 16 16:11:23 1996
***************
*** 998,1018 ****
      char *dest;
  
      if (!argv[0]) {
-         if (func == BIN_POPD && !nextnode(firstnode(dirstack))) {
-             if (unset(PUSHDTOHOME)) {
- 	        zwarnnam(nam, "directory stack empty", NULL, 0);
- 	        return NULL;
-             }
-             else {
-                 pushnode(dirstack, ztrdup(home));
-                 dir = nextnode(firstnode(dirstack));
-             }
-         }
  	if (func == BIN_PUSHD && unset(PUSHDTOHOME))
  	    dir = nextnode(firstnode(dirstack));
  	if (dir)
  	    insertlinknode(dirstack, dir, getlinknode(dirstack));
! 	else if (func != BIN_POPD)
  	    pushnode(dirstack, ztrdup(home));
      } else if (!argv[1]) {
  	int dd;
--- 998,1008 ----
      char *dest;
  
      if (!argv[0]) {
  	if (func == BIN_PUSHD && unset(PUSHDTOHOME))
  	    dir = nextnode(firstnode(dirstack));
  	if (dir)
  	    insertlinknode(dirstack, dir, getlinknode(dirstack));
! 	else
  	    pushnode(dirstack, ztrdup(home));
      } else if (!argv[1]) {
  	int dd;
***************
*** 1058,1063 ****
--- 1048,1054 ----
      target = dir;
      if (func == BIN_POPD) {
  	if (!dir) {
+ 	    zsfree(getlinknode(dirstack));
  	    target = dir = firstnode(dirstack);
  	} else if (dir != firstnode(dirstack)) {
  	    return dir;
***************
*** 1070,1077 ****
      if (!(dest = cd_do_chdir(nam, getdata(dir)))) {
  	if (!target)
  	    zsfree(getlinknode(dirstack));
- 	if (func == BIN_POPD)
- 	    zsfree(remnode(dirstack, dir));
  	return NULL;
      }
      if (dest != getdata(dir)) {
--- 1061,1066 ----


Messages sorted by: Reverse Date, Date, Thread, Author