Obsidian 插件:Aosr
插件名片
概述
另一种黑曜石间隔重复法。它使用闪卡来帮助复习和记忆知识。
原文出处
下面自述文件的来源于 Readme
Readme(翻译)
下面是 aosr 插件的自述翻译
Aosr
Aosr 是Another Obsidian 插件,用于Spaced Repetition(间隔重复)。
它使用记忆卡片来帮助记忆知识。
该插件类似于 spaced repetition,但根据个人习惯进行了一些更改。
新功能
- 新的卡组功能: 我们在 Aosr 中引入了一个新的 卡组功能。这个功能允许您根据自定义规则定义卡组的内容。只需将提供的代码复制粘贴到您的 Obsidian 笔记中,Aosr 插件将自动将其转换为可供复习的卡组。
特点
- 丰富的富文本格式支持:该插件支持音频等富文本格式。这使您可以创建多媒体的闪卡,提供更沉浸式的学习体验。
- 专用复习窗口:该插件具有独立的复习窗口,允许您在编辑器中对卡片进行更改的同时进行复习。这非常适合快速调整。
- 分钟级复习间隔:该插件允许您将复习间隔设置到分钟级别。这在安排复习时提供了高度的精确性。
- 三种基本学习类型:该插件支持三种基本学习类型 - 单行、多行和填空删除。
- 移动设备优化的复习界面:该插件现在支持移动设备,提供了专为移动用户设计的优化复习界面。这确保了在移动设备上复习卡片时的无缝和用户友好的体验。
- 多语言支持:支持 Obsidian 中的几乎所有语言。由 ChatGPT 翻译。
- 卡组功能:Aosr 现在包括一个强大的卡组功能,允许您以高度可定制的方式管理您的闪卡。您可以定义自己的规则来管理卡组,提供个性化的复习体验。
演示
格式
卡片
一个卡片以 #Q
开头,并以一个空行结束。
#Q
这是一个卡片。
在这里,请使用Pattern格式编写您的问题和答案。Pattern的格式如下所述。
只有在#Q和空行之间的内容将被视为复习内容。
超出此范围的Pattern格式将不会被处理。
<- 如果这不是文档的结尾,则应该有一个空行。
在卡片中,Pattern 是您的问题和答案。
一个卡片可以包含多个 Pattern。例如,如果您正在学习一个词汇表,您的卡片可以包含多行:: 样式的 Pattern,每个 Pattern 将一个单词与其定义配对。从本质上讲,您可以将卡片视为 Obsidian 中的文本块,而 Pattern 是一个问题及其对应的答案。一个文本块可以包含多个问题及其各自的答案。
使用 ***
将卡片分割为子卡片。如果您不想编写 #Q
并创建一个新卡片,这将非常有用。
#Q
卡片1
***
卡片2
上述写法的效果与以下写法相同。
#Q
卡片1
#Q
卡片2
范围卡片(Scope Cards)
范围卡片,也被称为作用域卡片,是 Markdown 格式中的一种特殊类型卡片。它们作为一项新功能被引入,以增强创建闪卡的灵活性。
范围卡片以 #Q
开头,以 #/Q
结尾。范围卡片的独特之处在于它支持包含空行的格式,使其适用于各种内容类型。以下是一个示例:
#Q
...
(空行)
...
(空行)
...
#/Q
除此之外,范围卡片在其他方面的行为与块卡片类似。
在范围卡片的上下文中,模式仍然遵循其通常规则。值得注意的是,多行模式不包括完整的空行。然而,在范围卡片中,您可以创建多个多行模式,每个模式之间用空行分隔。在填空删除格式中,问题(即剩余的文本)跨越整个卡片。
这为使用范围卡片提供了一些最佳实践。
- 创建多个多行问题组:您可以利用范围卡片的格式创建多个多行模式。这些模式可以单独分组,并用空行分隔,为您提供了一种灵活的组织复杂信息的方式。
- 创建复杂问题与填空删除答案:如果您处理复杂的主题,可以创建一个全面的问题,然后使用填空删除格式(
==
)来封装答案。如果您的答案跨越多行,或者您需要将不同部分作为整体答案考虑,您可能需要使用#multicloze
标签将多个答案捆绑在一起。
请注意,如果您的答案过于复杂,涉及许多空行,您可能需要重新考虑问题的结构。极其复杂的答案可能不适合基于闪卡的复习。
模式
一个模式代表一个问题及其对应的答案。
:: 模式
在卡片中,使用 ::
符号来分割一行。前半部分将成为问题,后半部分将成为答案。
单词::定义
每一行将被处理为一个独立的模式。
单词::定义
单词::定义
单词::定义
您可以使用符号 :::
来创建可以从问题到答案和从答案到问题进行复习的卡片。
单词:::定义
? 模式
在卡片中,一行带有 ?
的线将内容分为问题和答案。前部分将成为问题,后部分将成为答案。
问题。
可能有很多行。
?
答案。
可能有很多行。
== 模式
在卡片中,一对 ==
之间的填空将会将该卡片分割。剩余部分将成为一个问题,而填空部分将成为一个答案。请注意,每个填空将被视为一个单独的模式。
一个 ==填空==。
水果包括 ==西瓜==、==苹果== 和 ==梨子==。
请注意,每个填空将被视为一个单独的模式。否则,您应该这样写。
水果包括 ==西瓜,苹果和梨子==。
此外,您可以在卡片上添加一个 #multicloze 标签以获得相同的效果。
多空模式
如果在卡片中找到了 #multicloze
标签,Aosr 将把卡片中的所有填空视为一组填空。
你应该同时记住==这个==和==那个==。#multicloze
示例
下面展示了几个示例。它们的写法在文档中是有效的。
#Q
word1::ans1
word2::ans2
word3::ans3
word:::definition
#Q
This is a question1.
?
This is an answer.
***
This is a question2.
?
This is an answer.
#Q
This is a very ==important== answer.
#Q
word1::ans1
***
This is a question.
?
This is an answer.
***
This is a very ==important== answer.
***
This is multi-cloze ==question== and ==answer==. #multicloze
#Q
Information
Complex card information
Complex card information
Complex card information
Answer:
==The answer.==
#/Q
评论
完成文档后,点击侧边栏中的卡片图标开始评论。

它由三个部分组成。新内容、评论和学习。
新内容表示尚未进行评论的新内容。
评论表示需要进行评论的内容。
巩固学习表示需要巩固一些概念。
一旦点击其中一个按钮,评论就开始了。请按照屏幕上的按钮和说明进行评论。
Aosr 在“Deck”功能中提供了一项独特的功能,允许用户以高度可定制的方式管理他们的闪卡。该功能旨在满足用户的多样化需求,提供了闪卡组织和复习方式的灵活性。
背景
用户在管理他们的闪卡时有不同的偏好。有些人可能更喜欢通过目录来组织他们的卡片,而其他人可能觉得通过标签来管理更方便。为了认识到这一点,Aosr 不会强制使用预设的卡组系统。相反,它赋予用户定义自己的规则来管理他们的卡组的权力。
Deck 的工作原理
Aosr 中的 Deck 功能利用了由“json-rules-engine”提供支持的基于规则的系统。这使用户可以根据自定义规则定义他们的 Deck 内容。这些规则可以自由定义,以定制 Deck 中的卡片的包含方式。
规则示例
以下是一些定义卡组规则的示例:
- 包含特定路径的卡牌: 将以下代码中的关键词替换为您想要的关键词。卡组将包含指定路径下的卡牌。
```aosr-deck-config
{
"rule": {
"conditions": {
"all": [{
"fact": "card",
"operator": "regexMatch",
"value": "关键词", <-- 替换为您自己的路径关键词
"path": "$.path"
}]
},
"event": {
"type": "match"
}
}
}
```
- 排除路径中包含特定关键词的卡牌: 您可以创建一个排除路径中包含特定关键词的卡牌的卡组。
```aosr-deck-config
{
"rule":{
"conditions":{
"not":
{
"fact":"card",
"operator":"regexMatch",
"value":"关键词", <-- 替换为您想要过滤的关键词
"path":"$.path"
}
},
"event":{
"type":"match"
}
}
}
```
- 过滤具有特定标签的卡牌: 您可以创建一个包含所有具有特定标签的卡牌的卡组。
```aosr-deck-config
{
"rule": {
"conditions": {
"all": [{
"fact": "card",
"operator": "contains",
"value": "#关键词", <-- 替换为您想要过滤的标签
"path": "$.tags"
}]
},
"event": {
"type": "match"
}
}
}
```
- 在 Frontmatter 中过滤具有特定标签的文件:
```aosr-deck-config
{
"rule": {
"conditions": {
"all": [{
"fact": "file",
"path": "$.tags",
"operator": "regexMatch",
"value": "数学"
}]
},
"event": {
"type": "match"
}
}
}
这些示例应该足够满足大多数使用情况。但是,如果您需要更复杂的规则,例如包含特定路径的卡牌,这些卡牌包含某些标签但不包含其他标签,您可能需要编写更复杂的规则。有关编写规则的更多信息,请参阅 json-rules-engine 文档。此外,您可能需要参考以下模式的事实:
interface FactPattern {
card: {
path: string
tags: string[]
text: string
}
file: {
tags: string[] // 来自 frontmatter
}
}
在你的笔记中使用 Aosr 的 Deck 功能,你可以直接编写自己的 Deck 规则。这样可以让你只在笔记中复习选定的卡片,提供个性化的复习体验。
要使用这些示例,只需将代码复制粘贴到你的 Obsidian 笔记中。如果你已经安装了 Aosr 插件,它会自动识别 aosr-deck-config
代码块,并将其转换为可供复习的 Deck。
如果代码块没有自动转换为复习卡片,请确保你的光标不在代码块内。另外,如果出现任何错误提示,请检查规则是否符合正确的 JSON 格式。任何格式错误都会阻止正确转换为复习界面。一旦正确转换,你应该会看到一个类似于在侧边栏点击按钮时生成的界面。这个界面还将包含你需要的复习内容。
注释
请注意文档中生成的注释的存在。这是正常的情况,对于插件的功能而言是必不可少的,因为它需要这些数据来计算审阅时间。
我承认这些注释的外观可能不太美观,可能会破坏文档的格式。然而,目前这种安排足以满足我的日常使用。未来我可能会找到解决这个问题的方法。
这些注释将自动附加到文档的末尾。此外,如果需要,它们的位置可以在同一文档中进行调整。
使用 Dataview 插件
通过安装 Dataview 插件,您可以查看有关您的审查进度的信息。
您可以使用代码 let patterns = await app.plugins.plugins.aosr.api.getAllPattern();
获取完整的审查数据。然后,您可以编写 Dataview 代码来显示数据。下面是一个供您复制和运行的示例。
请注意,您需要在 Dataview 中启用相应的选项才能使用 dataviewjs
!
```dataviewjs
let patterns = await app.plugins.plugins.aosr.api.getAllPattern();
let today = new Date();
today.setHours(0, 0, 0, 0);
let futureLimit = new Date();
futureLimit.setDate(today.getDate() + 15); // 将未来限制设置为从今天起的15天。
let reviewCountsByDate = {};
patterns.forEach(pattern => {
let nextReviewDate = new Date(pattern.schedule.Next);
if (nextReviewDate < today) {
nextReviewDate = today;
}
if (nextReviewDate <= futureLimit) {
nextReviewDate.setHours(0, 0, 0, 0);
let dateStr = nextReviewDate.toISOString().split('T')[0];
if (!reviewCountsByDate[dateStr]) {
reviewCountsByDate[dateStr] = 0;
}
reviewCountsByDate[dateStr]++;
}
});
let tableData = Object.entries(reviewCountsByDate)
.map(([date, count]) => [date, count])
.sort((a, b) => new Date(a[0]) - new Date(b[0])); // 按日期排序
dv.header(3, "总审查数量");
dv.table(["数量"], [[patterns.length]])
dv.header(3, "未来所需每日审查数量");
dv.table(["日期", "审查数量"], tableData);
let difficultPatterns = patterns
.map(pattern => [pattern.TagID.substring(1), pattern.schedule.Ease])
.sort((a, b) => a[1] - b[1]) // 按Ease排序
.slice(0, 10); // 只取前10个
dv.header(3, "在审查方面最困难的内容")
dv.table(["TagID", "Ease"], difficultPatterns);
```
双冒号 (::) 审查格式与 Dataview 的元数据格式之间存在冲突。可能需要引入一种新的格式来替代双冒号审查格式。
什么是不同之处?
Aosr 和 obsidian-spaced-repetition 之间有什么区别?
- 复习时间以分钟为单位计算,而不是以天为单位。这有助于更准确地计算复习时间。而且,在跨越一天的零点进行复习时,计算也会更准确。例如,在晚上 23:59 和 00:01,复习时间不会粗暴地计算为前一天和后一天。
- 复习界面现在将打开一个标准页面,而不是一个弹出窗口。在标准页面下,您可以同时进行许多 obsidian 活动,例如,您可以同时复习和评论文档。在弹出模式下,此模式会阻碍进一步操作。
- 优化了复习过程。现在添加了一个学习过程,用于学习上次标记为遗忘的项目。
- 重新设计了格式。新的格式对一些细微的更改有所贡献。例如,填空不再会因为添加新的填空而被打乱。此外,新的复习格式也应该更容易开发和扩展。
然而,一些核心功能,如查看复习数据统计,目前还不可用。我会根据我的空闲时间来改进这个功能。
注意事项
- 请不要在同一文件中创建相同模式的相同内容,因为当前的实现依赖于唯一字符串匹配,创建重复模式将导致异常并阻止审核。
- 目前,开发和测试仅在关闭“严格换行符”模式下进行。尚未测试开启该模式,因此建议关闭该模式。
许可证
react (MIT) https://github.com/facebook/react
YAML (ISC) https://github.com/eemeli/yaml
MUI (MIT) https://github.com/mui/material-ui
反馈交流
其他渠道
版权声明
版权声明:所有 PKMer 文章如果需要转载,请附上原文出处链接。