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

#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:

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

Ответ №6:

Не существует «API расширения». Emacs Lisp находится там, и он не двигается.

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

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