能不能用 org-roam 来画代码项目中的函数调用关系?

虽然用 org-mode 一年多了, 但我没试过 org-roam. 但是我一直感觉到用 org-mode 来写项目笔记有点不足.

我认为笔记中对一个函数的描述就是: 它干了什么, 它的实现想法, 它在什么位置. 前两者就记在 org 的一个 node 下, 没有问题. 困难之处在于: 仅用 org-mode 难以描述函数在调用层次中的位置, 它被谁调用, 被如何调用(也就是参数信息).

我想问 org-roam 能不能帮助我描述函数的调用关系? 我觉得用双链来描述函数调用再合适不过了, 这样尽管只引用一次, 这样我们就知道一个函数被哪些函数调用, 也知道它调用了谁, 而且最好有图形化显示, 因为仅有文本只能看到它调用的和被它调用的, 却看不到它在整个调用层次中的位置.

比如 A, B 调用了 C, C 调用了 D. 我希望调用图长这样(这是用 d2lang 画出来的).

image

为了初步做到这一点, 我想问, org-roam 能只处理一个文件么? 这个 org 文件(就是我对一个项目的笔记)中不同的标题就是不同的 node. org-roam 能只可视化这个文件么? 它的可视化做得怎么样呢? 比如能点击图上的一个节点就跳转到 org-mode 中对应的笔记么? 会不会如果函数很多, 很多节点都很小, 我看不清, 我能不能 focus 到某个节点上?

如果能做到这些, 那我只需要在 A, B 节点下引用 C, C 节点下引用 D, 就自动能生成上面这样的图.

如果可以, 我还有个问题, 我希望图上不仅节点有笔记, 最好两个节点之间的连线也有笔记, 连线在我的设想中是调用实例, 比如 C(arg1,arg2,arg3), org-roam 能让我在连线上也给出笔记么? 再比如如果连线能是虚线就好了, 我可以用实线描述方法调用, 用虚线描述数据修改.

如果 org-roam 做不到, 你们觉得比较接近我想法的工具是什么?

我考虑过 d2lang, 它可以方便地在链接和节点上写字, 但是它只是一个图, 缺乏交互性, 而且每次添加新的信息, 就要重新生成图片, 而且做笔记也不合适.

1 个赞

推荐使用 plantuml 做流程图/时序图/导图。

我觉得org-mode的定位应该是前端工具(虽然表现力不足,但写起来比html+css+js舒服多了),这也是我现在对org-mode 的用法,某个程序对项目进行解析,结果生成一个org文件,把复杂的项目结构关系展示出来,包含大量链接,点击后可改变org文件内容,实现跳过来跳过去。

最好有图形化显示,图形化显示当然好,但根据我的经验,当项目的结构关系复杂到一定程度后都无法用纯文本来描述,图形化显示生成的图片要看懂也一样困难。更不用想还要做到点击跳转。但org-mode做个链接很方便.

但我也没有见过有任何工具会把org-mode来做为自己的执行结果界面的,我就只好自己写了,但自己水平实在有限,不知道怎么才能写出一个能 描述函数的调用关系 的程序。只能确定在org-mode里把极复杂的项目函数调用关系展示出来(并可点击跳转)是可以做到的。

函数关系是我手动添加, 其实本质上我就是想尽量方便地画出一个 DAG(有向无关图), 并且实现与 org mode 节点的互动(点击图上节点跳转到 org mode 中对应节点). 我现在的想法是最简单的就直接用 graphviz 来描述, 无论手动写 dot 还是解析 org 文件生成 dot 文件, 感觉都是可行的. 如果能有更好的方式那当然更好.

我曾经一度用思维导图来画调用图, 确实非常方便, 也好看, 但思维导图本质上只能描述 tree, 不能描述 DAG, 而调用关系基本上都是 DAG 而不是 tree(也就是一个函数通常不止被一个函数调用). 但凡有个工具能让我像思维导图那样画 DAG (比如在一个节点, 按 tab 是创建子节点, shift tab 是添加父节点, 也就是调用这个节点的节点)我也能勉强满意了.

我目前打算使用的做法是用 graphviz, 虽然 d2lang 也可以, 但我觉得 graphviz 生成速度更快, 也更美观, 而且也是用得最多的.