(发布)org-include-inline

这里涉及到状态锁,然后涉及一大堆状态设计。

但这个复杂度,不是因为 emacs 本身的实现能力,而是因为它是面向文本文件设计的。换言之,其主体面向对象是一个文本文件;而非将一个段落视为对象。

所以我觉得,不要勉强这一点。

让我回头实现,include org-subtree 这个功能就可以了。以 headling 作为一个范围判断,会比较合适。

在这个情境下,text-properties 机制过于灵活了。

2 个赞

期待subtree功能。

另外,有没有可能自定义一些简单的关键词,来指定一个文本块?这样颗粒度又灵活了一些。 比如一个小段落,首尾可以插入两个comment行,里边插入关键词org-include-line-block-start/end. 不过还要考虑块的唯一性标志问题

你可以用 #+NAME: 这种 block 来指定,使用 org-mode 里的 name block 机制。

这个机制在楼上提到了,(发布)org-include-inline - #11,来自 yibie

使用 org-include-inline-insert-named-block 这个命令,实际 include 的内容如下:

#+NAME: hello-world
#+begin_src python
print("Hello, World!")
#+end_src

这里是针对 src,但从机制来说再死 #+begin_quote 这类原生的 block 应该都支持。只要你在输入对应内容的上方添加了 #+NAME:

更新:

  1. 更新了自动刷新机制,现在较为稳健了,修改了源文件里对应的内容,无需 C-x C-s 也能够更新目标文件里对应的 include 的内容。
  2. 支持 include org-subtree 了。

figure3

经 org-node 的开发者 meedstrom 提醒,org-include-inline 还可以引用包含 ID 的条目。

目前已经实现该功能:

figure4

由于 org-mode 中的 C-c ’ 跳转依赖的 org-link-open-as-file 本身不支持 ID 链接,所以还另外多实现一个函数,用 advice 和 :around 让它支持直接跳转到对应 ID 的条目。

3 个赞

一个问题:Org map APIs 能作用到这些 include 进来的 subtree 吗?比如 org-map-entries, org-entry-get, 甚至 org-element 相关的 APIs。

目的:通过 include,使某 subtree 的属性(逻辑意义上)参与到 include 它的 subtree 的属性计算中。比如,某耗时统计(org-clock)的 subtree 可因此同时被算入“某项目”和“某日期”两个 entry 下。

做不到。这是底层原理的差异,INCLUDE 机制原本是用于 org-export 时,可以包含来自其它文件的内容。原始的 INCLUDE 语句类似如下:

#+INCLUDE “~/test.org” :lines “1-2”

是不会显示其它内容的。

你现在看到,#+INCLUDE 下方显示其它的内容,这是 org-include-inline 这个包所增强的。而它显示这些内容的机制是使用 overlay,所以实质上不会在文件里添加除了 #+INCLUDE 这个语法标记以外的内容。

按你所说的,其实你想要的是一个类似 Excel 里的 vlookup 语法的功能,目前我不知道有什么包做得到。但看上去只有 org-supertag 存在这个可能性。

1 个赞

org-include-inline-toggle-visibility 不起作用,始终显示 include 内容

我看看

简单地更新了一下,直接使用 org-include-inline-mode 来开关吧。

org-include-inline-toggle-visibility 已经废弃。

2 个赞

org-include-inline-max-lines-to-display 变量原来只控制org-include-inline--fetch-file-lines函数的输出,还以为是一个控制全局预览的选项。

Overlay的内容有办法滚动吗?有时候include的内容略长,滚轮滚不动,方向键往下就消失了。

有没有可能局部切换开关?就是一个 org 有多处 include,可以有选择的在不同的 include 处切换?

overlay 的机制不支持滚动,有点麻烦。让我想想。

不滚动也没事,大不了C-c '去看源文件就行,这边只当一个预览。

你好,两个问题请教:

  1. 在fold当前headline时,所包含的overlay能否自动关闭?现在的情形时,当前文件的内容被隐藏时,包含的overlay还是占位显示了。看起来不美观,也不符合使用逻辑。
  2. 在export时,能否自动忽略#include的内容?使用场景是:对于原文本一段文字,include了一段其他来源的注释,来进行精度和对读;之后有需要export原文本文字,不要携带incude的内容。

之前用过 GitHub - nobiot/org-transclusion: Emacs package to enable transclusion with Org Mode ,感觉功能挺相近的

因为 include 在 org-mode 里默认就是用来在 export 时包含其它文件里的内容,所以…

至于你说折叠的时候,也会显示,这个我看看有无办法解决。

就是觉得 org-transclusion 复杂,才开发 org-include-inline 的

你现在可以更新一下看看,你所说的这两个交互上缺点,已经解决。

在更新的时候,也请阅读 README 相关的部分。

你好,感谢这么快就做了改动!

  1. export control可以工作;
  2. respect fold设置下,当前层级折叠时还是会显示所包含的overlay,折叠更上一层时可以隐藏。