-
STtools 插件:笔记白板转化初步预览(模仿 affine)
2025-03-16 15:53Affine 的白板我是真的爱,整体的功能和 UI 都很不错,只是目前 Affine 也不算完成体,关键 Affine 还开源。未来是思源的强大竞争者。
-
思源会被谁取代?
2025-03-04 10:44你这个思路才是对的,第二大脑不是简单的仓库,随意堆着就行。是需要人本身高度参与的,在脑子里面构建好结构和索引。说到底,大模型可以取代人做一些模式化的工作,但就是没法取代自己的脑子。把自己的脑子交给 AI 也就没有用笔记的必要了。
-
思源会被谁取代?
2025-03-04 10:40Trae 和 SiYuan 都不是一个类型的产品。如果个人需求可以被 Trae 解决,那么 cursor, vscode + AI 插件照样解决。
那就说明你的需求很简单,或者大道至简,所有的笔记需求使用文字就可以了。
-
DeepSeek 锐评各大笔记软件:Obsidian、Notion、flomo、思源笔记、语雀、OneNote
2025-02-04 14:21这 ai 写的,已经可以薄纱不少二手的缝合怪自媒体了。
所以,未来有自己的风格坚持做原创,原创到 ai 想不到的那些人会更加吃香。
AI 像一个饕餮吃掉一切吐出一切组合一切,薄纱人类。但是人还有创造力可以硬刚一下。
AI 这种力大飞砖会更显得人本身的可贵。
-
求改个 sql or js,只筛选笔记本下某个层级以上的文档
2025-01-27 17:14佬,顺便请教一个问题,就你之前写的那个计算某个文档是否“已加入”某个数据库,如果加入的话列出它所加入的库。
我在实际应用中发现,部分文档,在汇总的表中,可以看到罗列出来的已加入的数据库名称了,但是“是否加入数据库”这个列里面还是没有“已加入”三个字,这个现象只在部分文档中出现。不知道是不是底层值更新有延迟还是啥。
-
有文档实时查看 markmap 样式的插件吗
2025-01-04 15:05没有滴,我都是在 vscode 里面写和看 markmap。
顺便请教老哥一个事儿,markmap 你有没有试过增粗连接线啊。这个是不是不可调的。
-
感觉两百多个 issue 一半都是数据库的功能
2025-01-03 12:50数据库和 query 是互补的。query 基于编程来整理,收集,呈现。数据库引入了一定的"互动"。
另外,数据库导出为 csv,可以视为一种比较通用的格式。notion 和一些类 notion 基本上都支持 csv 的导入。
python 处理 csv 文档更是得心应手。
-
如何解决发送到数据库主键中的换行问题
2024-12-31 09:24在这里放一个“权宜之计“,用模版列拿块的内容,把主键仅仅当成一个锚,等后续数据库功能更新了,可以把模版列再删除或者隐藏。
.action{$id := .id}.action{$blocks := queryBlocks "select * from blocks where id='?'" $id}.action{ $b := first $blocks}<a href="siyuan://blocks/.action{$b.ID}" onclick="event.stopPropagation()">.action{$b.Content}</a>
-
在数据表中,求一个模板,根据添加到数据库的主键的那个文档,返回它的父文档链接
2024-12-11 01:07这边放下去掉空余空格后的代码,运行良好很完美。供需要的朋友直接取用。顺便说下这个应用场景:
以父文档及标题作为项目,然后以子文档标题作为项目下的各种子任务。把子任务文档发送到一个任务管理的数据库表中,任务执行的上下文数据存储在子任务文档中。随着任务的杂多,适当的在数据库表中自动展示父文档即“任务所属项目”有一定的必要性。
.action{ if index . "custom-avs" }.action{$id := .id}.action{$blocks := queryBlocks "select * from blocks where id='?'" $id}.action{ $b := first $blocks}.action{$list := splitList $b.ID $b.Path }.action{$f := first $list }.action{$len := len $f }.action{$len := sub $len 1 }.action{$len := int $len }.action{ if ne 0 $len }.action{$f := substr 1 $len $f}.action{$list := splitList "/" $f }.action{$ParentID := last $list }.action{$ParentID := trim $ParentID }.action{$blocks := queryBlocks "select * from blocks where id='?'" $ParentID}.action{$b := first $blocks}<span data-type="block-ref" data-id=".action{$b.ID}" data-subtype="s" class="av__celltext av__celltext--ref" style="">.action{$b.Content}</span>.action{ end }.action{ end }
-
在数据表中,求一个模板,根据添加到数据库的主键的那个文档,返回它的父文档链接
2024-12-10 23:54佬,捉个小瑕疵,这个模板在如下条件组合下,会跳出黑框:
条件一:设置链接只有在“ctrl + 鼠标”触碰下才预览。
条件二:模板的那个列没有开启换行(开启换行会有个问题,就是会有非常大的空白段在表格列中。),在没有开启换行的情况下,文档的标题链接超出了单元格的宽度。
在上面两个条件下,把鼠标触碰模板列中的链接,会跳出如下黑框。但是,Ctrl + 鼠标触碰则是正常的预览。
当把单元格拉长能够完全显示模板列中的标题时,鼠标再进行触碰则是符合预期的什么也没有。(因为设置的就是需要 ctrl)。
-
分享一个极简任务追踪和回顾的 Query
2024-11-25 11:00-- 查询72h更新的文档 SELECT '[' || b.hpath || '](siyuan://blocks/' || b.id || ')' AS __1____pre__文档路径, CASE WHEN b.updated != '' THEN b.updated ELSE b.created END AS __2____datetime__最后更新时间, b.created AS __3____datetime__创建时间, printf('%d天%d小时%d分钟%d秒', ABS( (CAST(SUBSTR(b.updated, 1, 4) AS INTEGER) - CAST(SUBSTR(b.created, 1, 4) AS INTEGER)) * 365 * 24 * 60 * 60 + (CAST(SUBSTR(b.updated, 5, 2) AS INTEGER) - CAST(SUBSTR(b.created, 5, 2) AS INTEGER)) * 30 * 24 * 60 * 60 + (CAST(SUBSTR(b.updated, 7, 2) AS INTEGER) - CAST(SUBSTR(b.created, 7, 2) AS INTEGER)) * 24 * 60 * 60 + (CAST(SUBSTR(b.updated,9, 2) AS INTEGER) - CAST(SUBSTR(b.created, 9, 2) AS INTEGER)) * 60 * 60 + (CAST(SUBSTR(b.updated, 11, 2) AS INTEGER) - CAST(SUBSTR(b.created, 11, 2) AS INTEGER)) * 60 + (CAST(SUBSTR(b.updated, 13, 2) AS INTEGER) - CAST(SUBSTR(b.created, 13, 2) AS INTEGER)) ) / 86400, -- 天 ABS( (CAST(SUBSTR(b.updated, 1, 4) AS INTEGER) - CAST(SUBSTR(b.created, 1, 4) AS INTEGER)) * 365 * 24 * 60 * 60 + (CAST(SUBSTR(b.updated, 5, 2) AS INTEGER) - CAST(SUBSTR(b.created, 5, 2) AS INTEGER)) * 30 * 24 * 60 * 60 + (CAST(SUBSTR(b.updated, 7, 2) AS INTEGER) - CAST(SUBSTR(b.created, 7, 2) AS INTEGER)) * 24 * 60 * 60 + (CAST(SUBSTR(b.updated, 9, 2) AS INTEGER) - CAST(SUBSTR(b.created, 9, 2) AS INTEGER)) * 60 * 60 + (CAST(SUBSTR(b.updated, 11, 2) AS INTEGER) - CAST(SUBSTR(b.created, 11, 2) AS INTEGER)) * 60 + (CAST(SUBSTR(b.updated, 13, 2) AS INTEGER) - CAST(SUBSTR(b.created, 13, 2) AS INTEGER)) ) % 86400 / 3600, -- 小时 ABS( (CAST(SUBSTR(b.updated, 1, 4) AS INTEGER) - CAST(SUBSTR(b.created, 1, 4) AS INTEGER)) * 365 * 24 * 60 * 60 + (CAST(SUBSTR(b.updated, 5, 2) AS INTEGER) - CAST(SUBSTR(b.created, 5, 2) AS INTEGER)) * 30 * 24 * 60 * 60 + (CAST(SUBSTR(b.updated, 7, 2) AS INTEGER) - CAST(SUBSTR(b.created, 7, 2) AS INTEGER)) * 24 * 60 * 60 + (CAST(SUBSTR(b.updated, 9, 2) AS INTEGER) - CAST(SUBSTR(b.created, 9, 2) AS INTEGER)) * 60 * 60 + (CAST(SUBSTR(b.updated, 11, 2) AS INTEGER) - CAST(SUBSTR(b.created, 11, 2) AS INTEGER)) * 60 + (CAST(SUBSTR(b.updated, 13, 2) AS INTEGER) - CAST(SUBSTR(b.created, 13, 2) AS INTEGER)) ) % 3600 / 60, -- 分钟 ABS( (CAST(SUBSTR(b.updated, 1, 4) AS INTEGER) - CAST(SUBSTR(b.created, 1, 4) AS INTEGER)) * 365 * 24 * 60 * 60 + (CAST(SUBSTR(b.updated, 5, 2) AS INTEGER) - CAST(SUBSTR(b.created, 5, 2) AS INTEGER)) * 30 * 24 * 60 * 60 + (CAST(SUBSTR(b.updated, 7, 2) AS INTEGER) - CAST(SUBSTR(b.created, 7, 2) AS INTEGER)) * 24 * 60 * 60 + (CAST(SUBSTR(b.updated, 9, 2) AS INTEGER) - CAST(SUBSTR(b.created, 9, 2) AS INTEGER)) * 60 * 60 + (CAST(SUBSTR(b.updated, 11, 2) AS INTEGER) - CAST(SUBSTR(b.created, 11, 2) AS INTEGER)) * 60 + (CAST(SUBSTR(b.updated, 13, 2) AS INTEGER) - CAST(SUBSTR(b.created, 13, 2) AS INTEGER)) ) % 60 -- 秒 ) AS __4____pre__间隔时间 FROM blocks AS b WHERE b.type = 'd' AND b.root_id != '.block{.root_id}' AND ( b.updated > strftime( '%Y%m%d%H%M%S', 'now', 'localtime', '-3 day' ) OR b.created > strftime( '%Y%m%d%H%M%S', 'now', 'localtime', '-3 day' ) ) ORDER BY __2____datetime__最后更新时间 DESC LIMIT -1;