思源笔记社区正在搭建中,现邀您共建
SiYuan Community is under construction. Join us to co-build.
转移引用(这个内容块必须被引用才会有此选项)https://ld246.com/article/1659360717624/comment/1659366925041?r=dammy#comments 我靠自己规定的笔记规范来解决,我绝大多数文档内都是纯列表或者标题 + 列表,在引用时,只引用三种类型的块:文档块、标题块、列表项块。在笔记规范之下,这三种块是非常稳定的,引用这三种块,在重构笔记时,不会出现 id 变化的问题。剩下还有小部分文档是标题 + 段落块,这类文档一般是输出文章之类的,不适合使用大纲笔记那种方式编写,因此这种文档的块类型也非常稳定,不会出现问题。 此外关于你的担忧,还可以考虑通过“反链转移”功能解决,参考我在这个 issue 中的回帖:link,目前思源还没有这个功能,其他双链软件也还没有,不过有的软件通过“合并文档”功能对文档块间接实现了这个功能,但对于更细粒度的块我目前还没看到有软件实现了的。如果引用关系因为块类型的转换而破坏了,只需要通过“反链转移”功能就能很快修复。 因此,通过笔记规范,基本规避了风险,如果不喜欢这种笔记规范,偶尔会有块类型转换的情况,那也不用担心,放心写,有“反链转移”功能来兜底,平时记笔记时大胆记、放心记,有了“反链转移”功能,风险是可控的。
写一点我关于这个功能的看法: 这个功能的核心并不是把两个文档的正文进行合并,因为这个完全可以手动完成,而且也不算麻烦,核心在于把一个文档块的反链转移到另一个文档块上,这个是在思源软件本体中目前做不到的,而且在思源的架构之下,完全不用局限在文档块,任何类型的块的反链都可以转移,因此我认为这个功能更准确的叫法应该是“反链转移”,可以在两个文档块之间转移,可以在文档块和非文档块之间转移,可以在两个非文档块之间转移,在思源里实现这个功能可以比roam更加灵活。 目前可以直接操作底层文件来实现这个功能,比如我想把块A的反链转移到块B上,只需全局搜索块A的id,然后替换除了定义块A之外的搜索结果为块B的id。但操作底层文件有风险,而且必须要关掉软件后操作,还要等待很长时间的从零开始的重建索引,因此需要思源软件本体给出这个功能。roam里面实现合并文档时其实也是类似的做法,不过它们合并page时没有id的概念,直接全局替换[[page1]]为[[page2]]即可,和全局替换id是类似的。 我认为这个功能最终实现起来是这样的:首先用户给出两个块:块A与块B,用户想要把块A的反链转移到块B上,然后软件自动将所有引用块A的地方改成引用块B,最后,如果引用处是静态锚文本则锚文本不变,如果是动态锚文本则锚文本随之改变。 反链转移之后,如果识别到是文档块和文档块之间的转移,可以考虑再多一步,也就是把文档块A的正文移动到文档块B中,此时可以给出弹窗,例如“识别到是文档块之间的反链转移,是否要移动正文?”,如果用户点击确定,则转移,否则不转移。roam里面必须转移其实是因为roam里面不能有同名文档,而思源里面可以存在同名文档,且思源里面还可以直接实现非同名文档之间的反链转移,没有必要一定要转移正文。 其实之前实现的标题块和文档块互转、列表项块转化为文档块,是“反链转移”功能的应用,可以视为“反链转移”对于特定场景下转移时的便捷交互形式。例如,我想把标题块“ABC”变成文档块《ABC》,我可以先创建文档块《ABC》,然后把标题块“ABC”下的内容移动到文档块《ABC》中,然后把标题块“ABC”的反链转移到文档块《ABC》中,之前实现的“标题块转文档块”是把上面这个步骤打包成一个拖拽动作(当然,本质上反链转移是改变引用块处的id,而标题转文档改变的是定义块处的id,但最终效果是一样的,毕竟id对用户来说是透明的)