当前位置:  开发笔记 > 编程语言 > 正文

如何获得基本的App < - > Emacs集成?

如何解决《如何获得基本的App<->Emacs集成?》经验,为你挑选了3个好方法。

有很多应用程序将Emacs与外部进程集成在一起.GDB是我想到的.我可以通过emacs控制GDB,然后在屏幕上获得反馈.

我想用我的应用程序在那个方向做点什么.

这就是我想要的:

建立我和emacs之间的联系.我可能会开始一个新的emacs进程并将其插入我的GUI

告诉emacs显示文件.(使用emacsclient很容易)

告诉emacs滚动到特定行号和hilite的中心,或者只是将光标移动到那里.

可能真正的问题是如何从外部应用程序发送任意elisp代码以便执行emacs.

我不会说elisp,但这将是一个很好的学习借口

在emacs缓冲区中提供一些可点击的区域,当触发时,它会将消息发送回我的应用程序.

即使缺乏可点击性,发送消息的密钥绑定也是一个开始.(但我知道可点击的东西是可能的,所以我问)

我知道这一切都是可能的(emacs中不可能的东西?),但我不知道从哪里开始谷歌搜索.



1> Brian Campbe..:

你可能想看看Distel(Emacs与Erlang的消息系统的集成)和SLIME(Emacs和Common Lisp之间的接口).这是两种Emacs模式,它们通过异步对话来实现另一个系统非常令人印象深刻的集成.特别是,有一篇关于Distel如何实施的文章,以及关于它如何在这里工作的一些其他好的信息.



2> Trey Jackson..:

这取决于你想要如何设置.绝对是关于流程的手册部分值得一读.阅读'comint包的代码是一个很好的起点.

您已经列出了一组非常有限的功能,可以通过直接连接解决.您可以通过查看'net-utils(Mx find-library net-utils RET)中提供的内容找到有用的实用程序函数.

如果您尝试连接的应用程序具有解释语言,我将连接到该应用程序,而不是在应用程序端编写自定义解析器.

从应用程序启动Emacs

由于你是从应用程序启动Emacs(而不是另一种方式(这可能使这项工作更容易)),这是我可能会做的:

写一些小的perl脚本来打开一个套接字并读/写它

在解释器中设置'(read(eval(print)))循环(或编写自定义循环)并将其连接到套接字/端口

使用指定套接字的函数调用(--eval或--execute)启动Emacs

启动perl脚本作为子进程和端口(请参阅inferior-lispinferior-tcl如何做)

此时,Emacs中的任何内容都可以发送到perl子进程('comint-send-string),然后传递给你的REPL并在那里产生预期的效果.同样,您可以通过发送字符串将命令发送回emacs,并将它们解析为您在'comint-output-filter-functions中停留的函数.

然后你会编写两个小库,一个在你的APP解释语言中,一个在Emacs中,来做任何有意义的功能.emacs库可能应该打包为主要(或次要)模式,具体取决于文件的类型.如果他们只是与应用程序一起使用,这是一种主要模式,如果他们是(例如)C++文件,那么你可能想要利用c ++模式,那么小模式会更好.

我在perl中写了一个小perl脚本,而不是elisp,只是b/c我知道如何与'comint交互.如果小的perl脚本可以用一大块elisp替换,并且仍然使用comint获得好处,那将是一个额外的奖励.

我对Tcl/Tk有相同的设置,只有连接内容由Tk的send命令处理.它工作得很好.

从Emacs启动应用程序

现在,如果你可以从Emacs启动应用程序,上面仍然适用,只有你可以摆脱小perl脚本,只需通过'comint界面进行交互.不需要插座.

您仍然需要'repl循环(如果应用程序无法将stdin/stdout与解释器绑定)

图书馆将保持不变

这会更容易,但只有在用户流程允许您朝这个方向前进时才有效.(我有一种预感,你写这篇文章不仅仅是为了你的使用.)

话虽这么说,开发/测试这种方式可能更容易(从Emacs启动).您可以稍后添加套接字通信作为增强功能.无论哪个更具激励性......



3> justinhj..:

可点击区域

小部件库可以让您将缓冲区的一部分放入按钮(也包括单选框,复选框,列表),这些按钮将在您单击它们时执行.例如:

    (require 'widget)

(defun simple-widget-example ()
   (interactive)
  (switch-to-buffer "*Simple widget example*")

  (let ((inhibit-read-only t))
    (erase-buffer))

  (let ((all (overlay-lists)))
    ;; Delete all the overlays.
    (mapcar 'delete-overlay (car all))
    (mapcar 'delete-overlay (cdr all)))

  (widget-insert "Sample button\n")
  (widget-create 'push-button
         :notify (lambda (&rest ignore) 
               (message "Poop! Ha Ha!"))
         "Press Me")

  (use-local-map widget-keymap)

  (widget-setup))

请参阅Emacs小组件库

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有