关于 anki
Anki Flashcard Management 是通过 `anki.sh` 脚本和 AnkiConnect 创建及管理 Anki 闪卡的技能,提供卡片格式指导,并要求添加卡片或执行敏感更改前获得用户确认。
主要功能
- 01通过 AnkiConnect 创建和管理卡片
- 02基础卡片与填空卡片的使用指导
- 03Markdown、数学和代码格式规则
- 04添加或修改卡片前确认
适用场景
- 01编写单一明确问答的卡片
- 02创建含提示或数学内容的填空卡片
- 03添加前审阅拟创建的卡片
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ terkelg/ anki-markdown --skill anki安装后在 Claude Code 中输入/anki确认已加载。
附带文件scripts/anki.sh
详细介绍
Anki 闪卡管理
使用 anki.sh 脚本,通过 AnkiConnect 创建和管理闪卡。
ANKI="$(dirname "$SKILL_PATH")/scripts/anki.sh"
准备工作:
- 确保 Anki 桌面版正在运行,并已启用 AnkiConnect
- 确保
curl和jq已添加到 PATH
重要:必须获得用户批准
未经用户明确批准,绝不能向 Anki 添加卡片。
添加任何卡片之前:
- 完整展示所有拟添加的卡片(正面 + 背面)
- 询问用户是否确认:“准备好添加这些卡片了吗?”
- 只有在用户明确回答“是”或批准后,才能继续
这是不可妥协的要求。用户必须先检查卡片质量,再添加卡片。
对于可能具有破坏性或不可逆的操作:
delete:删除笔记前,先征求用户明确确认update:更新笔记前,确认具体字段和 IDrate:显示卡片和建议的评分,然后等待用户确认再提交
指南
- 必须为基础卡片使用
Anki Markdown笔记类型,为填空卡片使用Anki Markdown Cloze - 正面和背面字段都使用 Markdown
- 每张卡片只测试一项事实或一个想法
- 问题应具体且简单
- 问题和答案应简短、清晰、明确
- 确保每张卡片只有一个独特且具体的答案
- 避免在一张卡片中列出长列表或多个条目
- 添加上下文或提示,帮助未来的自己理解
- 如有帮助,可加入个性化示例或记忆口诀
- 对重要概念,可以创建多张简单卡片
- 从不同角度为重要问题创建多个变体
- 将卡片与个人目标和项目关联,避免事实成为“孤立”信息
- 始终为代码使用语法高亮(参见“代码片段”部分)
- 创建多张相关卡片时,使用批量操作以提高效率
选择卡片类型
对于需要写出具体问题的问答卡片,使用 Anki Markdown(正面/背面)。 对于填空卡片,如果隐藏陈述中的部分内容比编写问题更自然,则使用 Anki Markdown Cloze(文本/补充)。
数学
使用 Anki 原生分隔符:行内数学使用 \(x^2\),独立成行的数学公式使用 \[x^2\]。审核器使用 Anki 内置的 MathJax;不要添加外部脚本或字体。不支持美元符号分隔符。对于字面上的 TeX 示例,请使用代码格式。
挖空内容可以包含公式({{c1::\(x^2\)}}),也可以出现在公式内部(\(x + {{c1::y}}\))。在数学公式内部,隐藏的挖空内容会显示为 [...] 或带方括号的 TeX 提示。显示答案时不会应用挖空样式,::blur 会使用 [...]。若要模糊整个公式,请将挖空放在数学分隔符之外:{{c1::\(x^2\)::blur}}。
隐藏内容后,剩余的 TeX 仍须有效。在 \begin{aligned} 之后添加 {},以防提示被解析为可选参数。
相邻的 TeX 右花括号之间要加空格;如果挖空内容以 } 结尾,则在挖空闭合符 }} 前加空格。例如:\(x + {{c1::\frac{1}{\sqrt{2} } }}\)。这样可以让 Anki 正确识别挖空边界;TeX 会忽略这些空格。
挖空卡片
填空卡片使用 Anki Markdown Cloze。字段为 Text 和 Extra。
语法
三种形式:
{{c1::answer}}- 正面显示 [...]{{c1::answer::hint}}- 正面显示 [hint]{{c1::answer::blur}}- 正面显示模糊内容(显示形状,但不显示文本)
挖空内容中支持完整的 Markdown:粗体、斜体、高亮、带语言标签的行内代码、链接、图片、代码块和表格。
多张卡片
每个挖空编号(c1、c2、c3……)都会生成一张单独的卡片。使用不同编号,从同一条笔记中测试不同事实:
{"Text": "{{c1::HTML}} provides structure, {{c2::CSS}} provides style."}
这会生成 2 张卡片。卡片 1 隐藏“HTML”,卡片 2 隐藏“CSS”。
多次使用相同编号会在同一张卡片上隐藏所有对应内容:
{"Text": "{{c1::React}} and {{c1::Vue}} are frontend frameworks."}
这会生成 1 张卡片,同时隐藏“React”和“Vue”。
共享删除
逗号分隔的填空编号仅适用于 Anki 桌面版 26.05 或更高版本。它们会在多张卡片上隐藏相同的文本:
{ "Text": "The {{c1::CPU}} and {{c2::GPU}} both execute {{c1,2::instructions}}." }
此笔记会生成两张卡片。卡片 1 会隐藏“CPU”和“instructions”。卡片 2 会隐藏“GPU”和“instructions”。
嵌套填空
填空删除可以嵌套。外层填空会隐藏所有内容,包括内层填空:
{"Text": "{{c1::Canberra was {{c2::founded}}}} in 1913."}
卡片 1 会隐藏“Canberra was founded”。卡片 2 只会隐藏“founded”。
填空中的行内代码
带有语言标签的行内代码可以在填空中使用。请注意,当代码使用 {lang} 语法时,需要使用三个右花括号(}}}):
{"Text": "Use {{c1::`querySelector()`{js}}} to find DOM elements."}
Extra 字段
每张卡片的背面都会显示 Extra 字段。可用它提供背景信息、示例或参考资料。该字段支持完整的 Markdown,包括代码块和提示框。
填空示例
# Basic cloze
$ANKI add "MyDeck" "Anki Markdown Cloze" '{"Text":"The {{c1::CPU}} executes {{c2::instructions}}.","Extra":"Basic computer architecture."}' --tags "cs"
# Cloze with hint
$ANKI add "MyDeck" "Anki Markdown Cloze" '{"Text":"{{c1::JavaScript::language}} was created in {{c2::1995::year}}.","Extra":"Created by Brendan Eich."}' --tags "history"
# Cloze with blur
$ANKI add "MyDeck" "Anki Markdown Cloze" '{"Text":"The speed of light is {{c1::299,792,458 m/s::blur}}.","Extra":"Often approximated as 3 x 10^8 m/s."}' --tags "physics"
Front 字段格式
在正面使用 Markdown,突出问题涉及的关键术语:
- 使用 粗体 或
==highlight==标出要考查的主要概念 - 使用行内代码标记技术术语、函数或语法
示例:What does **vertex_index** return in WGSL?
Back 字段格式
Back 字段使用以下格式:
- 用一句粗体文字直接回答
- 空行
- 补充背景信息,使用常规文本(可选)
便于快速浏览的格式
- 使用
==highlighted==让关键术语一目了然 - 使用 粗体突出说明中的关键概念
- 为所有代码块(包括行内代码)启用语法高亮
- 优化格式以便快速浏览,让读者能立即掌握核心要点
键盘快捷键
使用 <kbd> 标签标记键盘按键:
Press <kbd>Cmd</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> to open the command palette.
代码片段
始终使用语法高亮:
- 围栏代码块:使用三个反引号并指定语言(
js、python、```rust 等) - 行内代码:使用
`code`{lang}语法(例如,`const x = 1`{js})
高级功能:
- 行高亮:使用 ```js {2} 高亮第 2 行
- 单词高亮:使用 ```js /pattern/ 高亮指定单词
- 专注模式:添加
// [!code focus]注释以聚焦指定行
提示框
重要说明可酌情使用 GitHub 样式的提醒:
> [!TIP]
> Brief helpful insight here.
> [!NOTE]
> Useful context the learner should know.
> [!WARNING]
> Common mistake or gotcha to avoid.
示例
Front: What does `passEncoder.draw(3)`{js} do with **no vertex buffer**?
Back:
**Invokes the ==vertex shader== 3 times.**
The shader uses `@builtin(vertex_index)`{wgsl} to generate positions ==procedurally==.
> [!TIP]
> Useful for fullscreen quads without geometry data.
常见操作
通过 $ANKI <action> [args...] 运行:
| 操作 | 描述 | 示例 |
|---|---|---|
sync | 触发 AnkiWeb 同步 | $ANKI sync |
decks | 列出牌组 | $ANKI decks --stats |
models | 列出笔记类型 | $ANKI models |
fields | 查看模型的字段 | $ANKI fields "Anki Markdown" |
find | 搜索笔记 | $ANKI find "deck:Spanish tag:verb" |
info | 查看笔记详情 | $ANKI info 1234 5678 |
add | 添加一条笔记 | $ANKI add "My Deck" "Anki Markdown" '{"Front":"Q","Back":"A"}' --tags "t1 t2" |
add-bulk | 添加多条笔记 | $ANKI add-bulk "My Deck" "Anki Markdown" '[{"Front":"Q1","Back":"A1"}]' |
update | 更新字段 | $ANKI update 1234 '{"Front":"New Q"}' |
delete | 删除笔记 | $ANKI delete 1234 5678 |
due | 获取到期卡片 | $ANKI due "My Deck" --limit 5 |
review | 显示卡片 | $ANKI review 1234 |
rate | 为卡片评分(1-4) | $ANKI rate 1234 3 |
tags | 列出标签 | $ANKI tags --pattern "verb" |
典型工作流
$ANKI sync # sync first
$ANKI decks # check available decks
$ANKI models # verify required model exists
$ANKI fields "Anki Markdown" # verify field names for selected model
$ANKI find "deck:MyDeck front:test" # check for duplicates
$ANKI add "MyDeck" "Anki Markdown" '{"Front":"...","Back":"..."}'
$ANKI sync # sync after changes