Usar el editor de línea de zsh para envolver subprocesos

22

¿Es posible usar el editor de línea incorporado de zsh ( zle) para alimentar la entrada a un subproceso? Es decir, me gustaría ejecutar zlewrap mycommanddonde zlewrapestá una función zsh y mycommandes cualquier programa que solo lee líneas de stdin; zlewrapproporcionaría efectivamente las capacidades de edición de línea de zle a mycommand. Esto está en el modelo de lo rlwrapque hace exactamente esto, pero con readline y no zle para la edición de línea.

Gilles 'SO- deja de ser malvado'
fuente
2
Esto parece útil: zsh.org/mla/users/2004/msg00917.html . No es tan fácil como un solo comando, pero puede adaptar este script a su programa (lea los seguimientos para ver las correcciones).
imgx64
Un problema que tengo cuando pienso en soluciones es ¿cómo indica cuándo quiere 'editar' en el ZLE y cuándo quiere esperar a que vuelva 'mycommand'? ¿Solo devuelve alguna vez una línea?
polinomio
2
Los envoltorios @polynomial como este devuelven una línea a la vez al proceso detrás de ellos. El uso de rlwrapestá bastante extendido y probablemente lo haya usado. Piense en las pequeñas cosas de pseudo shell que obtiene en cosas como mysql, sqlite, lftp, etc. Todas tienen alguna implementación de un editor de línea que regresa en línea o bloque de líneas a la vez al procesador real detrás de ellas. rlwrapfunciona bastante bien para cualquier programa que acepte STDIN, pero sería bueno tener enlaces y habilidades de estilo zle en lugar de líneas de lectura que son alguien menos extenso.
Caleb
¿Has mirado el manual para zsh- cs.elte.hu/zsh-manual/zsh_14.html ? - No entiendo bien tu pregunta, pero busqué en Google el título y encontré esa página. Podría ayudar, pero no lo sé.
Kevdog777
1
Ok, solo estaba tratando de ayudar, ya que veo que tu pregunta no ha sido respondida en más de un año. Lo siento, mi comentario no fue lo suficientemente bueno.
Kevdog777

Respuestas:

4

Así es como puede hacerlo si usa la pantalla GNU:

Ponga un archivo llamado zfen su $PATHcon:

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

Y luego, ejecute el filtro en la pantalla como

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

Reemplace / dev / pts / x con el pty real de Windows (salida del ttycomando en la ventana) y ">" con el mensaje para mostrar.

Habrá fallas ocasionales en la pantalla, ya que tanto zsh como la aplicación escribirán en el terminal de una manera no concertada.

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

Stéphane Chazelas
fuente