这有点取决于你想如何设置。绝对值得一读的过程手册部分。阅读 'comint 包的代码是一个很好的起点。
您列出了一组非常有限的要公开的功能,可以通过直接连接来解决。通过查看 'net-utils (Mx find-library net-utils RET) 中提供的内容,您可以找到有用的实用功能。
如果您尝试连接的应用程序具有解释性语言,我会连接到该语言,而不是在应用程序端编写自定义解析器。
从应用程序启动 Emacs
由于您是从应用程序启动 Emacs(而不是其他方式(这可能使这项工作更容易)),这就是我可能会做的事情:
- 编写小的 perl 脚本来打开一个套接字并读/写它
- 在解释器中设置 '(read (eval (print))) 循环(或编写自定义循环)并将其连接到套接字/端口
- 使用指定套接字的函数调用(--eval 或--execute)启动 Emacs
- 将 perl 脚本作为子进程和端口启动(查看lower-lisp或lower-tcl是如何做到的)
那时,来自 Emacs 的任何内容都可以发送到 perl 子进程('comint-send-string),然后传递到您的REPL并在那里产生所需的效果。同样,您可以通过仅发送字符串将命令发送回 emacs,并让您在 'comint-output-filter-functions.
然后,您将编写两个小库,一个使用您的 APP 解释语言,一个使用 Emacs,以执行任何有意义的功能。emacs 库可能应该打包为主要(或次要)模式,具体取决于文件的样子。如果它们仅与应用程序一起使用,则为主要模式,如果它们是(例如)C++ 文件,则考虑到您可能想要利用 c++ 模式,次要模式会更好。
我会在 perl 中编写小 perl 脚本,而不是 elisp,只是 b/c 我知道如何与 'comint. 如果可以用一大块 elisp 替换小的 perl 脚本,并且仍然可以使用 comint 获得好处,那将是一个额外的好处。
我为 Tcl/Tk 设置了几乎相同的设置,只有连接内容由 Tk 的发送命令处理。它真的很好用。
从 Emacs 启动应用程序
现在,如果您可以从 Emacs 启动应用程序,上述仍然适用,只有您可以摆脱小 perl 脚本,只需通过 'comint 界面进行交互。不需要插座。
- 您仍然需要 'repl 循环(如果应用程序不能将标准输入/标准输出绑定到解释器
- 图书馆将保持不变
这会容易得多,但只有当用户流使您能够朝着那个方向前进时才有效。(我有一种预感,你写这篇文章不仅仅是为了你的使用。)
话虽如此,以这种方式开发/测试(从 Emacs 启动)可能更容易。您可以稍后添加套接字通信作为增强功能。哪个更励志...