-
图表功能怎么用?只见 echarts 报错
2024-11-11 00:00如果是做个树形图,或者网络图,可以试试
番茄工具箱
的块关系图
(图中:按住 ctrl 可以多选节点与连线;backspace 可删除节点与连线;可创建连线;alt 点击可以定位到文档)
(文档中:右键菜单可以定位到图中。快速创建引用可以用双向互链功能)
-
输入【】的时候,会出现的居然是待办清单
2024-11-04 14:51方法 1:
对于安装好的思源可以这样改:
找到安装目录,比如:C:\Users\abc\AppData\Local\Programs\SiYuan\resources\stage\build\app
找到 main 开头的 js 文件:
查找
\u3010\u3011
然后删除,重启思源即可。
每次升级思源之后,都要改一次。
方法 2:改代码,自己编译:
把红色代码删除后编译。
-
siyuan 究极性能优化笔记
2024-10-11 16:53👍 分析的很好。
对于很大的文档确实性能堪忧。
但是标题折叠那一块,对于小文档影响也很大。
比如一个文档里面有一些标题。
标题不多, 但当要清空整个文档内容的时候,就会很卡。
这时候我会做一个优化。
把所有内容放到超级快里面。
这样清空文档的时候,就是相当于删除一个超级快。也没必要检查折叠了。这样速度很快。
-
求助帮忙实现将所有文档快速制卡,或者将所有档案加入渐进阅读队列
2024-10-11 16:23要是安装了渐进学习插件或者番茄工具箱,可以打开开发者工具。
查询所有的文档。
b = tomato_zZmqus5PtYRi ?? progressive_zZmqus5PtYRi a = await b.siyuan.sql(`select * from blocks where type='d' limit 1000000000`) 查找所有的文档。 await b.siyuan.addRiffCards(a.map(i=>i.id)) 全部加入卡。
-
开发分享 | 简化 i18n 工作的一个方案
2024-10-08 19:06感谢,很有启发性。
如果可以直接生成 ts 代码更好。那样可以利用编译器的检查能力。
为了让编译器检查代码,确保正确,我目前是这样的:
做个模板,带有 ai 的提示词。
export class TomatoI18n { conf: Config.IConf; init() { this.conf = Siyuan.config } // TypeScript function: translate and fill other languages in the return. // Don't change the function name I provide. public get xxxx() { switch (this.conf.appearance.lang as ("it_IT" | Config.TLang)) { case "zh_CN": return "xxx"; case "es_ES": return case "fr_FR": return case "ja_JP": return case "zh_CHT": return case "it_IT": return case "en_US": default: return } } } export const tomatoI18n = new TomatoI18n();
每加一个翻译一次。 (i18n 的 key 用中文名比较显眼,也可加英文前缀。)
export class TomatoI18n { conf: Config.IConf; init() { this.conf = Siyuan.config } // TypeScript function: translate and fill other languages in the return. // Don't change the function name I provide. public get xxxx() { switch (this.conf.appearance.lang as ("it_IT" | Config.TLang)) { case "zh_CN": return "xxx"; case "es_ES": return case "fr_FR": return case "ja_JP": return case "zh_CHT": return case "it_IT": return case "en_US": default: return } } // TypeScript function: translate and fill other languages in the return. // Don't change the function name I provide. public get 移动到文档() { switch (this.conf.appearance.lang as ("it_IT" | Config.TLang)) { case "zh_CN": return "移动内容到文档"; case "es_ES": return "mover contenido a documento"; case "fr_FR": return "déplacer le contenu vers le document"; case "ja_JP": return "内容をドキュメントに移動"; case "zh_CHT": return "移動內容到文檔"; case "it_IT": return "spostare il contenuto al documento"; case "en_US": default: return "move content to document"; } } } export const tomatoI18n = new TomatoI18n();
使用的时候:
<label> <input type="checkbox" class="b3-switch settingBox" bind:checked={$back_link_move_here} /> <span class="b3-label__text"> {@html icon("Move", ICONS_SIZE)}</span > {tomatoI18n.移动到文档} </label>
可以配合 vscode 的 ai 功能。手动用 ai 翻译也可以。
不过我这样做的缺点也明显,就是需要人肉操作的部分比较多。
补充一个额外的好处,get 可以改为 function,支持复杂一点的信息。
public 推迟x小时(hours: number) { switch (this.conf.appearance.lang as ("it_IT" | Config.TLang)) { case "zh_CN": return `推迟${hours.toFixed(1)}小时`; case "es_ES": return `Retrasar ${hours.toFixed(1)} horas`; case "fr_FR": return `Retarder ${hours.toFixed(1)} heures`; case "ja_JP": return `${hours.toFixed(1)}時間遅れる`; case "zh_CHT": return `推遲${hours.toFixed(1)}小時`; case "it_IT": return case "en_US": default: return `Delay by ${hours.toFixed(1)} hours`; } }
-
试了一个叫“书立”的双链笔记工具,想到思源笔记应该全力商业化运营
2024-09-27 15:51数据库确实不错,但手动维护成本比较高。
但是自动的把反链插入到数据库中,就可以充分利用数据库的能力来处理反链。 查询过滤都很方便。
-
当引用、嵌入块的内容不在时,应能知道他们的其出处
2024-08-16 10:09修复 id 的尝试我也做过。也是一个思路,把 id 记录下来,在
番茄工具箱
的双向互链
功能就有这个尝试。比如两个块,用链接互相关联。
如果对它们做了接切与粘贴,那 id 一定变了。
如果在属性中做一个逻辑上的关联是可以修复的。
-
当引用、嵌入块的内容不在时,应能知道他们的其出处
2024-08-13 14:14抛砖引玉,提供一个可能的思路。
嵌入块、引用块,都可以把出处写入自定义属性。
这样就算原文被删除了,也可以知道大概的出处。
番茄工具箱的
复制内容到dailynote
功能就是这样设计的。 -
是否可以在搜索当中加入 AI 搜索?
2024-08-10 09:52我是用番茄工具箱的知识库功能。
把一部分文档和子文档上传到知识库。
然后可以针对知识库提问。
AI 的回答带有相关文档链接。
额外还有一个聊天框。
-
一个插件的 idea:双链插入快查表
2024-08-01 17:31丝滑打引用是个难题。
全拼,简拼法。
文档名前缀法。
还有你说的快查表法。
然后有人表示番茄工具箱已经使用 @@ 作为语法解决了这个需求。并且还有人提出问题:这样怎么解决重名的情况?我觉得没办法。
重名不会重复创建文档的。
另外,三个 @, 是子串匹配,匹配到了会原地改为引用。
出现近义词在所难免,可以使用文档合并功能,其中一个被删除的文档,其名字会作为保留下来的文档的别名。
不过这些办法都是半自动的,理论可行,就是用起来体验差。
-
从 2024 年的视角来看,以 Roam Research 为首的双向链接似乎已经降温
2024-08-01 14:56实际上可以达成这样的一种要求,也就是让 AI 在后台进行聚类的操作,给文档贴上好多的标签。
要是运用的是大厂的 AI ,在思源里面,还得先分辨出哪些文档是私密的。
最终,琢磨如何能更好地向用户呈现相关页面。
-
思源插件开发 | 使用前端框架要小心内存泄漏风险
2024-07-20 00:15我看了一下链接。销毁组件的销毁是通过,dialog 来完成的。
我之前也是这样处理的。
如果是,销毁的动作是从组件发出的,并所有销毁统一由 dialog 完成,就需要把 dialog 的引用传给组件,从组件里面调用 dialog.destroy,关闭窗口的同时销毁资源。
那创建组件和 dialog 的时候,双方都需要对方的引用。这种写法怪怪的。
所以,我借用了另外的工具来做销毁工作。除了释放资源,还可以做其他逻辑上相关的工作,比如把某个变量设置为 null。
-
笔记软件什么时候能完全 AI 化?
2024-07-19 16:52可以先看看这个:接入百度千帆知识库
AI 知识库问答
Ctrl+Shift+S
针对思源文档,进行提问,答案中包含出处的引用。
基于百度千帆知识库。
1 打开配置
2 创建密钥
根据配置中的链接,注册账户,创建密钥,把密钥填入工具箱的配置中。
3 创建知识库
需要先随便上传一个文件,不然不能创建知识库。最后再删除其。全部选项默认。
把 ID 填入工具箱的配置中。
4 创建应用
1 必须添加刚才创建的知识库。
2 可以选
文心一言4.0
3 发布,发布才有 ID
发布得到 ID,把 ID 填入工具箱的配置中。
5 下载千帆接口转发器
为什么要这个东西?百度不提供 JS SDK,提供了 Python SDK。
为了让番茄工具箱,可以访问百度千帆,我用 Python SDK 开发了个转发器。
方法 1:Windows 用户可以直接下载,编译好的转发器 EXE
随便放一个地方,双击运行即可,使用默认配置。
第一次运行,会生成一个
.ini
文件。如果需要,可以在
.ini
修改地址与端口,重启生效。记得再到番茄工具箱配置也修改。
到这里已经可以使用了。
方法 2:Linux, Windows, MAC 可以通过源码安装转发器
- 下载源码
- 安装跨平台 Powershell
- 执行
initProj.ps1
- 执行
run.ps1 pro
如果不用 powershell
下载源码 或者
git clone https://gitee.com/TokenzQdBN/baidu-qf.git
cd baidu-qf python -m venv venv venv\Scripts\activate pip install --upgrade appbuilder-sdk flask waitress pyinstaller cd app-builder pip install . cd .. python app.py
-
笔记软件什么时候能完全 AI 化?
2024-07-19 16:20我一开始也是想接入通义的,奈何他的 api 给的不够,还是我发工单催一波,他们才加上一点,不过我还是搞不明白怎么用。
最后我改接入了百度,虽然百度也好不到哪里,但能跑通。
目前番茄工具箱,可以指定文档,或者指定文档树,发送给百度千帆。如果启用知识增强,那效果比较好。
至于你说的长序列上下连贯,这个我还没注意。目前主要是当智能索引用。
-
思源插件开发 | 使用前端框架要小心内存泄漏风险
2024-07-19 16:00感谢!我也是用你的插件模版。
这个发早一点,或者写到插件模版就好了。
写插件一段时间后,我发现有些地方存在内存泄露,不过这点泄露其实不影响,毕竟页面也是开开关关的,总会释放内存。
但作为一个开发者,发现了内存泄漏肯定不能忍。
我这里遇到的情况比较复杂,
简单说就是需要销毁一组资源。
不一样的是销毁的发起方,不是固定的。
可以是 dialog 关闭,也可以是 svelte 里面的按钮触发,比如完成某给逻辑后关闭。
要求是销毁要干净,还不重复销毁。
我的处理方法是引入一个辅助工具
DestroyManager
。比如这样使用:
if (!this.dm) { this.dm = new DestroyManager(); const id = newID(); const dialog = new Dialog({ title: "🍅⏰ " + this.plugin.i18n.setDateTitle, content: `<div id="${id}"></div>`, width: events.isMobile ? "90vw" : "700px", height: events.isMobile ? "180vw" : null, destroyCallback: () => { this.dm.destroyBy("1") }, }); const d = new ScheduleDialog({ target: dialog.element.querySelector("#" + id), props: { plugin: this.plugin, blockID, dialog, dm: this.dm, } }); this.dm.add("1", () => { dialog.destroy() }) this.dm.add("2", () => { d.$destroy() }) this.dm.add("set2null", () => { this.dm = null }) } else { this.dm?.destroyBy(); await copyID(blockID); console.info(document.querySelectorAll(`[${DATA_NODE_ID}="${blockID}"]`)); }
在 svelte 内,发起关闭的情况:
大多数情况,我是在 svelte 内的按钮,触发:dm.destroyBy(null)直接全部关闭,释放内存。
export class DestroyManager { private destroied = false; private cbs = new Map<string, Func>(); private actions: Func[] = []; private showMsg: boolean; private prefix: string; constructor(showMsg = false, prefix: string = "DestroyManager") { this.prefix = prefix; this.showMsg = showMsg; } action(cb: Func) { this.actions.push(cb); } run() { this.actions.forEach(i => i()); } add(name: string, cb: Func) { this.cbs.set(name.trim(), cb); } destroyBy(name: string = null) { if (!this.destroied) { this.destroied = true; const lst = [...this.cbs.entries()]; if (name == null) { lst.forEach(([k, v]) => { if (this.showMsg) console.log(`[${this.prefix}] DESTROY [${k}] BY NONE`); v(); }); } else { name = name.trim(); lst.filter(([k]) => k !== name).forEach(([k, v]) => { if (this.showMsg) console.log(`[${this.prefix}] DESTROY [${k}] BY [${name}]`); v(); }); } } } }
-
如何做才可以让思源具有语义功能?这是有了大量笔记后再利用的关键。(内含建议思路)
2024-07-12 09:59 -
建议在剪切块时,如果有被引用的块,则弹出提醒
2024-07-08 20:43复制前,可以在属性里再加入 originID。
如果引用找不到块 id,可以去属性里找 originID,并更新指向新的块 id。
如果引用找不到块 id,有多个块都有一样的 originID,可以提醒一下,要指向哪个。
官方可以在复制时,就插入 originID,在查找 id miss 后,可以再次找 originID。
-
我有点害怕块引用
2024-07-07 20:22只是记录,不如用的时候问 AI。
如果记录了,需要去翻找来看,阻力较大。
不如先写日记,再制卡。通过闪卡复习的方式多看几遍,没价值的就在复习时删除,有价值的,并且想明白了,可以选择打个引用。
可以用渐进学习插件带的 dailycard 功能。
另外,使用日记 alt5,并不非得写大纲,不非得要双链要传递。记录这些双链的东东是有点麻烦。
有空时,就坐下来,你可以简单回忆,记录一天中印象深刻的事情,alt5,用几段话描述,多关联一下能想到的事物。可以写一些感悟。写一些疑问,可以没有答案。有价值的都丢到 dailycard。通过多次的复习,提炼有价值的信息,复习时间可以问问 ai。