Как мне многократно читать и писать из процесса в vim?

Было сложно сформулировать это как вопрос, но вот что я хочу сделать:

Я хочу, чтобы vim выполнял процесс и неоднократно писал в его стандартный ввод и считывал его файловые дескрипторы стандартного вывода. Другими словами, мне нужен двусторонний диалог между vim и другой программой.

Я буду использовать кошку в качестве простого примера. Если вы запускаете cat без аргументов командной строки, то все, что вы вводите на стандартный ввод, выводится на стандартный вывод после каждого символа новой строки.

Я хотел бы иметь окно vim, в котором отображаются самые последние выходные данные какой-либо программы, и иметь возможность писать на ее стандартный ввод при определенных событиях. Итак, в отличие от следующего:

:read !cat

который ждет, пока вы закончите печатать и нажмете Ctrl-D, чтобы закрыть кошачий стандартный ввод, я хочу отобразить вывод сразу после того, как я нажму ввод, и чтобы процесс продолжался, чтобы я мог печатать больше.

В конечном счете, я не собираюсь вводить данные в процесс; Я хочу, чтобы события (например, перемещение курсора) запускали vim для записи определенных команд в этот процесс и отображения вывода.

Причина, по которой я хочу, чтобы программа продолжала работать, а не вызывала процесс один раз для каждого события, заключается в том, что выводом для программы будут команды, генерирующие состояние. Если бы программу нужно было вызывать для каждой команды, ей пришлось бы сохранять состояние в файл и каждый раз считывать его.

Я рассматриваю альтернативу: написание программы для прослушивания порта. Затем vim вызывает команду, которая просто открывает сокет, передает команду vim программе и возвращает сообщение из программы. Это потребует от меня написания двух программ, что, я надеюсь, не нужно.

Что я пытаюсь здесь сделать, так это написать инструмент, который анализирует ваш код и предоставляет интерактивный интерфейс командной строки (например, такие команды делают такие вещи, как «вывод списка всех строк, которые устанавливают эту переменную»). Однако вместо запуска эту программу в отдельном сеансе терминала или экрана, я бы хотел, чтобы vim мог интегрировать вывод этой программы в окно, если это возможно.


person master_latch    schedule 22.02.2014    source источник
comment
Я не уверен в этом, но я думаю, что это может быть почти невозможно в vim из-за определенных базовых ограничений реализации; что-то вроде неспособности правильно обрабатывать внешние процессы? В любом случае, я думаю, что предпочел бы ваше альтернативное решение для порта; другие плагины vim работают так, как я полагаю.   -  person Nate W.    schedule 23.02.2014
comment
Хотел бы я дважды проголосовать за этот вопрос! Это именно то, что я хочу сделать.   -  person steveire    schedule 11.01.2016
comment
Я использую код vim и perl для связи с vlc через сокеты tcpip: /а>   -  person mosh    schedule 22.03.2018


Ответы (1)


Вы должны проверить vimproc. Вы можете использовать vimproc#popen3 для запуска процесса. vimproc#popen3 возвращает объект (=словарь) с полем-членом stdin, имеющим метод write, и полем-членом stdout, имеющим метод read.

Проблема в том, как запустить чтение и запись. Vim является однопоточным, поэтому вам придется полагаться на события autocmd. Очевидно, вам захочется попробовать читать всякий раз, когда вы что-то пишете (на всякий случай), но вы также должны использовать событие CursorHold.

Вы также можете использовать Python для ввода-вывода. Хотя кажется, что вы можете использовать многопоточность Python для запуска чтения, я бы не советовал этого делать, поскольку Vim никогда не создавался для многопоточности, и по моему опыту, попытка взломать многопоточность с помощью потоков Python часто вызывает условия гонки и сбои Vim.

person Idan Arye    schedule 23.02.2014