#emacs #lisp #ocaml
Вопрос:
Я хотел бы взять существующее приложение (написанное на OCaml) и создать для него «интерфейс» Emacs (например, режим Emacs GDB). Я бы предпочел сделать это без написания тонны кода на Лиспе. С точки зрения MVC, я бы хотел, чтобы представление было Emacs, но чтобы модель и контроллер оставались (в первую очередь) OCaml.
Кто-нибудь знает способ написания расширений Emacs на языке, отличном от Lisp? Это может быть либо в форме привязки к API расширения Emacs на каком-либо другом языке (например, сделать OCaml первоклассным языком расширения Emacs), либо в режиме взаимодействия Emacs, где, например, расширение имеет канал, в который оно может записывать выражения Emacs Lisp и считывать значения результатов.
Комментарии:
1. Я рекомендую вам взглянуть на то, как это делает Мерлин, как предложил Эрик Аллик, например github.com/the-lambda-church/merlin/blob/master/emacs/… запускает процесс, и github.com/the-lambda-church/merlin/blob/master/emacs/… отправляет команду процессу ocaml merlin с асинхронным обработчиком.
Ответ №1:
http://www.emacswiki.org/cgi-bin/emacs-en?CategoryExtensionLanguage-это список всех языков расширения, отличных от Elisp, которые вы можете использовать.
Это действительно похоже на динамический язык, ориентированный на язык.
http://common-lisp.net/project/slime/ отсутствует в этом списке, так как это не совсем язык расширения, а мост Elisp-Common Lisp. Его исходный код покажет, как обмениваться данными между собой через сокеты.
Аналогичной IDE для Erlang является Distel, по адресу http://fresh.homeunix.net/~люк/дистел/ (в настоящее время отключен) и https://github.com/massemanet/distel.
Удачи!
Ответ №2:
Я не знаю, сработает ли это для вашей конкретной проблемы, но я делал что-то подобное, используя функцию shell-command-to-string:
(shell-command-to-string
"bash -c "script-to-exec args"")
Так, например, у нас есть существующие сценарии, написанные на python, которые будут искажать файл, поэтому вышеизложенное позволяет мне вызывать сценарий с помощью emacs lisp.
Быстрый поиск в Google нашел эту страницу, описывающую систему для написания расширений на Python, поэтому кажется возможным делать то, что вы хотите… вам просто нужно будет посмотреть, написал ли кто-нибудь аналогичный фреймворк для OCaml.
Ответ №3:
Некоторые Api расширения теперь доступны с входящими модулями emacs 25.1 и динамическими модулями
Библиотека, emacs-ffi
предлагающая интерфейс внешней функции на основе libffi
.
Ознакомьтесь с полной документацией по README.
Ответ №4:
Попробуйте PyMacs, который позволяет расширять Emacs в Python.
изменить: обновлена ссылка.
Комментарии:
1. Мертвая ссылка, это бесполезно
Ответ №5:
Со стороны статически типизированных языков есть кое-что, что выглядит довольно производительным и хорошо зарекомендовавшим себя для Haskell:
https://github.com/knupfer/haskell-emacs
также, вероятно, есть что-то полезное для повторного использования Scala в проекте Ensime (есть мост как для Emacs, так и для Vim).:
https://github.com/ensime/ensime-server
Кроме того, быстрый поиск в Google показал еще одного потенциального кандидата на расширение Emacs с помощью классического языка FP, OCaml; в проекте много .ml
исходных файлов, поэтому где-то должен быть мост Emacs-OCaml:
Ответ №6:
Не существует «API расширения». Emacs Lisp находится там, и он не двигается.
Вы можете запускать команды Emacs из другого процесса. Взгляните на Гнусерва.
Существует множество приложений, в которых Emacs является представлением модели/контроллера в отдельном процессе. Хорошим примером является интерфейс Emacs GDB. Я не уверен в более простом примере, может быть, sql-postgresql?