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

Re: IGNORE_EOF like in bash



On Apr 25, 10:33pm, Christoph Lange wrote:
} Subject: IGNORE_EOF like in bash
}
} [...] I found out that one can script it in zsh-4.0.1-pre-3 [...]
} since the shell no longer bypasses ZLE when ^D is pressed on an empty
} command line.

Almost correct:  It doesn't bypass ZLE on ^D provided `setopt ignoreeof'.
 
} Here is my solution, configurable by the variable IGNOREEOF:
} 
} IGNOREEOF=3				# or something like that
} 
} bash-ctrl-d() {
}   if [[ $CURSOR == 0 && -z $BUFFER ]]
}   then
}     [[ -z $IGNOREEOF || $IGNOREEOF == 0 ]] && exit
}     [[ $LASTWIDGET == bash-ctrl-d ]] \
}       && (( --__BASH_IGNORE_EOF == 0 )) \
}       && exit
}     : ${__BASH_IGNORE_EOF=$IGNOREEOF}
}     zle send-break
}   else
}     zle delete-char-or-list
}   fi
} }

With your function, IGNOREEOF=3 will require four ^D to exit, or two ^D
and then anything else, repeated four times (because it never starts
__BASH_IGNORE_EOF over at three after the first call to this function).

I think you want:

bash-ctrl-d() {
  if [[ $CURSOR == 0 && -z $BUFFER ]]
  then
    [[ -z $IGNOREEOF || $IGNOREEOF == 0 ]] && exit
    if [[ $LASTWIDGET == bash-ctrl-d ]]
    then
      (( --__BASH_IGNORE_EOF <= 0 )) && exit
    else
      (( __BASH_IGNORE_EOF = IGNOREEOF-1 ))
    fi
    zle send-break
  else
    zle delete-char-or-list
  fi
}


-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com

Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net   



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