Utilizzando l'editor di linee di zsh per avvolgere i sottoprocessi


22

È possibile utilizzare l'editor di riga integrato di zsh ( zle) per alimentare l'input a un sottoprocesso? Cioè, vorrei correre zlewrap mycommanddove zlewrapc'è una funzione zsh ed mycommandè qualsiasi programma che legge solo righe da stdin; zlewrapfornirebbe efficacemente le funzionalità di modifica delle linee di zle a mycommand. Questo è sul modello del rlwrapquale fa proprio questo, ma con readline e non zle per l'editing di linea.


2
Sembra utile: zsh.org/mla/users/2004/msg00917.html . Non è facile come un singolo comando, ma puoi adattare questo script al tuo programma (leggi i follow-up per le correzioni).
imgx64,

Un problema che ho quando penso alle soluzioni è come indichi quando vuoi "modificare" in ZLE e quando vuoi aspettare che il "miocomando" torni? Restituisce solo una riga?
polinomio,

2
I wrapper @polynomial come questo restituiscono una riga alla volta al processo dietro di loro. L'uso di rlwrapè abbastanza diffuso e probabilmente l'hai usato. Pensa alle piccole cose pseudo shell che ottieni in cose come mysql, sqlite, lftp, ecc. Hanno tutte una qualche implementazione di un editor di linee che ritorna in linea o blocco di linee alla volta al processore reale dietro di loro. rlwrapcolpisce abbastanza bene per qualsiasi programma che accetta STDIN, ma sarebbe bello avere legami e abilità in stile zle piuttosto che readline che sono qualcuno meno esteso.
Caleb,

Hai consultato il manuale di zsh- cs.elte.hu/zsh-manual/zsh_14.html ? - Non capisco bene la tua domanda, ma ho cercato su Google il titolo e ho trovato quella pagina. Potrebbe aiutare, ma non lo so.
Kevdog777,

1
Ok, stavo solo cercando di aiutarti, visto che la tua domanda non ha ricevuto risposta da oltre un anno. Scusa il mio commento non è stato abbastanza buono.
Kevdog777,

Risposte:


4

Ecco come puoi farlo se usi lo schermo GNU:

Inserisci un file chiamato zfnel tuo $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"

E quindi, esegui il filtro nella schermata come

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

Sostituisci / dev / pts / x con il pty di Windows effettivo (output del ttycomando nella finestra) e ">" con il prompt da visualizzare.

Ci saranno anomalie di visualizzazione occasionali poiché sia ​​zsh che l'applicazione scriveranno sul terminale in modo non corretto.

Originale su http://www.zsh.org/mla/users/2005/msg00186.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.