Korzystanie z edytora linii zsh do owijania podprocesów

22

Czy można użyć wbudowanego edytora wiersza ( zle) zsh, aby wprowadzić dane wejściowe do podprocesu? To znaczy, chciałbym uruchomić zlewrap mycommandgdzie zlewrapjest funkcja zsh i mycommandjest to dowolny program, który po prostu odczytuje wiersze ze standardowego wejścia; zlewrapskutecznie zapewniłoby możliwości edycji linii w Zle mycommand. To jest na modelu, rlwrapktóry właśnie to robi, ale z readline, a nie zle do edycji linii.

Gilles „SO- przestań być zły”
źródło
2
Wygląda to pomocne: zsh.org/mla/users/2004/msg00917.html . To nie jest tak proste jak pojedyncze polecenie, ale możesz dostosować ten skrypt do swojego programu (przeczytaj poprawki w celu uzupełnienia).
imgx64,
Jednym z problemów, jaki mam, gdy myślę o rozwiązaniach, jest to, jak wskazujesz, kiedy chcesz „edytować” w ZLE i kiedy chcesz czekać na powrót „mycommand”? Czy kiedykolwiek zwraca tylko jedną linię?
wielomian
2
Takie opakowania @ wielomianowe zwracają po jednym wierszu do procesu za nimi. Używanie rlwrapjest dość powszechne i prawdopodobnie już go użyłeś. Pomyśl o małych pseudo powłokach, które dostajesz w takich rzeczach, jak mysql, sqlite, lftp itp. Wszystkie mają pewne implementacje edytora linii, który wraca po linii lub blok linii naraz do faktycznego procesora za nimi. rlwraprobi trafne trafienia dla każdego programu, który akceptuje STDIN, ale byłoby miło mieć powiązania i umiejętności w stylu zle, zamiast readline, które są kimś mniej rozbudowanym.
Caleb
Czy przeglądałeś instrukcję zsh- cs.elte.hu/zsh-manual/zsh_14.html ? - Nie do końca rozumiem twoje pytanie, ale przejrzałem tytuł i znalazłem tę stronę. To może pomóc, ale nie wiem.
Kevdog777,
1
Ok, tylko próbowałem pomóc, ponieważ widzę, że na twoje pytanie nie było odpowiedzi od ponad roku. Przepraszam, mój komentarz nie był wystarczająco dobry.
Kevdog777,

Odpowiedzi:

4

Oto, jak możesz to zrobić, używając ekranu GNU:

Umieść plik wywoływany zfza $PATHpomocą:

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

Następnie uruchom filtr na ekranie jako

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

Zamień / dev / pts / x na rzeczywisty Windows pty (wyjście ttypolecenia w oknie), a „>” z monitem o wyświetlenie.

Od czasu do czasu pojawią się usterki w wyświetlaniu, ponieważ zarówno zsh, jak i aplikacja będą zapisywać w terminalu w nieskrępowany sposób.

Oryginał pod adresem http://www.zsh.org/mla/users/2005/msg00186.html

Stéphane Chazelas
źródło