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

Re: accept-line question

[redirecting to zsh-users as others may find this interesting]

On Apr 1, 12:36am, Dave Yost wrote:
} There must be something more I have to do besides "accept-line". But what?
} I type control-a after sourcing my script, and it doesn't work as I expect.
} 0 Wed 0:29:51 yost DaveBook ~
} 238 Z% cat accept-line-test.zsh
} function x1 {
}   BUFFER="$1"
}   zle -R
}   zle accept-line
} }
} function x2 {
}   x1 echo\ 1
}   x2 echo\ 2
} }
} zle -N xxx
} bindkey ^a xxx

There is something missing here, because "zle -N xxx" creates a widget
that calls the function "xxx", but you don't show a function named that.

Also x2 as shown is calling itself recursively, which will eventually
die of stack overflow.

} The output I want is
} 0 Wed 0:30:03 yost DaveBook ~
} 240 Z% echo 1
} 1
} 0 Wed 0:30:04 yost DaveBook ~
} 241 Z% echo 2
} 2
} 0 Wed 0:30:04 yost DaveBook ~
} 242 Z% 

That's now how it works; accept-line in x1 does not run the command and
then resume ZLE inside the x2 function, and even if it did it would not
reprint the prompt in that way.

All "accept-line" does is assert that the buffer is now in its final
state, so that after ZLE finishes, the regular shell parser should read
that line as the input.  However, ZLE does not finish until the current
active widget has also finished, so if accept-line is run again it can
still change the previously-accepted buffer.

You'd need something like this:

--- 8< ---
execute-now() {
  zle -I
  eval "$BUFFER"
  zle -R

zle -N execute-now
--- 8< ---

Then replace any "zle accept-line" with "zle execute-now".

However, *that* does not push the buffer onto the history stack, so even
more may be necessary depending on what you intend to accomplish.

Barton E. Schaefer

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