Utilisation de l'éditeur de ligne de zsh pour encapsuler les sous-processus

22

Est-il possible d'utiliser l'éditeur de ligne intégré de zsh ( zle) pour alimenter un sous-processus? Autrement dit, je voudrais exécuter zlewrap mycommandzlewrapest une fonction zsh et mycommandest un programme qui lit simplement les lignes de stdin; zlewrapfournirait efficacement les capacités d'édition de ligne de zle mycommand. C'est sur le modèle rlwrapqui fait exactement cela, mais avec readline et non zle pour l'édition de ligne.

Gilles 'SO- arrête d'être méchant'
la source
2
Cela semble utile: zsh.org/mla/users/2004/msg00917.html . Ce n'est pas aussi simple qu'une seule commande, mais vous pouvez adapter ce script à votre programme (lisez les suivis pour les corrections).
imgx64
Un problème que j'ai quand je pense à des solutions est de savoir comment indiquer quand vous voulez «éditer» dans le ZLE et quand vous voulez attendre le retour de la «ma commande»? Retourne-t-il seulement une ligne?
polynôme
2
Les wrappers @polynomial comme celui-ci renvoient une ligne à la fois au processus derrière eux. L'utilisation de rlwrapest assez répandue et vous l'avez probablement utilisée. Pensez aux petites choses pseudo shell que vous obtenez dans des choses comme mysql, sqlite, lftp, etc. rlwrapne frappe assez bien pour tout programme qui accepte STDIN, mais ce serait bien d'avoir des liaisons et des capacités de style zle plutôt que des lignes de lecture qui sont moins étendues.
Caleb
Avez-vous consulté le manuel de zsh- cs.elte.hu/zsh-manual/zsh_14.html ? - Je ne comprends pas très bien votre question, mais googlé le titre et trouvé cette page. Cela pourrait aider, mais je ne sais pas.
Kevdog777
1
D'accord, j'essayais juste d'aider, car je vois que votre question n'a pas reçu de réponse depuis plus d'un an. Désolé mon commentaire n'était pas assez bon.
Kevdog777

Réponses:

4

Voici comment vous pouvez le faire si vous utilisez l'écran GNU:

Mettez un fichier appelé zfdans votre $PATHavec:

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

Et puis, exécutez le filtre dans l'écran comme

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

Remplacez / dev / pts / x par le pty Windows réel (sortie de la ttycommande dans la fenêtre) et ">" avec l'invite à afficher.

Il y aura des problèmes d'affichage occasionnels lorsque zsh et l'application écriront sur le terminal de manière non confidentielle.

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

Stéphane Chazelas
la source