道友们好!我平日使用Emacs来写定理证明,要写的定理太多记不住就让chatgpt帮忙写了一个python脚本,可以根据关键字来extract这些定理,效果如下图所示。
原理是根据我提供的规则做一些简单的parse agda文件,然后用富文本输出。但用的多了,就需要在Emacs和terminal来回切换窗口,有时候会破坏思路,就想着把它实现成一个Emacs command。我暂时做了两种尝试:
-
让chatgpt根据我的python来翻译到Elisp,然后以org-mode table的形式显示在新的buffer下。但是即使是chatgpt-o3-mini-high,写的代码能运行,但是逻辑完全不同。
-
从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 个赞
比如说,开一个elisp coding challenge网站,然后把你的需求偷偷加到试题集里。
下次就加入给学生出的作业里(
抱歉我可能描述的不太清楚,因为我不大清楚emacs在render这些entry的普遍做法是啥,org-mode table看着似乎太plain了点,而且不晓得如果我想做的更fancy一点,比如地址可以click,应该采取什么样的render方案。想看看道友们是否有着类似的经验。
1 个赞
ksqsf
6
我觉得问一些具体的问题比较好,主楼的问题太宽泛了。
比如这个:
(info “(elisp) Clickable Text”)
当然最简单的办法是直接 button
(insert-button "hello" 'action (lambda (btn) (message "clicked")))
只是为了避免切换窗口,写一些命令快速调用现有脚本即可。
哈哈是有点宽泛,我觉得我对emacs的很多插件缺少一些big picture。我又重新整理了一下思路,最初的问题可以具象化到两个问题:
- 用python (external language) 来parse/extract是不是很好的思路
- 直接让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 个赞
org
8
你这种偏个性化的定制,还是考虑适合自己的流程更重要,而不是包的生态。看看这个老哥的流程是否对你有启发,当然不是指特别具体的操作哈。
1 个赞
调用 python,然后让 python 输出 json,然后在 emacs 端解析 json 并作后续的处理。
或者你可以按照懒猫推荐的,通过 python-bridge 的方案,从而能够在 python 和 emacs 之间传输 sexp。
不过你这个 usecase 我觉得传 sexp 不是必须的,传 json 应该就够用了。而且也不需要建立持久化的连接,每次启用一个新的进程调用完就结束进程就行了。
1 个赞
jackqt
11
不确定是不是能满足你的需求,描述一下我的理解做参考:
- 写一个 lisp 方法来接收你给定的关键字
- 方法里调用你的 python 脚本(也可以用 lisp 重写一遍)执行搜索并输出
- 同样的方法里把 python 输出内容重定向到一个新 buffer 中,比如: Lemma:
- 切换到新 buffer 显示内容,可以用 org 或者 markdown 等