jeffalstott / anki-editor

Emacs minor mode for making Anki cards with Org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

http://melpa.org/packages/anki-editor-badge.svg

anki-editor – An Emacs minor mode for making Anki cards with Org

Since I’m not a native English speaker, feel free to correct me if there are any ambiguity or grammatical mistakes ;-)

Installation

Requirements

  • AnkiConnect, an Anki add-on required by this package to interact with Anki
  • curl

If you have MELPA in your package-archives, just M-x package-install RET anki-editor RET, or install it manually by downloading and visiting anki-editor.el in your emacs buffer, and M-x package-install-from-buffer RET.

Usage

The Layout of Notes

The power of this mode comes from the builtin HTML export backend provided by Org, which enables you to use almost all the Org constructs for writing Anki notes: lists, code blocks, tables, latex and so on.

The structure of a note is as follows, which is inspired by org-drill. Check out examples.org for more examples.

* Raining                                                      :vocab:idioms:
  :PROPERTIES:
  :ANKI_DECK: English
  :ANKI_NOTE_TYPE: Basic (and reversed card)
  :ANKI_TAGS: vocab idioms
  :END:
** Front
   (it's) raining cats and dogs
** Back
   it's raining very hard
  • Anki deck is provided by ANKI_DECK property. This property is retrieved with inheritance, that is to say, it can be put in any ancestor entries or at top of the file by #+PROPERTY: ANKI_DECK DeckName.
  • ANKI_NOTE_TYPE property is to specify the Anki note type of a note and is also required for identifying an Anki note entry.
  • Anki tags can be provided in two ways:
    1. With a ANKI_TAGS property, multiple tags are separated by spaces
    2. With Org tags [fn:1], this could be turned off if you would like to keep Org tags separated from Anki tags
  • Child entries of a note entry are fields.

Typing all these information by hand could be inefficient and prone to errors, so this package provides an interactive command anki-editor-insert-note to help with this and hooks up auto-completions for decks, note types and tags etc.

Commands

CommandDescription
anki-editor-modeToggle this minor mode.
anki-editor-push-notesPush notes to Anki. Additional arguments can be used to restrict the range of notes.
anki-editor-push-new-notesSimilar to anki-editor-push-notes, but push those that are without ANKI_NOTE_ID.
anki-editor-retry-failed-notesSimilar to anki-editor-push-notes, except that it only pushes notes with ANKI_FAILURE_REASON.
anki-editor-insert-noteInsert a note entry like M-RET, interactively. When note heading is not provided or is blank, it’s used as the first field.
anki-editor-delete-notesDelete notes or the note at point.
anki-editor-cloze-dwimCloze current active region or a word the under the cursor.
anki-editor-export-subtree-to-htmlExport the subtree at point to HTML.
anki-editor-convert-region-to-htmlConvert and replace region to HTML.
anki-editor-api-checkCheck if correct version of AnkiConnect is running.
anki-editor-sync-collectionsSynchronize your local anki collection.
anki-editor-gui-browseOpen Anki Browser with a query for current note or deck.
anki-editor-gui-add-cardsOpen Anki Add Cards dialog with presets from current note entry.

Variables

NameDefault ValueDescription
anki-editor-api-host“127.0.0.1”The network address AnkiConnect is listening.
anki-editor-api-port“8765”The port number AnkiConnect is listening.
anki-editor-break-consecutive-braces-in-latexnilIf non-nil, consecutive “}” will be automatically separated by spaces to prevent early-closing of cloze.
anki-editor-ignored-org-tags’(“export” “noexport”)A list of Org tags that are ignored when constructing notes form entries.
anki-editor-org-tags-as-anki-tagstIf nil, tags of entries wont’t be counted as Anki tags.
anki-editor-protected-tags’(“marked” “leech”)A list of tags that won’t be deleted from Anki even though they’re absent in Org entries.
anki-editor-latex-stylebuiltinThe style of latex to translate into.
anki-editor-include-default-styletWheter or not to include `org-html-style-default’ when using `anki-editor-copy-styles’.
anki-editor-html-headnilAdditional html tags to append to card stylings when using `anki-editor-copy-styles’.
anki-editor-note-matchnilAdditional matching string for mapping through anki note headings.

Functions and Macros

anki-editor-map-note-entries

Simple wrapper that calls org-map-entries with ~&ANKI_NOTE_TYPE<>""~ appended to MATCH.

anki-editor-api-call

Invoke AnkiConnect with ACTION and PARAMS.

anki-editor-api-call-result

Calls above, returns result field or raise an error.

anki-editor-api-with-multi

Used in combination with anki-editor-api-enqueue to queue multiple api calls and combine them into one ‘multi’ call at the end, return the results of these calls in the same order.

Usage:

(cl-destructuring-bind (decks models tags notes)
    (anki-editor-api-with-multi
     ;; The following api calls will be combined into one 'multi' call.
     (anki-editor-api-enqueue 'deckNames)
     (anki-editor-api-enqueue 'modelNames)
     (anki-editor-api-enqueue 'getTags)
     (anki-editor-api-enqueue 'findNotes :query "deck:Default"))
  (message (concat "decks: %S\n"
                   "models: %S\n"
                   "tags: %S\n"
                   "notes: %S")
           decks models tags notes))

anki-editor-api-enqueue

Like anki-editor-api-call, but is only used in combination with anki-editor-api-with-multi. Instead of sending the request directly, it simply queues the request.

anki-editor-note-at-point

Make a note struct from current entry.

anki-editor-find-notes

Find notes with QUERY.

anki-editor-copy-styles

Copy `org-html-style-default’ and `anki-editor-html-head’ to Anki card stylings.

anki-editor-remove-styles

Remove from card stylings html tags generated by this mode.

Limitations

Tags between Anki and Org

Because the set of characters allowed in tags is different between Anki and Org, you have to make sure that tags from Anki are compatible with Org and tags in Org could be recognized by Anki.

Working with Anki add-ons

This package might not work well with certain Anki add-ons especially those who extend the builtin Anki note editor to automatically fill note field content (e.g. Add note id).

Demo

./demo.gif

Donation

This package was a set of utilities in my personal .emacs, then I thought it might be helpful to others, so I decided to make it a package and share with you guys. Since then I have been devoting part of my free time to the maintenance of this package.

Donation is not required, but if you like my work and want to show your appreciation you can donate via PayPal, every cent is appreciated, thanks for your support :)

[fn:1] It should be noted that Org only allows letters, numbers, _ and @ in a tag but Anki allows more, so you may have to edit you Anki tags before they can be used in Org without any surprise.

About

Emacs minor mode for making Anki cards with Org


Languages

Language:Emacs Lisp 100.0%