将一个python脚本移植到Emacs的技术选型

道友们好!我平日使用Emacs来写定理证明,要写的定理太多记不住就让chatgpt帮忙写了一个python脚本,可以根据关键字来extract这些定理,效果如下图所示。

原理是根据我提供的规则做一些简单的parse agda文件,然后用富文本输出。但用的多了,就需要在Emacs和terminal来回切换窗口,有时候会破坏思路,就想着把它实现成一个Emacs command。我暂时做了两种尝试:

  1. 让chatgpt根据我的python来翻译到Elisp,然后以org-mode table的形式显示在新的buffer下。但是即使是chatgpt-o3-mini-high,写的代码能运行,但是逻辑完全不同。

  2. 从Emacs直接call python script,然后修改python script的输出一个org mode table,输出效果还行。然而我对org-mode table的富文本显示有些不满意。

于是想问问道友们,如果我想让这套流程更加Emacs native,不影响我的正常编辑(因为我仅仅是用来作为references用),应该采取什么选型呢(包括parse和结果输出,富文本显示)。

edit:我不大清楚emacs在render这些entry的普遍做法是啥,org-mode table看着似乎太plain了点,不晓得如果我想做的更fancy一点,比如文件地址可以click,应该采取什么样的render方案。想看看道友们是否有着类似的经验。

我写了个python扩展emacs的框架 python-bridge 可以了解下

1 个赞
  1. gpt写elisp的水平确实不咋样,可以考虑摇一位喜欢写elisp的道友帮你写。比如说,开一个elisp coding challenge网站,然后把你的需求偷偷加到试题集里。

  2. 不太明白你不满意的地方具体是哪里。你用的是C-u M-|吗?

2 个赞
比如说,开一个elisp coding challenge网站,然后把你的需求偷偷加到试题集里。

下次就加入给学生出的作业里(

抱歉我可能描述的不太清楚,因为我不大清楚emacs在render这些entry的普遍做法是啥,org-mode table看着似乎太plain了点,而且不晓得如果我想做的更fancy一点,比如地址可以click,应该采取什么样的render方案。想看看道友们是否有着类似的经验。

1 个赞

好的,马上学习一下

我觉得问一些具体的问题比较好,主楼的问题太宽泛了。

比如这个:

(info “(elisp) Clickable Text”)

当然最简单的办法是直接 button

(insert-button "hello" 'action (lambda (btn) (message "clicked")))

只是为了避免切换窗口,写一些命令快速调用现有脚本即可。

哈哈是有点宽泛,我觉得我对emacs的很多插件缺少一些big picture。我又重新整理了一下思路,最初的问题可以具象化到两个问题:

  1. 用python (external language) 来parse/extract是不是很好的思路
  2. 直接让python输出org mode table,然后shell-command直接print到buffer上是不是太粗糙了(因为elisp接受的不是structural data)。

只是为了避免切换窗口,写一些命令快速调用现有脚本即可。

确实是最直接的解决方案了。我的心路历程是上网搜了一圈看看有没有比较好用的包能用进来(比如一些table pretty-printer)

http://rgrinberg.com/posts/emacs-table-display/

是相对不错的总结,又想着这些render entries的思路在很多地方有出现过类似的,比如lsp的find-references,所以来论坛问问有没有什么common practice。

1 个赞

你这种偏个性化的定制,还是考虑适合自己的流程更重要,而不是包的生态。看看这个老哥的流程是否对你有启发,当然不是指特别具体的操作哈。

1 个赞

调用 python,然后让 python 输出 json,然后在 emacs 端解析 json 并作后续的处理。

或者你可以按照懒猫推荐的,通过 python-bridge 的方案,从而能够在 python 和 emacs 之间传输 sexp。

不过你这个 usecase 我觉得传 sexp 不是必须的,传 json 应该就够用了。而且也不需要建立持久化的连接,每次启用一个新的进程调用完就结束进程就行了。

1 个赞

第一招也太损了

不确定是不是能满足你的需求,描述一下我的理解做参考:

  1. 写一个 lisp 方法来接收你给定的关键字
  2. 方法里调用你的 python 脚本(也可以用 lisp 重写一遍)执行搜索并输出
  3. 同样的方法里把 python 输出内容重定向到一个新 buffer 中,比如: Lemma:
  4. 切换到新 buffer 显示内容,可以用 org 或者 markdown 等