使用其他语言编写Emacs扩展程序

28
我想将一个已经用OCaml编写的应用程序与Emacs“接口”结合起来(例如,类似于Emacs GDB模式)。我希望在不编写大量Lisp代码的情况下完成这个目标。从MVC的角度来看,我希望View是Emacs,但是Model和Controller仍然(主要)使用OCaml。
有没有人知道是否有一种方法可以使用其他语言编写Emacs扩展?这可以采用绑定到某些其他语言的Emacs扩展API的形式(例如,使OCaml成为一种一流的Emacs扩展语言),或者是一种Emacs交互模式,在此模式下,扩展具有管道,可以将表达式写入Emacs Lisp并读出结果值。

我建议你看看Erik Allik建议的merlin如何实现,例如https://github.com/the-lambda-church/merlin/blob/master/emacs/merlin.el#L430启动一个进程,https://github.com/the-lambda-church/merlin/blob/master/emacs/merlin.el#L631发送一个命令到ocaml merlin进程,并使用异步处理程序。 - unhammer
6个回答

14

http://www.emacswiki.org/cgi-bin/emacs-en?CategoryExtensionLanguage 是一个列举了所有非Elisp扩展语言的清单。

它似乎是以动态语言为中心。

http://common-lisp.net/project/slime/ 没有出现在该列表中,因为它不完全是一种扩展语言,而是一种Elisp-Common Lisp桥梁。其源代码将显示如何通过套接字进行双向通信。

Erlang的类似IDE是Distel,位于http://fresh.homeunix.net/~luke/distel/(当前已关闭)和https://github.com/massemanet/distel

祝好运!


第一个链接应该是https://www.emacswiki.org/emacs/CategoryExtensionLanguage。 - karlacio

4

我不知道这个方法是否适用于您的具体问题,但我一直在使用shell-command-to-string函数进行类似操作:

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

所以举个例子,我们有用Python编写的现有脚本来操作文件,上述内容让我可以通过Emacs Lisp调用该脚本。
快速谷歌搜索发现这个页面描述了一个使用Python编写扩展的系统,因此你想要做的似乎是可行的...只需看看是否有人已经为OCaml编写了类似的框架即可。

3

即将发布的Emacs 25.1版本和动态模块现在支持一些扩展API。

一个名为emacs-ffi的库,提供基于libffi的外部函数接口。

请查看README获取完整文档。


3

可以尝试使用 PyMacs ,它允许使用Python扩展Emacs。

编辑:更新了链接。


无效链接,没有帮助。 - Anthon

2
从静态类型语言的角度来看,对于Haskell语言,有一个看起来非常高效和功能丰富的项目:https://github.com/knupfer/haskell-emacs。此外,Scala语言也可以从Ensime项目中重用一些有用的东西(该项目具有Emacs和Vim的桥接)。https://github.com/ensime/ensime-server。此外,快速的谷歌搜索还发现了另一个潜在的候选方案,可以使用经典的FP语言OCaml扩展Emacs;该项目有很多.ml源文件,因此必须存在Emacs-OCaml桥接:https://github.com/the-lambda-church/merlin

0

没有所谓的“扩展 API”。Emacs Lisp 就在那里,而且它不会移动。

你可以从其他进程运行 Emacs 命令。看一下 Gnuserv。

有很多应用程序将 Emacs 作为单独进程中的模型/控制器的视图。Emacs GDB 接口就是一个很好的例子。我不确定是否有更简单的例子,也许是 sql-postgresql?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接