zshのラインエディターを使用してサブプロセスをラップする


22

zshの組み込み行エディター(zle)を使用して入力をサブプロセスにフィードすることは可能ですか?つまり、zlewrap mycommandwhere zlewrapはzsh関数でありmycommand、stdinから行を読み取るだけのプログラムです。zlewrapは、zleの行編集機能をに効果的に提供しmycommandます。これはrlwrapまさにこれを行うモデル上にありますが、行編集用のzleではなくreadlineを使用します。


2
これは便利になります。zsh.org/mla/users/2004/msg00917.htmlを。単一のコマンドほど簡単ではありませんが、このスクリプトをプログラムに適合させることができます(修正についてはフォローアップをお読みください)。
imgx64

私が解決策を考えるときに抱えている問題の1つは、ZLEで「編集」したいときと、「mycommand」が戻るのを待ちたいときをどのように示すかです。1行しか返されませんか?
多項式

2
このような@polynomialラッパーは、背後のプロセスに一度に1行を返します。の使用rlwrapは非常に広く行われており、おそらく使用されているでしょう。mysql、sqlite、lftpなどで得られる小さな擬似シェルのことを考えてください。それらはすべて、背後の実際のプロセッサに一度に1行または行のブロックを返す行エディターの実装をいくつか持っています。rlwrapSTDINを受け入れるすべてのプログラムに対して非常にきれいにヒットしますが、より広範囲ではないreadlineではなく、zleスタイルのバインディングと機能を備えていると便利です。
カレブ

あなたはマニュアルを見てきましたzsh- cs.elte.hu/zsh-manual/zsh_14.html?-あなたの質問はよくわかりませんが、タイトルをGoogleで検索して、そのページを見つけました。役立つかもしれませんが、わかりません。
Kevdog777

1
わかりました。あなたの質問は1年以上も回答されていないようです。申し訳ありませんが、私のコメントは十分ではありませんでした。
Kevdog777

回答:


4

GNU画面を使用する場合の方法は次のとおりです。

と呼ばれるファイルをwithに入れzfます$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"

そして、画面でフィルターを実行します

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

/ dev / pts / xを実際のWindows pty(ttyウィンドウ内のコマンドの出力)に置き換え、「>」を表示するプロンプトに置き換えます。

zshとアプリケーションの両方が調律のない方法で端末に書き込むため、時折表示の不具合が発生します。

オリジナルhttp://www.zsh.org/mla/users/2005/msg00186.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.