使用zsh的行编辑器来包装子流程


22

是否可以使用zsh的内置行编辑器(zle)将输入提供给子进程?也就是说,我想运行zlewrap mycommand哪里zlewrap是zsh函数,并且mycommand是从stdin读取行的任何程序;zlewrap可以有效地向提供zle的行编辑功能mycommand。这是在其模型上rlwrap执行的,但是使用readline而不是zle进行行编辑。


2
这看起来很有帮助:zsh.org/mla/users/2004/msg00917.html。它不像单个命令那样简单,但是您可以使该脚本适应您的程序(请阅读后续内容进行更正)。
imgx64 2011年

当我想到解决方案时,我遇到的一个问题是,如何指示何时要在ZLE中进行“编辑”以及何时要等待“ mycommand”返回?它只会返回一行吗?
多项式

2
像这样的@polynomial包装器一次返回一行到它们后面的进程。的使用rlwrap非常普遍,您可能已经使用过。考虑一下您在mysql,sqlite,lftp等中获得的一些伪外壳,它们都具有某种行编辑器的实现,该编辑器一次一行或一行返回到背后的实际处理器。rlwrap对于接受STDIN的任何程序,它的命中率都非常高,但是具有zle样式的绑定和功能而不是不那么广泛的readlines会很好。
Caleb 2012年

你看了手册zsh- cs.elte.hu/zsh-manual/zsh_14.html?-我不太了解您的问题,但是Google搜索了标题并找到了该页面。这可能会有所帮助,但我不知道。
2012年

1
好的,我只是想提供帮助,因为我看到您的问题在一年多以来都没有得到回答。抱歉,我的评论不够好。
2012年

Answers:


4

如果使用GNU屏幕,可以按照以下方法进行操作:

把一个名为zf$PATH有:

#! /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"

然后,在屏幕上以

<Ctrl-A>:exec .!. zf /dev/pts/x "> "

将/ dev / pts / x替换为实际的Windows pty(tty窗口中命令的输出),并在显示提示时将“>”替换为。

偶尔会有显示故障,因为zsh和应用程序都将以未经证实的方式写入终端。

原始文件位于http://www.zsh.org/mla/users/2005/msg00186.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.