Это отчасти зависит от того, как вы хотите все устроить. Определенно стоит прочитать ту часть руководства по процессам. Чтение кода пакета comint - хорошее место для начала.
Вы перечислили довольно ограниченный набор функций, которые хотели бы предоставить, и решить эту проблему можно с помощью прямого подключения. Вы можете найти полезные служебные функции, посмотрев на то, что предоставлено в 'net-utils (M-x find-library net-utils RET).
Если приложение, к которому вы пытаетесь подключиться, имеет интерпретируемый язык, я бы подключился к нему, а не к написанию собственного парсера на стороне приложения.
Запуск Emacs из приложения
Поскольку вы запускаете Emacs из приложения (в отличие от другого способа (который мог бы облегчить эту работу)), я бы, вероятно, сделал следующее:
- напишите небольшой скрипт Perl, чтобы открыть сокет и читать / писать в него
- настроить цикл '(read (eval (print))) в интерпретаторе (или написать собственный) и подключить его к сокету / порту
- запустить Emacs с вызовом функции (--eval или --execute), указав сокет
- запустите сценарий perl как подпроцесс и порт (посмотрите, как это делают inferior-lisp или inferior-tcl)
В этот момент все что угодно из Emacs можно было отправить в подпроцесс perl ('comint-send-string) и передать в ваш REPL и произведите там желаемый эффект. Точно так же вы можете отправлять команды обратно в emacs, просто отправляя строки и анализируя их функциями, которые вы застряли в 'comint-output-filter-functions.
Затем вы должны написать две небольшие библиотеки, одну на интерпретируемом языке вашего приложения, а другую в Emacs, чтобы выполнять любые функции, которые имеют смысл. Библиотека emacs, вероятно, должна быть упакована как основной (или второстепенный) режим в зависимости от того, на что похожи файлы. Если они предназначены исключительно для использования с приложением, в основном режиме, если они (например) файлы C ++, будет лучше использовать второстепенный режим, учитывая, что вы, вероятно, захотите использовать режим C ++.
Я бы написал небольшой скрипт perl на perl, а не на elisp, просто b / c Я знаю, как взаимодействовать с comint. Если бы небольшой скрипт perl можно было заменить фрагментом elisp и по-прежнему иметь преимущество использования comint, это было бы дополнительным бонусом.
У меня почти такая же настройка для Tcl / Tk, только соединение обрабатывается командой отправки Tk. Это действительно хорошо работает.
Запуск приложения из Emacs
Теперь, если бы вы могли вместо этого запустить приложение из Emacs, все вышеперечисленное все еще применимо, только вы можете избавиться от небольшого скрипта perl и просто взаимодействовать через интерфейс comint. Розетки не нужны.
- Вам все равно понадобится цикл repl (если приложение не может оставить stdin / stdout привязанным к интерпретатору
- Библиотеки останутся прежними
Это было бы намного проще, но работает только в том случае, если пользовательский поток позволяет вам двигаться в этом направлении. (У меня подозрение, что вы пишете это не только для себя.)
При этом может быть проще разработать / протестировать этот способ (запуск из Emacs). Вы можете добавить связь через сокеты позже в качестве улучшения. Что больше мотивирует ...
person
Trey Jackson
schedule
31.03.2009