Menggunakan editor baris zsh untuk membungkus subproses

22

Apakah mungkin untuk menggunakan editor baris bawaan ( zle) zsh untuk mengumpankan input ke subproses? Yaitu, saya ingin menjalankan di zlewrap mycommandmana zlewrapfungsi zsh dan mycommandprogram apa pun yang hanya membaca baris dari stdin; zlewrapakan secara efektif menyediakan kemampuan pengeditan baris zle untuk mycommand. Ini pada model rlwrapyang melakukan hal ini, tetapi dengan readline dan tidak zle untuk mengedit baris.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Ini terlihat membantu: zsh.org/mla/users/2004/msg00917.html . Ini tidak semudah perintah tunggal, tetapi Anda dapat menyesuaikan skrip ini dengan program Anda (baca tindak lanjut untuk koreksi).
imgx64
Satu masalah yang saya miliki ketika saya memikirkan solusi adalah bagaimana Anda menunjukkan ketika Anda ingin menjadi 'mengedit' di ZLE dan ketika Anda ingin menunggu 'perintah' untuk kembali? Apakah hanya mengembalikan satu baris?
polinomial
2
Pembungkus @pomynial seperti ini mengembalikan satu baris pada satu waktu ke proses di belakang mereka. Penggunaannya rlwrapcukup luas dan Anda mungkin pernah menggunakannya. Pikirkan tentang hal-hal shell pseudo kecil yang Anda dapatkan dalam hal-hal seperti mysql, sqlite, lftp, dll. Mereka semua memiliki beberapa implementasi editor baris yang kembali pada baris atau blok baris sekaligus ke prosesor aktual di belakangnya. rlwrapmemang hits dengan cukup rapi untuk program apa pun yang menerima STDIN, tapi alangkah baiknya untuk memiliki binding dan kemampuan gaya zle daripada readlines yang seseorang kurang luas.
Caleb
Sudahkah Anda melihat manual untuk zsh- cs.elte.hu/zsh-manual/zsh_14.html ? - Saya tidak begitu mengerti pertanyaan Anda, tetapi mencari judulnya di Google, dan menemukan halaman itu. Mungkin membantu, tapi saya tidak tahu.
Kevdog777
1
Ok, saya hanya mencoba membantu, karena saya melihat pertanyaan Anda belum dijawab lebih dari setahun. Maaf komentar saya tidak cukup baik.
Kevdog777

Jawaban:

4

Berikut ini cara melakukannya jika menggunakan layar GNU:

Letakkan file yang dipanggil dengan zfAnda $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"

Dan kemudian, jalankan filter di layar sebagai

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

Ganti / dev / pts / x dengan Windows pty yang sebenarnya (output dari ttyperintah di jendela), dan ">" dengan prompt untuk ditampilkan.

Akan ada gangguan tampilan sesekali karena zsh dan aplikasi akan menulis ke terminal dengan cara yang tidak dikunci.

Asli di http://www.zsh.org/mla/users/2005/msg00186.html

Stéphane Chazelas
sumber