2023.5.5 更新
- 加入了文件变更后立刻同步的选项
2023.5.7 更新
原本只是想拉分支代码下来编译一下用,现已变成动手改代码维护插件,可喜可贺可喜可贺
- 加入了同步书签文件
"/bookmarks.json"
的功能 - 加入了更多关于同步时间的选项
原文
Remotely Save 插件上一次更新已经是一年前。在这一年间 github 的 Remotely Save 仓库其实收到了一些的合并请求,有一些通过了但是并没有被发布,有一些则被自己关闭了合并请求。
太长不看版
分支加入了
-
支持在文件变更后触发定时同步
-
在状态栏上面显示同步状态
两个功能,但是同时引入了若干Bug(……)
如果想要用的话可以使用我编译好(并且修改了我认为是Bug的部分)文件,直接跳转到使用需知部分即可。
分支功能
在其中我发现了 alvin-7/remotely-save 仓库的合并请求。这个仓库比原版增加了 7 次提交,根据提交日志,除了合并请求添加的 support auto save after file modified by alvin-7,还合并了 Added Status Bar Item by Drumber 的提交。因此这个仓库的版本也就同时多了以下功能:
-
支持在文件变更后触发定时同步
-
在状态栏上面显示同步状态
关于文件变更的原理,核心代码在这里
if (this.settings.autoRunAfterModified) {
if (time > 0) {
this.onFileModifyEventRef = this.app.vault.on("modify", () => this.autoBackupDebouncer());
this.autoBackupDebouncer = debounce(() => this.syncRun("auto"), time, true);
}
} else if (time > 0) {
this.timeoutIDBackup = window.setTimeout(() => this.syncRun("auto"), time);
}
其中 time
这个属性是设置项中的自动运行间隔
可以看出这个代码的逻辑并非通常理解的在每次文件变更后触发一次同步,而是在变更后开始计时,直到经过 自动运行间隔 的时间没有新的变更产生后才会进行一次同步。
函数防抖(debounce),就是指触发事件后,在 n 秒内函数只能执行一次,如果触发事件后在 n 秒内又触发了事件,则会重新计算函数延执行时间。
所以这个功能本质上防止用户一直开着Obsidian却没有编辑,定时同步依然在运行浪费了太多流量吧…
但是很奇怪的是它首先并没有停止原来的自动定时,使用的却是原本的自动的同步时间,甚至把原本有的 运行中变更自动同步时间时重置的功能给去掉了。也就是说当开启了这个选项后会同时在编辑之后的指定时间运行 并且 每隔指定时间还会再运行一遍。说实话我不太理解这个设计是特意进行的还是Bug,所以我把它改掉了(……)。
另一个功能状态栏显示同步状态就很好理解,开启之后会在右下角状态栏上显示一个 一分钟之前同步 这样的信息,如果把鼠标在上面停留一会儿会显示准确的同步时间。
使用需知
需要注意的是,不知道为什么使用了这个插件之后,我原本的阿里云OOS配置中 区域(Regin)的部分不能使用论坛教程中的 oss-cn-hongkong-internal.aliyuncs.com
而只能使用 oss-cn-hongkong-internal
才能连接成功。因为我也不知道这个区域到底是什么意思,所以用其他服务的在用这个版本的插件后可能得自己修改一下。
另一方面,因为这个版本我也没有长时间过,所以也不太清楚有没有什么问题,尤其是文件变更定时同步的部分,会不会触发异常也不是很清楚。建议在第一次打开这个开关后重新启动一次 obsidian 以防万一。
使用方法
在 alvin-7/remotely-save 的仓库把源码下载下来,并且根据 obsidianmd/obsidian-sample-plugin 中的指示自行编译插件。
在编译的时候可能会报错,这是因为没有把语言本地化的内容下载下来的缘故,把 alvin-7/langs 的内容下载下来全部塞进 src/langs/
目录下面就可以了。
当然我也知道这个很麻烦(……)
也可以下载我已经编译好的 main.js remotely-save - Gitee.com 文件然后替换掉插件文件夹的 main.js。我修改和补充了一部分翻译,加入了每30s自动运行一次的选项,同时分割了自动同步和修改后同步使用的时间间隔,可以在关闭自动同步的同时使用变更后同步的功能。
由于原本的机制,如果即使你设置了 30s 的间隔,如果你不停地打字中间停下来的时间都没有超过30s,然后迅速地关闭了OB,那么这个插件就不会同步了。理论上来讲应该设置一个上限,变更之后 一分钟或者五分钟 没有同步,就强制同步一遍比较合理。