你有没有这样的场景,当你不小心写了一个非常占用资源的 SQL 查询或者当你复制了某位大神写的死循环的代码,这时你的文档突然卡死,CPU 也飙到 100%。
但,不幸的时,由于思源会记住上次打开的文档,这时,哪怕你强制关闭思源,那么再次重启思源,这个文档依然会被首先打开,思源依然会卡死。
当出现这种情况该怎么办呢?
请看下文。
准备工具:
思源 vscode 插件,浏览器
操作步骤:
第一步,任务管理器强制退出思源,但不要退出内核
注意: 正常情况下,你退出 SiYuan 进程,随后 SiYuan-Kernel 进程也会退出了,但卡死情况不会。
如果不小心把内核进程也关了怎么办?
别担心,可以用下面的命令打开。
windows:
`C:\Users\Administrator\AppData\Local\Programs\SiYuan\resources\kernel\SiYuan-Kernel.exe --port 6806 --wd C:\Users\Administrator\AppData\Local\Programs\SiYuan\resources --workspace C:\siyuan`
命令具体内容请根据自己实际情况修改。
mac:
/Applications/SiYuan.app/Contents/Resources/kernel/SiYuan-Kernel --port 6806 --wd /Applications/SiYuan.app/Contents/Resources --workspace "/Users/yourname/_data/思源笔记"
命令具体内容请根据自己实际情况修改。
第二步,打开思源工作空间,随便复制个文档 id,但不要是出问题的文档
第三步,打开浏览器输入 http://127.0.0.1:6806/?id=刚才你复制的文档id
,这时就打开了你指定 id 的文档了,不会打开原来的文档了
第四步,在目录找到刚才出问题的文档,然后右键插件-> 集成编辑环境->markdown-> 在新标签中打开,然后修改有问题的代码即可。
注意,第四步找到文档后,千万不要直接打开文档,打开后又会被卡死了。
这第四步也可以在文档树目录中右键文档,然后查看历史,在历史中恢复上一个版本即可。
更进一步
鉴于你可能不知道文档具体在哪个文件夹中,建议你先安装下面这个 js 代码片段,然后就可以通过全局搜索来查找文档,注意,查找后千万不要点击文档,一旦打开就又卡死了,你只需要向下翻滚即可,找到想要的文档后,使用中键点击,即可在文档树中定位该文档了。
但这个查询很可能是精确匹配,在搜索预览时卡死,如果确定会精确匹配的,也可以用 query 挂件用 SQL 查询。
js 代码片段如下
// 搜索列表,鼠标中键在文档树中定位文档,不会打开文档
(()=>{
document.addEventListener('mousedown', async function(event) {
// 检查是否按下了鼠标中键
const isModifierKeyPressed = event.button === 1 && !event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey;
if (isModifierKeyPressed) {
const item = event.target.closest('[data-type="search-item"]');
if(!item) return;
const docId = item?.dataset?.rootId;
if(!docId) return;
const docInfo = await requestApi('/api/filetree/getDoc', {id: docId});
if(!docInfo?.data?.path || !docInfo?.data?.box) return;
(siyuan?.mobile?.docks?.file||siyuan?.mobile?.files||siyuan.layout.leftDock.data.file).selectItem(docInfo.data.box, docInfo.data.path);
const closeBtn = item.closest('.b3-dialog__container')?.querySelector('.b3-dialog__close');
if(!closeBtn) return;
closeBtn.dispatchEvent(new MouseEvent('click', { bubbles: true }));
}
},true);
async function requestApi(url, data, method = 'POST') {
return await (await fetch(url, {method: method, body: JSON.stringify(data||{})})).json();
}
})();
代码备份地址
开发者方法
如果你是开发者,还可以在数据库里搜索相关的块信息,然后查到相关的文档 id,根据文档 id 的 sy 文件进行清除(不推荐,我没试过,理论上应该可以)。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于