Использование строкового редактора zsh для работы с подпроцессами

22

Можно ли использовать встроенный редактор строк zsh ( zle) для подачи ввода в подпроцесс? То есть я хотел бы запустить zlewrap mycommandгде zlewrapфункция zsh и mycommandлюбая программа, которая просто читает строки из stdin; zlewrapбудет эффективно предоставлять возможности редактирования строки ZLE для mycommand. Это на модели, rlwrapкоторая делает именно это, но с readline, а не zle для редактирования строки.

Жиль "ТАК - перестань быть злым"
источник
2
Это выглядит полезным: zsh.org/mla/users/2004/msg00917.html . Это не так просто, как одной командой, но вы можете адаптировать этот скрипт к вашей программе (читайте последующие исправления).
imgx64
Когда я думаю о решениях, у меня возникает одна проблема: как вы указываете, когда хотите «редактировать» в ZLE и когда хотите дождаться возвращения «mycommand»? Возвращает ли он когда-нибудь только одну строку?
полином
2
Такие обертки @polynomial возвращают по одной строке за процессом, стоящим за ними. Использование rlwrapдовольно широко, и вы, вероятно, использовали его. Подумайте о маленьких вещах псевдооболочки, которые вы получаете в таких вещах, как mysql, sqlite, lftp и т. Д. Все они имеют некоторую реализацию редактора строк, который одновременно возвращает строку или блок строк фактическому процессору за ними. rlwrapделает удары довольно аккуратно для любой программы, которая принимает STDIN, но было бы неплохо иметь привязки и способности в стиле zle, а не readlines, которые кто-то менее обширный.
Калеб
Вы смотрели руководство для zsh- cs.elte.hu/zsh-manual/zsh_14.html ? - Я не совсем понимаю ваш вопрос, но гуглил заголовок и нашел эту страницу. Это может помочь, но я не знаю.
Kevdog777
1
Хорошо, я просто пытался помочь, так как вижу, что на твой вопрос не было ответа больше года. Извините, мой комментарий был недостаточно хорош.
Kevdog777

Ответы:

4

Вот как вы можете сделать это, используя экран GNU:

Поместите файл с именем 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 на фактический pty для Windows (вывод ttyкоманды в окне), а «>» на запрос на отображение.

Будут случайные глюки дисплея, поскольку и zsh, и приложение будут записывать данные в терминал без ограничений.

Оригинал на http://www.zsh.org/mla/users/2005/msg00186.html

Стефан Шазелас
источник