Verwenden des zsh-Zeileneditors zum Umbrechen von Unterprozessen

22

Ist es möglich, den in zsh integrierten Zeileneditor ( zle) zu verwenden, um Eingaben an einen Unterprozess weiterzuleiten? Das heißt, ich möchte ausführen, zlewrap mycommandwo zlewrapist eine zsh-Funktion und mycommandist ein Programm, das nur Zeilen aus stdin liest; zlewrapwürde effektiv zles zeilenbearbeitungsfunktionen zur verfügung stellen mycommand. Dies ist auf dem Modell, rlwrapdas genau dies tut, aber mit readline und nicht zle für die Zeilenbearbeitung.

Gilles 'SO - hör auf böse zu sein'
quelle
2
Dies sieht hilfreich aus: zsh.org/mla/users/2004/msg00917.html . Es ist nicht so einfach wie ein einzelner Befehl, aber Sie können dieses Skript an Ihr Programm anpassen (lesen Sie die folgenden Hinweise für Korrekturen).
imgx64
Ein Problem, das ich habe, wenn ich an Lösungen denke, ist, wie geben Sie an, wann Sie im ZLE "editieren" möchten und wann Sie auf die Rückkehr des "mycommand" warten möchten? Gibt es immer nur eine Zeile zurück?
Polynom
2
@polynomial-Wrapper wie dieser geben zeilenweise den Prozess zurück, der hinter ihnen liegt. Die Verwendung von rlwrapist ziemlich weit verbreitet und Sie haben es wahrscheinlich verwendet. Denken Sie an die kleinen Pseudo-Shell-Dinge, die Sie in Dingen wie mysql, sqlite, lftp usw. bekommen. Sie alle haben eine Implementierung eines Zeileneditors, der jeweils in einer Zeile oder einem Zeilenblock zum eigentlichen Prozessor hinter ihnen zurückkehrt. rlwraptrifft ganz ordentlich für jedes Programm, das STDIN akzeptiert, aber es wäre schön, Bindungen und Fähigkeiten im Zle-Stil zu haben, anstatt Zeilen zu lesen, die weniger umfangreich sind.
Caleb
Haben Sie sich das Handbuch für zsh- cs.elte.hu/zsh-manual/zsh_14.html angesehen ? - Ich verstehe Ihre Frage nicht ganz, habe aber den Titel gegoogelt und diese Seite gefunden. Es könnte helfen, aber ich weiß es nicht.
Kevdog777
1
Ok, ich habe nur versucht zu helfen, da ich sehe, dass Ihre Frage seit über einem Jahr nicht beantwortet wurde. Entschuldigung, mein Kommentar war nicht gut genug.
Kevdog777

Antworten:

4

Wenn Sie den GNU-Bildschirm verwenden, können Sie dies folgendermaßen tun:

Fügen Sie eine Datei mit folgendem Namen zfein $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"

Führen Sie dann den Filter auf dem Bildschirm aus als

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

Ersetzen Sie / dev / pts / x durch die tatsächliche Windows-Pty (Ausgabe des ttyBefehls im Fenster) und ">" durch die Aufforderung zur Anzeige.

Es kommt gelegentlich zu Anzeigefehlern, da sowohl zsh als auch die Anwendung auf unkonfigurierte Weise auf das Terminal schreiben.

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

Stéphane Chazelas
quelle