Obsidian 插件延迟启动

首先,下载Templater 插件,新建md文件,粘贴如下代码:

<% Object.values(app.plugins.manifests).map(p=>p.id).sort((a,b)=>a.localeCompare(b)).join('\n') %>

Ctrl+P,输入 Templater:Replace templates in the active file

然后可以看见md 文件中出现了你的插件列表,里面有所有你已经安装的插件,这里的名字和OB 插件管理中的名字可能不同。

第二步,将你不想OB启动时一起启动的插件选出来,新建一个md 文件,可以命名为 startDelay.md,将上一步得到的插件名填入其中。

然后再建立一个md 文件,命名为script.md 将下述代码粘贴其中:

<%*

fastStart = async (filename, delayInSecond) => {

if (tp.file.exists(filename)) {

const f = tp.file.find_tfile(filename);

let plugins = (await app.vault.read(f)).split(/\r?\n/);

setTimeout(async () => {

plugins.forEach(async (p) => await app.plugins.enablePlugin(p))

}, delayInSecond * 1000)

}

}

await fastStart("startDelay", 30)

%>

第三步,将上述两个文件,startDelay.md 和 script.md 扔到一个文件夹,这里将其命名为template,在OB 中打开Templater 插件的设置选项,将 Template folder location 设置为template 所在的路径。

然后将在Startup Templates 选项新增script.md。

第四步,进入OB 选项>第三方插件页面,然后把你刚刚写入startDelay.md 中的插件全部关闭。

最后,关闭OB 再打开,你没有加入startDelay.md 中的插件会立刻启动,加入其中的插件会30s 后再启动。

简单说一下这个方法的原理,即使用插件Template 的Startup Templates 功能,这个功能可以在OB 启动时加载设定好的模板,这里便是script.md,而我们写入script.md 中代码的则可以在30s后启动写在startDelay.md 中插件。

我们在OB 的第三方插件中把startDelay.md 中把不想立刻启动的插件关掉,然后以后在OB 启动时Templater 就会调用的脚本再在30s启动这些插件,所以别把Templater 给关了,指望着人家干活呢。

像pandoc 这样的软件,可能从打开OB 到结束都用不到,就请它30s 后再启动,不要占用开机速度。

参考文献(科学上网):Improve Obsidian Startup Time on Older Devices with the FastStart Script | by TfTHacker | Medium

2 个赞

不知道现在有没有实现该功能的插件?我觉得完全可以写一个插件来完成这件事,还能提供更方便的管理功能

有人按照那篇文章的思路做了一个插件:

4 个赞

我觉得这个需求适合加入核心功能 :joy:

如果官方能做就挺好的

1 个赞

试了一下挺好用的, 赞

1 个赞

测试楼主的方法和 #3 的插件,还是楼主的方法启动快,简单修改也做到了分批启动插件,感谢!

基本配置参 QuickAdd JS & Templater JS 简介及相互修改
“QuickAdd Macro 加载 QuickAdd Capture”。

示例代码,点击展开
let plug2 = [
// 这里写需要启动 2 s 后加载的插件 ID
]
let plug3 = [
// 这里写需要启动 3 s 后加载的插件 ID
]
let plug4 = [
// 以此类推
]
const oStart = async (arr, delaySecond)=>
    setTimeout(async ()=> arr.forEach(async p=> await app.plugins.enablePlugin(p)), delaySecond*1000)
return [2, 3, 4].map(async sec=> await oStart(eval(`plug${sec}`), sec))

可使用楼主的方法提取全部插件 ID。

单独插件 ID 可在库下 .obsidian/plugins/插件文件夹/manifest.json 中找到

image


使用例

image

为配合该代码,添加第二个 QuickAdd:启停插件选单,显示插件现在的状态及对应插件名称。

image

若状态开启,关闭选中的插件;若状态关闭反之。以此快速启停插件。

基本配置参 QuickAdd JS & Templater JS 简介及相互修改“QuickAdd Capture 加载内部代码”。

示例代码
const pin = (arr, x)=> { let pin = arr.indexOf(x); if (pin > -1) { arr.splice(pin, 1); arr.unshift(x) }; return arr }
const on = id=> { app.plugins.enablePlugin(id); new Notice(`open ${obj[id].name}`, 1000) }
const off = id=> { app.plugins.disablePlugin(id); new Notice(`关闭 ${obj[id].name}`, 1000) }; let obj = app.plugins.manifests
let suggest = arr=> this.quickAddApi.suggester(id=> `${app.plugins.plugins[id] ? '已开启' : 'closed'} ${obj[id].name}`, arr)
let id = await suggest(pin(Object.values(obj).map(p=> p.id), 'remember-cursor-position')); if (!id) return; app.plugins.plugins[id] ? off(id) : on(id)

可将最常启停的插件置顶在选单首位,层主置顶的插件 ID 为 'remember-cursor-position'

1 个赞