anki-helper: 快速、灵活的 Anki 制卡插件

最近新写了个在 Emacs 中制卡的包,个人觉得挺好用的,和大家分享一下。

仓库地址:GitHub - Elilif/emacs-anki-helper: Manage your Anki cards in Emacs.

Features (具体内容详见 为什么用 anki-helper

  1. 同步速度快

以仓库中的 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                         |
  1. 制卡灵活

anki-helper 可以自定义获取卡片对应字段内容的函数,而不仅仅局限于 entry ,理论上支持任何形式的文本和任何自定义的卡片类型。

  1. 支持多媒体内容

anki-helper 会自动将链接形式的媒体文件复制到 Anki 的媒体目录下

  1. 不会破坏原始内容

对于 Cloze 类型的卡片来说,常规的做法是使用 {{cn:xxx}} 这种形式,但是这会破坏原有内容,不利于其他操作。这其实是一种变相的专有化。

Anki-helper 使用 org-mode 内置的富文本标记来作为完形填空的标志,假设有以下文本:

*Canberra* was founded in *1913*.

在制卡的过程中,它会变成如下格式:

{{c1::Canberra}} was founded in {{c2::1913}}.

我认为这样是符合直觉的,因为你强调的部分往往是你想要记住的部分。

  1. misc

Anki-helper 提供一些有用的函数和 API 来帮助您自定义制卡

5.1 交互式制卡

Peek 2023-09-11 08-10

5.2 双向跳转

notes-with-backlink

20 个赞

改天试试看。

在 reddit 上看到了一个inine-anki ,我也分享一下我的方案:

为了尽可能的不修改原文,我选择用 text proerties 来储存 inline notes 的信息,用 overlay 来分隔 inline notes ,在关闭文件的时候保存这些信息,打开文件的时候再恢复。

在下面的 GIF 中分别演示了四种操作:

  1. 创建新的 inline notes
  2. 重新打开文件后的恢复 inline notes 的显示
  3. 更新 inlines notes
  4. 删除 inline notes

Peek 2023-10-24 22-02

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 更方便.

先感谢大佬的包
幸好我现在才入 anki 的坑
早入的话我大概就迷失在 org-anki 或是 anki-editor 里了

目前的一个烦恼是:如何增加其他 field 的内容
我去看了下 anki-editor 的实现逻辑

  • anki-editor-prop-field-prefix
    这方式不错,但有些笔记不想放在 properties 里
  • subheading 作为 field
    field 对我来说是重要信息,占用标题的方式我不太喜欢

不知道有没有什么其他的实现方式能分享的?谢谢

anki-editor 就可以做到, 为啥不直接用 anki-editor?

我的意思是我不喜欢 anki-editor 对于 field 的笔记逻辑
(当然,放在 properties 里的方式,只有当笔记内容是 link 或是 source 这一类仅作为附加信息的时候可以接受)

当 field 的内容也是笔记/新的/感想的时候,有没有其他实现的逻辑?