最近新写了个在 Emacs 中制卡的包,个人觉得挺好用的,和大家分享一下。
仓库地址:GitHub - Elilif/emacs-anki-helper: Manage your Anki cards in Emacs.
Features (具体内容详见 为什么用 anki-helper )
- 同步速度快
以 以仓库中的 headings.org 为例, org-anki 和 anki-helper 同步和删除所有卡片( 422张)的时间对比如下:
| | (benchmark 1 '(xxx-sync-all)) | (benchmark 1 '(xxx-delete-all)) |
|-------------+-----------------------------------+-----------------------------------|
| org-anki | 123.855104s (35.423518s in 5 GCs) | 150.862886s (21.709634s in 8 GCs) |
| anki-helper | 0.410945s | 0.098308s |
- 制卡灵活
anki-helper 可以自定义获取卡片对应字段内容的函数,而不仅仅局限于 entry ,理论上支持任何形式的文本和任何自定义的卡片类型。
- 支持多媒体内容
anki-helper 会自动将链接形式的媒体文件复制到 Anki 的媒体目录下
- 不会破坏原始内容
对于 Cloze 类型的卡片来说,常规的做法是使用 {{cn:xxx}} 这种形式,但是这会破坏原有内容,不利于其他操作。这其实是一种变相的专有化。
Anki-helper 使用 org-mode 内置的富文本标记来作为完形填空的标志,假设有以下文本:
*Canberra* was founded in *1913*.
在制卡的过程中,它会变成如下格式:
{{c1::Canberra}} was founded in {{c2::1913}}.
我认为这样是符合直觉的,因为你强调的部分往往是你想要记住的部分。
- misc
Anki-helper 提供一些有用的函数和 API 来帮助您自定义制卡
5.1 交互式制卡
5.2 双向跳转
20 个赞
在 reddit 上看到了一个inine-anki ,我也分享一下我的方案:
为了尽可能的不修改原文,我选择用 text proerties 来储存 inline notes 的信息,用 overlay 来分隔 inline notes ,在关闭文件的时候保存这些信息,打开文件的时候再恢复。
在下面的 GIF 中分别演示了四种操作:
- 创建新的 inline notes
- 重新打开文件后的恢复 inline notes 的显示
- 更新 inlines notes
- 删除 inline notes
2 个赞
我有个需求,就是只希望导出 properties 中有 ID 的 entry 到 Anki。
*** 1
:PROPERTIES:
:NOTER_PAGE: (24 0.2508670520231214 . 0.1464646464646465)
:ID: 5FFB1B29-66D5-4294-887F-F6D4E222D401
:END:
...
** 2
:PROPERTIES:
:NOTER_PAGE: (24 0.4832369942196532 . 0.17003367003367004)
:END:
...
我只想导出 1,不要 2.
包的源码我看了一圈,不知道从哪里 hack。
可以自定义 anki-helper-skip-function
,比如说您的需求,可以这样实现:
(defun my/anki-helper-skip ()
"Skip headlines without \"ID\" property."
(unless (org-entry-get nil "ID")
(point)))
(setq anki-helper-skip-function #'my/anki-helper-skip)
1 个赞
你好,请下下这个有办法支持多行 front 吗, 比如记一些题目的时候,题干会有多行,也可能会有图片
@VagrantJoker 我有个想法,想问问有没有可能借助anki-helper实现
想法是这样的,目前的anki-helper-entry-sync很好,只是对于经常用org-noter阅读pdf,然后做笔记导出的orgmode内容来说不是非常方便。
org-noter导出的orgmode有个特点就是heading级数一般很长,如果每一级的卡片背面把body text和subheading下所有内容都放入,就不大合适。
如果卡片背面能包括body text,再加上所有下一级的subheading的heading内容就比较合适。subheading如果有多个的话,可以统一转成list形式。
每个org-noter导出的orgmode可以遍历生成一套完整的卡片。
我自己还没有学会elisp, 也试图让chatgpt帮忙,不大如意,请问能不能讲解一下如何结合现有的anki-helper函数达到目的?
不甚感激
这个太易用了, 我啥都没干, 就装了 AnkiConnect, 就同步成功了.
可以, 自己写解析函数, 文档给了例子, 看看 anki-helper-make-two-sided-card 的实现就知道了. 这种情况可能用 anki-editor 更方便.
yuequ
11
先感谢大佬的包
幸好我现在才入 anki 的坑
早入的话我大概就迷失在 org-anki
或是 anki-editor
里了
目前的一个烦恼是:如何增加其他 field 的内容
我去看了下 anki-editor 的实现逻辑
anki-editor-prop-field-prefix
这方式不错,但有些笔记不想放在 properties 里
- subheading 作为 field
field 对我来说是重要信息,占用标题的方式我不太喜欢
不知道有没有什么其他的实现方式能分享的?谢谢
anki-editor 就可以做到, 为啥不直接用 anki-editor?
yuequ
13
我的意思是我不喜欢 anki-editor
对于 field 的笔记逻辑
(当然,放在 properties 里的方式,只有当笔记内容是 link 或是 source 这一类仅作为附加信息的时候可以接受)
当 field 的内容也是笔记/新的/感想的时候,有没有其他实现的逻辑?