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

Re: Interrupting globs (Re: Something rotten in tar completion)



Trimming some context ... still a lot, tho ...

On Dec 7,  2:42am, Mikael Magnusson wrote:
} Subject: Re: Interrupting globs (Re: Something rotten in tar completion)
}
} > } > Ah, I think I understand what's happening now. Prior to the patch,
} > } > pressing ctrl-c would abort out of chpwd() completely, but now it just
} > } > aborts whichever single command is running.
} >
} > } Another difference: the menu completion listing could previously be
} > } aborted with ctrl-c and keep the command line. It now closes the
} > } listing and aborts the command line. Additionally, with menu
} > } selection, you could previously ctrl-c out of selection and get to the
} > } menu, ctrl-c that again, and still have the command line. Now you just
} > } go straight from selection to a new empty command line.
} >
} 
} @@ -883,7 +883,7 @@ getbyte(long do_keytmout, int *timeout)
}          die = 0;
}          if (!errflag && !retflag && !breaks && !exit_pending)
}              continue;
} -        errflag = 0;
} +        errflag &= ~ERRFLAG_ERROR;
}          breaks = obreaks;
}          errno = old_errno;
}          return lastchar = EOF;
} 
} Undoing only this hunk fixes this for me. I can't find anything that
} stops being interruptible but I only tried for a minute.

This probably indicates that one or more of the callers of getbyte() (or
someone even earlier in the stack) need to clear user interrupts, rather
than that they should be cleared here.

It makes some kind of sense that code which could previously assume that
errflag had been completely cleared, might after this patch need to
explicitly handle interrupt conditions.

I'm not sure how we find all such places, though.  Some of them might
not even test errflag, at present; many might do so.

} @@ -1444,12 +1444,7 @@ zwaitjob(int job, int wait_cmd)
}          restore_queue_signals(q);
}          return 128 + last_signal;
}          }
} -        /* Commenting this out makes ^C-ing a job started by a function
} -           stop the whole function again.  But I guess it will stop
} -           something else from working properly, we have to find out
} -           what this might be.  --oberon
} -
} -        errflag = 0; */
} +        errflag &= ~ERRFLAG_ERROR;
}          if (subsh) {
}          killjb(jn, SIGCONT);
}          jn->stat &= ~STAT_STOPPED;
} 
} And commenting that line back out fixes my chpwd() hook ctrl-c thing.
} (or changing it to errflag &= ~ERRFLAG_INT; but I have no idea if that
} makes any sense).

Both things fit with Oberon's comment, actually.  Based on the comment,
what we do NOT want to do there is clear ERRFLAG_INT.  (That comment has
been there for more than 25 years, so if something else were going to
have stopped working properly I think we'd have found out by now.)

Whether clearing internal errors at that point is also necessary is a
fresh mystery.  I guess I'd try leaving it &= ~ERRFLAG_INT for a while.



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