Problem with <Control-D> and IGNORE_EOF #139

Open
OmeGak opened this Issue Apr 5, 2016 · 2 comments

2 participants

@OmeGak

I've been facing a problem with IGNORE_EOF recently and I found it was caused by zsh-autosuggestions. I've been getting this on <Control-D>:

<Control-D>
zsh: do you wish to see all 3221 possibilities (3221 lines)?

Instead of the usual:

<Control-D>
zsh: use 'logout' to logout.

This is the minimal configuration in .zshrc to reproduce the issue:

source "$DOT/zsh/.antigen/antigen.zsh"
antigen bundle zsh-users/zsh-autosuggestions
antigen apply
setopt ignore_eof

I managed to walk around the issue binding ^D to beep, but it seems like a bug to me.

@ericfreese
zsh-users member

Looks like this has something to do with ctrl+d being bound to a widget that overrides the delete-char-or-list builtin widget:

% zsh -f
%% setopt ignore_eof
%% bindkey '^D'
"^D" delete-char-or-list
%% <Control-D>
zsh: use 'exit' to exit.
%% delete-char-or-list() { zle .delete-char-or-list }
%% zle -N delete-char-or-list
%% <Control-D>
zsh: do you wish to see all 1782 possibilities (594 lines)?
%% bindkey '^D' .delete-char-or-list
%% <Control-D>
zsh: use 'exit' to exit.
@ericfreese
zsh-users member

Comment in the zle code confirms:

/*
 * The rule is that "zle -N" widgets suppress EOF warnings.  When
 * a "zle -N" widget invokes "zle another-widget" we pass through
 * this code again, but with actual arguments rather than with the
 * zlenoargs placeholder.
 */

Not sure how to fix this right now. At some point, I'll dig into the execzlefunc function with gdb and see if I can get more insights on how this all fits together.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment