Is it possible to use zsh's built-in line editor (zle
) to feed input to a subprocess? That is, I would like to run zlewrap mycommand
where zlewrap
is a zsh function and mycommand
is any program that just reads lines from stdin; zlewrap
would effectively provide zle's line-editing capabilities to mycommand
. This is on the model of rlwrap
which does just this, but with readline and not zle for line editing.
Asked
Active
Viewed 1,674 times
22

Kevin
- 40,767

Gilles 'SO- stop being evil'
- 829,060
1 Answers
4
Here is how you can do it if using GNU screen:
Put a file called zf
in your $PATH
with:
#! /usr/bin/env zsh
zmodload -i zsh/zle
trap 'printf "\03"; exit' INT
HISTSIZE=100
while a=; vared -p "${2:-zle> }" -eh a; do
{
s=$(stty -g)
stty -echo -iexten -isig lnext '' werase '' eof '' rprnt '' kill ''
printf "%s\r" "$a"
print -rs -- "$a"
stty "$s"
} < $1
done
printf "\04"
And then, run the filter in screen as
<Ctrl-A>:exec .!. zf /dev/pts/x "> "
Replace /dev/pts/x with the actual Windows pty (output of tty
command in the window), and "> " with the prompt to display.
There will be occasional display glitches as both zsh and the application will write to the terminal in an unconcerted way.
Original at http://www.zsh.org/mla/users/2005/msg00186.html

Stéphane Chazelas
- 544,893
-
Any chance of some explanation of how this works? What does ".!." mean? Why does it need to be run in screen? – Ben Aug 31 '20 at 20:42
rlwrap
is quite widespread and you've probably used it. Think about the little pseudo shell things you get in things like mysql, sqlite, lftp, etc. They all have some implementation of a line editor that returns on line or block of lines at a time to the actual processor behind them.rlwrap
does hits quite neatly for any program that accepts STDIN, but it would be nice to have zle style bindings and abilities rather than readlines which are someone less extensive. – Caleb Jan 07 '12 at 23:26zsh
- http://www.cs.elte.hu/zsh-manual/zsh_14.html? - I don't quite understand your question, but Googled the title, and found that page. It might help, but I don't know. – Kevdog777 Aug 22 '12 at 08:33