Usando o editor de linhas do zsh para contornar subprocessos

22

É possível usar o editor de linha interno do zsh ( zle) para alimentar a entrada de um subprocesso? Ou seja, eu gostaria de executar zlewrap mycommandonde zlewrapestá uma função zsh e mycommandqualquer programa que apenas leia linhas de stdin; zlewrapforneceria efetivamente os recursos de edição de linha do zle para mycommand. Este é o modelo rlwrapque faz exatamente isso, mas com o readline e não o zle para edição de linha.

Gilles 'SO- parar de ser mau'
fonte
2
Isso parece útil: zsh.org/mla/users/2004/msg00917.html . Não é tão fácil quanto um único comando, mas você pode adaptar esse script ao seu programa (leia os seguintes para correções).
imgx64
Um problema que tenho quando penso em soluções é como você indica quando deseja 'editar' no ZLE e quando deseja aguardar o retorno do 'mycommand'? Ele retorna apenas uma linha?
polinomial
2
Wrappers @ polinomiais como esse retornam uma linha de cada vez ao processo por trás deles. O uso de rlwrapé bastante difundido e você provavelmente já o usou. Pense nas pequenas coisas pseudo-shell que você obtém em mysql, sqlite, lftp, etc. Todas elas têm alguma implementação de um editor de linha que retorna on-line ou bloco de linhas por vez para o processador real por trás deles. rlwrapfaz muito sucesso em qualquer programa que aceite STDIN, mas seria bom ter habilidades e vínculos no estilo zle, em vez de linhas de leitura que são alguém menos extenso.
Caleb
Você já consultou o manual zsh- cs.elte.hu/zsh-manual/zsh_14.html ? - Não entendi bem sua pergunta, mas pesquisei no título no Google e encontrei essa página. Pode ajudar, mas não sei.
precisa saber é o seguinte
1
Ok, eu estava apenas tentando ajudar, pois vejo que sua pergunta não foi respondida há mais de um ano. Desculpe, meu comentário não foi bom o suficiente.
precisa saber é o seguinte

Respostas:

4

Aqui está como você pode fazer isso usando a tela GNU:

Coloque um arquivo chamado zfno seu $PATHcom:

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

E então, execute o filtro na tela como

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

Substitua / dev / pts / x pelo arquivo real do Windows (saída do ttycomando na janela) e ">" pelo prompt para exibição.

Ocorrerão falhas ocasionais no visor, já que o zsh e o aplicativo gravarão no terminal de maneira inconfundida.

Original em http://www.zsh.org/mla/users/2005/msg00186.html

Stéphane Chazelas
fonte