У меня есть желание запустить постраничную команду (обычно это git diff, но это может быть просто какая-то другая моя программа, переданная в less
) в терминале, который полностью интерактивен и, тем не менее, управляется извне.Изначально было бы просто иметь возможность завершить и перезапустить внутренний процесс, но было бы неплохо внедрить ввод в интерактивном режиме.
Я думаю, что простым способом сделать это может быть использование bash-скрипта, который просто запускает внутреннюю команду, и предположим, что это git diff
.
Я собираюсь написать скрипт в моем текстовом редакторе.vim таким образом, что когда я сохраняю файл, он «отправляет сигнал», на который вышеупомянутый скрипт bash каким-то образом зарегистрирован.В этом случае он должен прервать интерактивный дочерний процесс less
(например, дать ему SIGTERM, кажется, что-то вроде работы, хотя он не может перерисоваться) и запустить его снова.Таким образом, я могу в режиме реального времени обновлять свой git diff, просто сохраняя мой файл.
В моем другом сценарии использования может использоваться та же структура: я хочу, чтобы токен, на котором мой курсор висел в моем редакторе, использовался для поискапроект, чтобы найти все другие экземпляры этого.Здесь триггер будет отличаться от и чаще, чем сохранение буфера, например.
Причина, по которой следует поддерживать интерактивность (например, терминал подключен к STDIN), заключается в том, что я могу использовать мышь /клавиши для интерактивной прокрутки вверх и вниз внутри пейджера.
Один простой и, казалось бы, хрупкий способ добиться этого - настроить vim на непосредственную передачу SIGTERM для less или SIGKILL для родителя git diff
(простоиз эмпирического тестирования это то, что работает на моем Mac).
Но я хочу, чтобы логика и реализация того, как убить внутренний интерактивный процесс, жили внутри сценария оболочки.
Я думал, что смогу использовать fifo и отправить некоторые протокольные сообщения, которые оболочкаскрипт интерпретирует.Но может показаться, что то, что происходит в терминальном интерактивном стандартном вводе, передается через скрипт оболочки ... Возможно, мне понадобится какой-нибудь демон или что-то еще, управляемое им.Должен быть другой компонент, слушающий событие.
Что заставляет меня задуматься: может быть, это означает, что более практичный и более простой способ реализовать это - использовать среду выполнения, такую как node.js, которая может дать мне асинхронныйуправление или другие методы ввода / вывода мультиплексирования или асинхронного ввода / вывода.Он остается бездействующим и направляет / передает стандартный ввод (взаимодействие) через ребенка.Он также слушает асинхронно метод fifo или другой метод IPC и будет воздействовать на команды, полученные от него, например, чтобы ввести дальнейший интерактивный ввод или убить / перезапустить дочерний элемент ...
Кажется, что должны быть канонические ударыреализовать это, хотя я чувствую, что я мог бы вспомнить, как это сделать с помощью API-интерфейсов OS более низкого уровня, таких как select
(что я обычно помню из моих исследований как мультиплексирование ввода-вывода), возможно, что подобное мультиплексирование выходит за рамкиоболочки имеет много сахара и возможностей для перенаправления ввода / вывода .