yibie
1
受不了 org-translution 复杂的用法…
干脆增强 #+INCLUDE,让它来标记引用其它文档的部分,然后用 overlay 显示在下方。
提供了交互命令,方便输入 #+INCLUDE 这个特殊的 block,目前支持两种:
在 #+INCLUD 一行按下 C-c '
同样可以跳转到源文件进行修改。
DEMO1

DEMO2
修改源文件之后,只需要 M-x org-include-inline-refresh-buffer 就可以刷新 overlay,更新内容。

欢迎加星:
16 个赞
fabi
2
请问,被插入区域用行数指定,如果文件持续修改导致该内容在源文件的行数发生变化,插入directives能否自动调整?
另外,能否按subtree进行引用?
1 个赞
可以 include 指定文件中指定名(如 test_block)的 src block 吗?
类似整个 block 的内容都 include 进来:
#+name: test_block
#+begin_src bash
// blablabla
#+end_src
yibie
4
第一个问题,如果原内容发生了变化(行数),你重新修改 #+INCLUDE 后面跟着的 :line 的参数就好了。自动变化跟随变化做不到,因为 emacs 是文本编辑器,不是类似 Notion 这种,什么都保存到数据库,是基础上的不同。
第二个问题,可以,相关代码还没调试好。等后续更新。
yibie
5
只要是 #+INCLUDE 原生的功能,都将打算支持。等后续更新。
感觉可以实现自动刷新(因为是知道从哪个包含overlay的文件进入到源文件的),没必要单独用一个命令。因为用户修改完之后,必然期待的是引用的内容更新,我觉得无需提供给用户去手动执行。
yibie
7
有道理,我其实用了一个 hook,但 hook 失效了。我回头排查一下。
yibie
8
已经搞定了,只要使用命令明确地保存了修改后的源文件,相应的 #+INCLUDE 就会更新

2 个赞
其实是可以做到的,这需要维护一个源文件的引用的关系列表。可以用数据库存,也可以用文件存。emacs有很方便的本地数据库接口 sqlite,用文件的话就是简单的读写文件。
当源文件修改时,临时用properties指定原始的文本区域,这样在文本前面增加或删除内容导致行号变化时,properties仍然能找到文本的区域。在保存时再将该区域的新的行号更新到所有引用的部分即可。
yibie
10
有点复杂…想起了你之前的 roam-block.el 这个包。
我觉得比较合适的方式是,可以 include subtree,这样子就不要计算 properties 的问题。
也不用特别影响 #+INCLUDE 的语法。
不会影响 #+include 语法,properties 只是临时用来标记被引用内容的区域,方便获取改变后的行号,buffer kill掉就消失了,还是比较干净的。text properties 是作用于文本之上的,会跟着文本走,不存在什么计算的内容。
先设置 text properties,改完之后,再搜索指定的属性,获取新的行号,最后将行号更新到 #+include … 中,不复杂呀,哈哈哈
如果你不考虑实时更新所有引用部分的行号,甚至不用数据库或文件存储关联关系。只关心当前的文件即可。
yibie
13
我大概理解你的意思了,其实最终是重新输入行号。
那看上去有一个更简单的解法,让用户重新获取一次行号。由于我的命令是可交互的,用户可以在重新选择 include 的范围。
我晚点看看去。
那和手动改行号就没有区别了,用户多了一次操作。我的这个方案自动更新行号对用户是无感的。
这其实是一个关注点的问题,用户本质上关心的是include的内容,行号只是程序用来定位内容的一种方式(可以换成其他任何方式,比如region,uuid,关键词搜索,标题等等),所以我觉得还是不要让用户考虑这些的好,从软件设计上来看。
yibie
15
有道理,我对 text properties 这个机制有误解。我以为它要显性指明。
text properties 和 overlay 本质的区别就是前者是作用于文本,后者作用于一个范围。
yibie
18
来自用户的称赞,打算代替自己用的 org-transclusion
5 个赞
感谢!相当于文件块行级的带预览可编辑的反向链接,很实用。未来编辑的一个 feature ,再也不用搜索回去找找找了 