org-mode能否将多个src block拼接到一起编辑,编辑完更新原本的文件?

这是一个求助贴。

我最近刚开始学习使用emacs-lisp,我想实现一个简单的功能:org-combine-and-edit-tangle-block.

简而言之,这个函数有点像org-edit-special,但是可以将指定的多个src-block拼接起来,使用指定分割线进行分割不同的src-block(假设此门语言的注释前缀为#,那么这个分割线就可以是######### src block at [position] #######). 我希望的是把所有:tangle值相同的src-block拼接。

完成了编辑以后,使用C-c C-c 退出,将所有的src-block的内容重新归位。(这个功能我居然完成不了,C-c C-c被绑定了Org-edit-src-exit,我不知道怎么重新绑定到新函数,所以我将其绑定到了C-c a).

之所以要写这个函数,是因为很多时候,一个src-block中的函数或变量内容可能在其他的src-block中被定义,因此在src-block中的编辑体验不太好。同时,如C语言这种编译后执行的语言并不合适用文学编程。

把所有tangle值相同的block连接起来这个函数相对简单,我很快就做到了,但我没想到,我居然没法把tangle完以后的结果写回到原本的buffer中。

不知道这个功能有没有己有的实现?或者有没有什么曲线完成这个功能的办法?

我写这个帖子的时候意识到,直接从tangle完成的文件往org-mode文件写回可能会简单很多。不过我还没有尝试。

谢谢大家。

tangle 后有个命令 org-babel-detangle 就是用来往回写的,但是要在 header 里面加上 :comments link。

而且 detangle 会把 :var 和 noweb 给替换掉,我是糊了个函数往回写 diff 结果,用 smerge-mode 解决冲突

试了一下,基本上符合了我的要求,除了来回跳转的时候好像没法跳到对应的行,基本上没有什么问题,感觉花了4-5个小时写代码写到崩溃的我是个小丑 :joy:

1 个赞

没事,这也是我高强度用 org 几个月才发现的,文档里面是只字不提,只说了这个