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

Re: tab inserts literal tab instead of completing at beginning of line

On 19 May 2011 18:00, Mikael Magnusson <mikachu@xxxxxxxxx> wrote:
> On 19 May 2011 17:19, Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:
>> On Thu, May 19, 2011 at 2:36 AM, Mikael Magnusson <mikachu@xxxxxxxxx> wrote:
>>> Well, in my case there's no more input, just me pressing tab. How's
>>> this? (it works)
>> Sorry, I'm not sure what this does. Add an "empty" value to the
>> insert-tab style?  If so then that's OK, I think.
> Ah, I was in my own little world there, I see more context is needed
> :). What it does is what I described last in my first message: insert
> a tab if the line is empty, or contains only tabs (presumably you want
> to paste more than one sometimes), otherwise completion as usual.

tl;dr nm this whole thing

Hmmm, so I'm confused again. It turns out my patch didn't work as well
as I hoped. When I press ctrl-n or alt-m, it just inserts those
literally as well. I tried comparing _complete_debug output for
insert-tab=false and =true, but they were the same. I could do this,
( "$KEYS" = $'\t' && "$tmp" = empty && ${#${BUFFER##$'\t'#}} -eq 0 )

So I just erased a big paragraph here explaining how I'm confused
since _complete_debug output is identical with insert-tab set to true
and false. It took a few minutes for me to realize this meant this is
handled in the C code. I got to this line, and decided to give up this
project for now.
uselist = (useline ?  ((isset(AUTOLIST) && !isset(BASHAUTOLIST)) ?
(isset(LISTAMBIGUOUS) ? 3 : 2) : 0) : 1);
useline is set by this earlier line
useline = (wouldinstab ? -1 : (lst != COMP_LIST_COMPLETE));
and wouldinstab is decided by this function, some time way before this
static int
    ZLE_STRING_T s = zleline + zlecs - 1;

    if (keybuf[0] != '\t' || keybuf[1])
	return 0;
    for (; s >= zleline && *s != ZWC('\n'); s--)
	if (*s != ZWC('\t') && *s != ZWC(' '))
	    return 0;
    if (compfunc) {
	wouldinstab = 1;

	return 0;
    return 1;

So I would have to somehow modify all the steps leading from
wouldinstab to useline/list/something to pass yet another value and
then compare this to my 'empty' value which I tracked down is called
'compinsert' in the C code. Since the code is already a mess of state
tracked by un-named magic integer values, I decided not to make
matters worse. Also to retain my sanity.

Mikael Magnusson

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