Написание расширений Emacs на языках, отличных от Lisp

Я хотел бы взять существующее приложение (написанное на OCaml) и создать для него «интерфейс» Emacs (например, режим Emacs GDB). Я бы предпочел сделать это без написания тонны кода на Лиспе. В терминах MVC я бы хотел, чтобы View был Emacs, но чтобы модель и контроллер оставались (в первую очередь) OCaml.

Кто-нибудь знает, как писать расширения Emacs на языке, отличном от Lisp? Это может быть либо привязкой к API расширения Emacs на каком-либо другом языке (например, делая OCaml первоклассным языком расширения Emacs), либо режимом взаимодействия с Emacs, где, например, у расширения есть канал, в который оно может писать Выражения Emacs Lisp и считывание значений результатов.

Ответов (6)

Не существует "Extension API". Emacs Lisp уже там, и он не движется.

Вы можете запускать команды Emacs из другого процесса. Взгляните на Gnuserv.

Существует множество приложений, в которых Emacs является представлением для модели / контроллера в отдельном процессе. Интерфейс Emacs GDB - хороший пример. Я не уверен в более простом примере, может быть, sql-postgresql?

Попробуйте PyMacs , который позволяет расширить Emacs на Python.

изменить : обновленная ссылка.

Со стороны статически типизированных языков есть кое-что, что выглядит довольно производительно и хорошо подходит для Haskell:

https://github.com/knupfer/haskell-emacs

также, вероятно, есть что-то полезное для повторного использования Scala из проекта Ensime (есть мост как для Emacs, так и для Vim):

https://github.com/ensime/ensime-server

Более того, быстрый поиск в Google выявил еще одного потенциального кандидата на расширение Emacs классическим языком программирования FP, OCaml; в проекте много .ml исходных файлов, поэтому где-то должен быть мост Emacs-OCaml:

https://github.com/the-lambda-church/merlin

Некоторое расширение Api теперь возможно с входящими emacs 25.1 и динамическими модулями.

Библиотека emacs-ffiпредлагает интерфейс сторонних функций на основе libffi .

Ознакомьтесь с полной документацией на README .

Я не знаю, сработает ли это для вашей конкретной проблемы, но я делал нечто подобное, используя функцию shell-command-to-string:

(shell-command-to-string
    "bash -c \"script-to-exec args\"")

Так, например, у нас есть существующие сценарии, написанные на python, которые будут искажать файл, поэтому приведенное выше позволяет мне вызывать сценарий через emacs lisp.

Быстрый поиск в Google нашел эту страницу, описывающую систему для написания расширений на Python, поэтому кажется возможным делать то, что вы хотите ... вам просто нужно посмотреть, написал ли кто-нибудь подобную структуру для OCaml.

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/~luke/distel/ (в настоящее время не работает) и https://github.com/massemanet/distel .

Удачи!