#!/bin/sh # anki-cli - dmenu-integrated Anki flashcard manager # Usage: anki-cli [add|list|review|decks|info|tags|-h] # Default (no args): dmenu action picker cmd_add() { # Pick deck deck=$(apy info 2>/dev/null | awk '/^[A-Za-z]/ && !/^(Model|Sum|Sched|Coll|Conf|─)/{print $1}' | head -1) decks=$(apy list-cards "deck:*" 2>/dev/null | awk '{print $1}' | sort -u) if [ -n "$decks" ]; then deck=$(printf '%s\nNew deck...' "$decks" | dmenu -i -l 20 -p "Deck:" || exit 0) else deck=$(printf 'Default\nNew deck...' | dmenu -i -l 20 -p "Deck:" || exit 0) fi [ -z "$deck" ] && exit 0 if [ "$deck" = "New deck..." ]; then deck=$(printf '' | dmenu -l 1 -p "Deck name:" || exit 0) [ -z "$deck" ] && exit 0 fi # Pick model model=$(apy list-models 2>/dev/null | dmenu -i -l 10 -p "Model:" || exit 0) [ -z "$model" ] && exit 0 # Get front front=$(printf '' | dmenu -c -l 1 -h 40 -p "Front:" || exit 0) [ -z "$front" ] && exit 0 # Get back back=$(printf '' | dmenu -c -l 1 -h 40 -p "Back:" || exit 0) [ -z "$back" ] && exit 0 # Optional tags tags=$(printf '' | dmenu -l 1 -p "Tags (space-separated):" || true) if [ -n "$tags" ]; then apy add-single -d "$deck" -m "$model" -t "$tags" "$front" "$back" 2>&1 else apy add-single -d "$deck" -m "$model" "$front" "$back" 2>&1 fi notify-send "Card added" "$front → $deck" } cmd_quick() { # Quick add: front and back only, defaults for everything else front=$(printf '' | dmenu -c -l 1 -h 40 -p "Front:" || exit 0) [ -z "$front" ] && exit 0 back=$(printf '' | dmenu -c -l 1 -h 40 -p "Back:" || exit 0) [ -z "$back" ] && exit 0 apy add-single "$front" "$back" 2>&1 notify-send "Card added" "$front" } cmd_list() { apy list-cards-table "${1:-*}" 2>&1 } cmd_review() { apy review "${1:-is:due}" 2>&1 } cmd_decks() { apy info 2>&1 } cmd_tags() { apy tag 2>&1 } cmd_dmenu() { action=$(printf 'Quick add\nAdd (full)\nReview due\nList cards\nDecks & info\nTags' | dmenu -i -l 10 -p "Anki:" || exit 0) [ -z "$action" ] && exit 0 case "$action" in "Quick add") cmd_quick ;; "Add (full)") cmd_add ;; "Review due") cmd_review ;; "List cards") cmd_list ;; "Decks & info") cmd_decks ;; "Tags") cmd_tags ;; esac } case "$1" in add) cmd_add ;; quick) cmd_quick ;; list) shift; cmd_list "$@" ;; review) shift; cmd_review "$@" ;; decks) cmd_decks ;; info) apy info ;; tags) cmd_tags ;; -h|help) printf 'anki-cli dmenu action picker\n' printf 'anki-cli quick Quick add (front/back only)\n' printf 'anki-cli add Add card (deck/model/tags)\n' printf 'anki-cli list [Q] List cards (optional query)\n' printf 'anki-cli review Review due cards in terminal\n' printf 'anki-cli decks Show decks and stats\n' printf 'anki-cli tags List all tags\n' printf 'anki-cli info Collection info\n' ;; "") cmd_dmenu ;; *) printf 'Unknown command: %s (try anki-cli -h)\n' "$1" ;; esac