| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
org-drill was 137 lines mixing five distinct concerns: an org-version
warning (now dead under the org>=9.6 floor), session reset, entry
collection, drill execution, and post-session messaging.
Extracted four helpers, each with a single responsibility:
- org-drill--prepare-fresh-session: zero out queues + counters
- org-drill--collect-entries: scan + sort overdue
- org-drill--queues-empty-p: predicate for the no-pending branch
- org-drill--show-end-message: dispatch resume-hint vs final-report
Plus org-drill--show-resume-hint for the keystr-aware suspended
message. Removed the dead org<7.9.3f warning block (the org>=9.6
floor makes it unreachable).
org-drill itself drops from 137 lines to 36 and the cl-block
wrapper goes away — the cl-return-from inside org-drill-entries
returns through the normal control flow now.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
org-drill-final-report was 95 lines, dominated by two big format
calls (the main summary and the low-pass-rate WARNING) plus an
inlined queue-tag pattern that propertized 5 different counts in
the same shape.
Extracted three helpers:
- org-drill--queue-tag: builds a propertized 'N label' string for
one queue (failed / overdue / new / young / old). Replaces 5
inlined propertize calls.
- org-drill--build-final-report-summary: takes the session, and
returns the formatted main summary string.
- org-drill--build-low-pass-warning: takes the session and pass-
percent, returns the formatted warning string.
org-drill-final-report becomes a 12-line orchestrator that wires
the helpers together with the wait-and-read loop.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The main loop body reached 7 levels of indentation in the success
path: while > destructuring-bind > save-excursion > cond > t-clause
> let > cond > inner-cond.
Extracted two helpers:
- org-drill--pick-next-marker: chooses between resuming the
current-item slot and popping a fresh marker, returning a (marker
. next-resuming-p) cons so the caller updates resuming-p in
lock-step.
- org-drill--route-rating-result: routes the rating result into
the session's again/done queues and returns a symbol (quit/edit/
skip/next) telling the caller whether to break the loop.
org-drill-entries shrinks from 54 lines to 19, and the deepest
nesting drops from 7 levels to 4.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
leitner-rebox
The two interactive rating loops (reschedule and leitner-rebox)
shared roughly 60 lines of identical code: the same key-prompt
string, the same memq-based exit-on-rating loop, the same arrow/
scroll/wheel cond, the same tags-key dispatch, and the same help-key
toggle. Only two things differ — the rating-explanation help text
and the per-rating action that follows — and the comment in
leitner-rebox literally said "All this is shared with drill-
reschedule. And what does it do?"
Extracted org-drill--read-rating-key with two args: typed-answer
(for the typed-answer flow's 'Your answer: ...' line) and
rating-help-block (the multi-line ratings explanation specific to
the scheduler).
Both call sites collapse from ~50 lines of inlined loop to a single
call. reschedule and leitner-rebox now consist of just the rating-
specific actions plus this read-key call.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Five presenters opened with the same three-deep wrap:
(org-drill-with-hidden-comments
(org-drill-with-hidden-cloze-hints
(org-drill-with-hidden-cloze-text
...body...)))
Combined into org-drill-with-card-display. Five sites
(present-simple-card, present-simple-card-with-typed-answer,
present-two-sided-card, present-multi-sided-card,
present-spanish-verb) lose 2-3 lines of nesting each.
Multicloze-hide-n / hide-nth use a different envelope (only two of
the three wraps; they hide specific clozes by index, not all of
them) so they keep their explicit nesting. Same for
present-card-using-text, which substitutes with-replaced-entry-text
for with-hidden-cloze-text.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The check (<= quality org-drill-failure-quality) appeared in five
places: SM2/SM5/Simple8 schedulers, smart-reschedule, and the
main org-drill-entries loop body. Each call site does different
things on failure (reset interval, push to again-entries, etc.) so
only the predicate was duplicated.
Extracted as org-drill--quality-failed-p with a docstring naming
the threshold and the role. Five inlined comparisons collapse to
five named predicate calls.
|
| |
|
|
|
|
|
|
|
|
|
| |
The seven-line propertize+concat block that prepends a red leech
warning to the prompt was inlined in three prompt builders:
presentation-prompt-in-mini-buffer, presentation-prompt-in-buffer,
and presentation-prompt-for-string.
Extracted org-drill--maybe-prepend-leech-warning as a single helper
the three call. 21 lines duplicated → one definition + three
one-line call sites.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Four dead-code blocks deleted, all of them commented-out
alternative implementations next to the live versions:
- 5-line commented (and (>= quality 4) ...) cond branch in the
SM5 scheduler
- 6-line commented (loop do (re-search-forward ...)) alternative
in present-multicloze-hide-n
- 4-line commented unless-error guards at the top of entry-f
- 3-line commented (:tomorrow ...) case branch in
map-entry-function
Prose commentary kept (license, package overview, recent-fix
explanations). Pure deletion, no behavior change.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
org-drill-present-spanish-verb had a 6-branch cl-case where each
branch differed only in two values: which subheading to reveal
(Infinitive or English) and which prompt string to show. Inlined
into a 50-line block of nearly-identical setq calls.
Extracted the (reveal . prompt) pairs into a defconst alist and
reduced the dispatcher to a random-pick + apply-pair pattern.
Function drops from 51 lines to 14. Existing branch tests still
pass — they mock cl-random to a specific index, and the alist's
order matches the previous case order.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The quality-percentage formula
(round (* 100 (cl-count Q qualities)) (max 1 (length qualities)))
appeared six times in org-drill-final-report (once per recall
quality 0..5), each time inlined verbatim. Extracted to a single
helper.
Six call sites collapse from three lines each to one. Behavior
identical (the helper documents the (max 1 ...) divisor as an
empty-list guard). Final-report drops from 95 lines to ~80.
|
| |
|
|
|
|
|
|
|
|
|
| |
The function had an Org-version branch with a legacy <9.6 path that
used (substring (cdr org-time-stamp-formats) 1 -1). Modern Org's
format-strings dropped the angle brackets that the substring slice
assumed, so the legacy path was both dead-code (unreachable under
the org>=9.6 dep floor we just declared) and silently buggy if it
ever did run.
Function is now a one-liner around the modern primitive.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Two dead branches removed:
- (when (version< org-version "9.2") ...) advice on org-get-tags,
plus the org-drill-get-tags-advice helper that backed it. Org 9.2
shipped the new arity in 2018 — well below our org>=9.6 floor.
- (when (= 8 (car ...)) ...) Org 8.x defalias shim that wrapped
org-latex-preview around org-preview-latex-fragment. Org 8 hasn't
been a target for years and is below the org>=9.6 floor.
Both are now genuinely dead after the dep bump in 75b1601.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Three large dead-code blocks removed:
- 16-line commented-out org-drill-entry-due-p (replaced by current
implementation that takes a session arg)
- 17-line commented-out org-drill-hide-all-subheadings-except (the
body was a placeholder docstring + commented body; the real
function lives elsewhere now)
- 25-line block of commented-out alternative
org-drill-add-cloze-fontification + add-hook XXX commentary
Pure deletion, no behavior change. Version control has the history.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
org-drill calls org-fold-show-entry and org-fold-show-subtree from
seven sites without fboundp guards. Both functions arrived in Org
9.6. But the package declared org 9.3 (Package-Requires) /
org 9.2 (Cask), so users on older Org would silently void-function
at runtime instead of getting a clear install-time mismatch error.
Bumped both declarations to org 9.6. Wrapping each of the seven
call sites with fboundp would be the alternative, but Org 9.6 was
released October 2022 — three-and-a-half years ago — and we already
have a follow-up TODO to drop the legacy time-to-inactive fallback
that this version bump unblocks.
Two tests verify the declared dep and that the org-fold APIs are
actually bound on the running Org version.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
User reported that running org-drill on a buffer with a new (no-ID)
entry threw 'Wrong Type Argument: hash-table-p, nil' and stopped the
scan — every subsequent entry was silently skipped, so the user had
to re-run org-drill once per item (10 items meant 10 invocations).
The exact source of the hash-table error is environment-dependent
(Emacs version, Org version, lazy org-id-locations init, Doom
overrides), so this fix targets the user-visible failure mode
instead of the underlying triggering condition.
Wrapped the per-entry body of org-drill-map-entry-function in
condition-case. An error on one entry now logs a 'skipping' message
and the scan continues to the next entry. The session collects all
the well-formed items, and the user can re-run drill once total to
process them — no more once-per-item.
Two regression tests: one verifies the resilience behavior directly
(fail entry 1, scan continues to entry 2), the other documents the
ID-creation-with-uninitialized-locations scenario as a smoke check.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The inner match was [[:cntrl:][:graph:][:space:]]+?, which silently
includes newline. A stray [ could match all the way to a ]
several lines later, covering org headings in between with the
visible-cloze face. Reporter saw lines 4 and 5 of test.org lose
their org-level-N face and use default instead.
Switched the inner class to [^\n]+?. Clozes now stay within a
single line, which matches the design intent and stops the face
bleed. Three new tests cover the regression.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Issue #44 (2021): running org-drill in a TTY emacsclient (the
reporter mentioned tmux) raised "Window system frame should be
used" because LaTeX preview helpers (org-latex-preview,
org--latex-preview-region) require a window system and weren't
guarded.
Wrapped both call sites with (when (display-graphic-p) ...).
- org-drill--show-latex-fragments: now a silent no-op on TTY
- present-default-answer's clear-and-preview block: same guard
LaTeX previews are inherently graphical. The right behavior on
TTY is to skip the preview rather than crash the session — TTY
users still see the underlying source text just fine.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When a user interrupted a drill session to edit or capture, the
session's end-pos slot got set to a marker (or :quit). The end-of-
org-drill cond branched on end-pos: if set, show resume message and
skip org-drill-final-report.
That worked for the first interruption. But on org-drill-resume,
the session was reused with end-pos still carrying the prior marker.
Even when the resumed session completed normally, the same cond
branch fired again — silently skipping final-report.
Clear end-pos at the top of org-drill when resume-p is non-nil, per
Markus's proposed patch on the upstream issue. The resumed session
can now reach the final-report branch.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
org-drill--setup-display saved buffer-local state (mode-line,
variable-pitch-mode) into global defvars and called setq-local on
the current buffer. org-drill--restore-display read those globals
and ran setq-local against whatever buffer happened to be current
at restore time.
If the user switched buffers mid-session, the restore wrote to the
wrong buffer — leaving the original drill buffer's mode-line still
hidden and trampling the destination buffer's mode-line with
whatever was saved from elsewhere.
Captured the buffer at setup in org-drill--saved-display-buffer.
Restore now wraps mode-line and variable-pitch restoration in
with-current-buffer against that saved buffer. Text-scale stays
global (the underlying face attribute is process-wide).
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Issue #45 (2021): persist-load raised End of file during parsing
at persist.el:413 in some configurations, likely from a corrupted
persist data file. Pre-fix, this propagated up through the
top-level (persist-defvar org-drill-sm5-optimal-factor-matrix ...)
form at file-load time and broke the entire package's load.
Wrapped the persist-defvar form in condition-case. On failure, the
matrix falls back to a fresh nil binding via plain defvar, and a
message tells the user what happened. org-drill continues to load
normally.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Both functions bound session to org-drill-last-session and immediately
called setf / org-drill-entries-pending-p on it without checking for
nil. First-time invocation (or after Emacs restart with no active
session) threw an obscure eieio-oset / nil-slot type error instead
of a clear message.
Added (unless session (user-error ...)) at the top of each function.
A user running M-x org-drill-resume cold now sees a sensible message
telling them to run org-drill first.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
drawer-end was captured as
(save-excursion (re-search-forward ':END:' end t) (point))
which always returns a number — (point) is always defined. The
subsequent (when drawer-end ...) guard was dead, so a malformed
drawer (typo in :END:, mid-edit truncation) ended up with a junk
overlay covering whatever range point happened to land in.
Captured the search result itself and gate on it. Malformed
drawers are now skipped silently; well-formed drawers still get
their normal overlay.
|
| |
|
|
|
|
|
|
|
|
|
| |
When the property is absent, org-entry-get returns nil and
string-to-number errors with wrong-type-argument. Reachable when a
user removes the property mid-session, or when a Leitner-tagged
entry is rebox'd before its DRILL_LEITNER_BOX has been set.
Wrapped the org-entry-get with (or ... "0"). Box 0 makes the rating
semantics still sensible: a downgrade stays at 0, a promotion goes
to 1.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The card-type alist mapped translate_number to a function that no
longer exists in the file. Cards with DRILL_CARD_TYPE: translate_number
crashed with void-function during drill instead of being skipped.
Reporter (issue #43, 2021) said they had old decks using the
documented translate_number type and were getting the crash on
restore. The function was apparently removed at some point without
clearing the alist entry.
Removed the alist entry so entry-f's no-presentation-fn branch fires
and returns skip after messaging the user. Legacy decks now degrade
gracefully instead of crashing the session.
Tests in tests/test-org-drill-translate-number-regression.el lock the
behavior in (entry-f returns skip on translate_number, alist no
longer carries the entry).
|
| |
|
|
|
|
|
|
|
|
|
| |
5 ERT tests for the per-entry dispatcher:
- unknown DRILL_CARD_TYPE returns 'skip and doesn't call answer-fn
- presenter returns nil (quit) → entry-f returns nil
- presenter returns 'edit → propagates unchanged
- presenter returns 'skip → propagates unchanged
- presenter returns t (successful) → default answer presenter runs
and the complete-func (reschedule) is invoked with the session
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
5 ERT tests for the session loop body:
- quit return (nil) sets end-pos = :quit and exits the loop
- edit return ('edit) sets end-pos to a marker and exits
- passing rating (>failure-quality) routes marker to done-entries
- failing rating (<= failure-quality) skips done-entries
- skip return clears current-item without queueing
Tests use a tempfile-backed buffer because pop-next-pending-entry
calls org-drill-entry-p on each marker, which requires real org
buffer state.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
9 ERT tests filling small gaps in coverage:
- replace-entry-text-multi: N replacements → N overlays, each
showing the matching string via display prop
- map-entry-function: virgin entry → new-entries, future-scheduled
entry → dormant-entry-count (not new), non-drill skipped
- smart-reschedule with org-drill-spaced-repetition-algorithm bound
to sm2 and simple8 (default tests covered sm5)
- smart-reschedule with DRILL_CARD_WEIGHT
- entries-pending-p: overdue queue alone keeps session pending
|
| |
|
|
|
|
|
|
|
|
|
| |
7 ERT tests covering the last batch of testable smaller helpers:
- presentation-prompt-for-string: stores typed answer in
session->drill-answer, uses default prompt when arg is nil
- map-leitner-capture: unboxed entry goes to unboxed list, box-3
entry goes to boxed list, box>5 (graduated) skipped, non-drill
entry silently skipped
- org-drill-resume: with pending entries, calls org-drill resume-p=t
|
| |
|
|
|
|
|
|
|
|
|
|
| |
6 ERT tests covering org-drill-final-report:
- Reviewed-count from done-entries appears in the message
- Pending-queue line lists per-queue counts (1 new, 2 young, etc.)
- 100% pass rate doesn't trigger the WARNING branch
- Below forgetting-index pass rate triggers the warning prompt
- Per-quality counts produce correct percentages (1/4 = 25%)
- Warning-branch with zero dormant+due survives (locks in the
zero-divisor guard fix)
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The warning branch divided 100*overdue by (dormant+due) without
guarding the denominator. When both counts are zero — degenerate
scopes (cram with no items collected, pure-failure session on empty
queues) — the call hit arith-error before the warning even rendered.
Wrapped the divisor with (max 1 ...). In the zero case the
percentage reads as 0% rather than crashing the session wrap-up.
Resolves a long-standing pre-existing TODO entry.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
9 ERT tests covering:
- get-explain-text: no :explain: parent returns existing-text,
parent with :explain: tag adds its body, recursion stops at
top-level outline depth
- explain-answer-presenter: creates after-string overlay with
Explanation: prefix, replaces prior overlay on second call
- explain-cleaner: removes the overlay, no-op on missing overlay
- sm-or-leitner: runs SM (via org-drill-again) when pending entries
exceed leitner-completed, falls through to Leitner otherwise
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
10 ERT tests:
- present-spanish-verb (six-way cl-random branch): 0=present-translate,
2=past-translate, 4=future-perfect (mocked cl-random + presentation
prompt)
- org-drill-cram: passes cram=t to org-drill, accepts scope arg
- org-drill-cram-tree: delegates to cram with scope=tree
- org-drill-tree: passes scope=tree to org-drill
- org-drill-directory: passes scope=directory
- org-drill-again: resumes (resume-p=t) when prior session has
pending entries, starts fresh otherwise
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
7 ERT tests covering the language-card presenters and answer-show
helpers:
- present-verb-conjugation: runs cleanly with all required VERB_
properties, formats tense+mood string when both set
- show-answer-verb-conjugation: calls reschedule-fn
- present-noun-declension: runs cleanly, includes definite/indefinite
suffix when DECLINE_DEFINITE is set, skips suffix when neither
extra property is present
- show-answer-noun-declension: calls reschedule-fn
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
9 ERT tests covering the per-card-type presentation functions:
- present-simple-card: clozes hidden during prompt, return value
passthrough, overlays cleaned up after via with-hidden-cloze-text
- present-default-answer: drill-answer slot path (overlay-displays
the answer), unhide path (reveals body, calls reschedule-fn)
- present-card-using-text: replaces body with question, sets
drill-answer slot when ANSWER arg provided
- present-two-sided-card and present-multi-sided-card: run cleanly
on 2-side and 3-side cards
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
9 ERT tests with org-drill-presentation-prompt mocked to bypass
interactive prompts:
- hide-n with positive N: hides exactly N cloze overlays, no-op
when buffer has no cloze
- hide-n with negative N (show-mode): hides total-N pieces, leaving
abs(N) visible
- force-show-first + force-hide-first → user-visible error
- hide-nth: hides only the Nth piece, no-op when out of range,
negative N counts from the end
|
| |
|
|
|
|
|
|
|
|
|
|
| |
7 ERT tests covering the card-prompt return-value contract:
- org-drill-presentation-prompt-in-mini-buffer with input-pending-p
and read-key-sequence both mocked: quit → nil, edit → 'edit,
skip → 'skip, any-other-key → t
- explicit PROMPT arg appears in the formatted full-prompt
- org-drill-presentation-prompt dispatcher routes by
org-drill-presentation-prompt-with-typing (nil → mini-buffer
variant, non-nil → in-buffer variant)
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
8 ERT tests covering hide1-firstmore, show1-lastmore, show1-firstless.
Each wraps a cond that selects between common and uncommon multicloze
presenters based on org-drill-cloze-text-weight and the entry's
total-repeats counter.
Underlying presenter functions are mocked to no-op stubs that record
which one was selected — the branch logic is what's under test, not
the (interactive) cloze-prompt itself.
Cases covered per function:
- nil weight → fall back to non-weighted variant
- invalid weight (non-positive int) → error
- non-trigger rep → common path (hide-first / show-last / skip-first)
- trigger rep → uncommon path (hide-n with appropriate force flags)
|
| |
|
|
|
|
|
|
|
|
|
|
| |
10 ERT tests covering the rating function (read-key-sequence mocked):
- Quality 0/3/5 each returns the integer rating
- Quit key returns nil, edit key returns 'edit
- Successful rating pushes quality onto session->qualities
- Non-cram rating sets a SCHEDULED stamp via smart-reschedule
- Cram mode skips the reschedule (no SCHEDULED set)
- Failure with >= leech-failure-threshold tags entry :leech:
- Failure under threshold doesn't tag :leech:
|
| |
|
|
|
|
|
| |
Every drilled card was logging "[debug] org-drill: at marker position N"
to *Messages* and flashing it in the minibuffer. Pure noise — the
print statement was clearly a leftover from diagnostic work that
never got cleaned up. Delete it.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
15 ERT tests covering:
- org-drill-goto-entry: marker → buffer + position
- org-drill-goto-drill-entry-heading: stays put on the drill heading,
walks up from a child sub-heading, errors outside any drill entry
- org-drill-command-keybinding-to-string: nil for unbound, string
for bound commands
- org-drill-push-end: appends to non-empty and empty lists
- org-drill-leitner-rebox (interactive — read-key-sequence mocked):
rating 0 resets to box 1, rating 1 decrements (with floor at 1),
rating 2 stays, ratings 3-5 promote, quit-key returns 'quit
|
| |
|
|
|
|
|
|
|
|
|
| |
10 ERT tests covering:
- org-drill--make-minibuffer-prompt: status char (N/Y/o/!/F),
cram-mode shows C, done-entries count, prompt-text passthrough
- org-drill-relearn-item: resets DRILL_LAST_INTERVAL to 0,
unschedules the entry (days-ahead = 0 path through smart-reschedule)
- org-drill-progress-message: emits on multiples of 50, silent
otherwise, includes the COLLECTED count
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
6 ERT tests covering all four days-ahead branches:
- 0 → unschedule (treat as new again)
- negative → schedule today (current-time)
- positive → schedule N days ahead
- nil → use the algorithm-computed next-interval (locks in the
numberp guard fix)
Plus property side-effects: writes DRILL_LAST_INTERVAL / EASE /
TOTAL_REPEATS via store-item-data, and TOTAL_REPEATS increments on
each call.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The function takes `days-ahead' as &optional, but the schedule cond
called `(= 0 days-ahead)' and `(cl-minusp days-ahead)' before any
type-guard, so passing nil crashed with a wrong-type-argument error.
Today's two callers (the rating-confirmation flow and the
org-drill-relearn-item helper) always pass a number, so this was
latent — but a third caller relying on the documented &optional
shape would hit it immediately.
Switched the cond to require numberp before the value comparisons,
and the default branch now falls back to the algorithm-computed
next-interval when days-ahead is nil. That matches the intent
implied by the optional signature and the docstring.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
12 ERT tests covering:
- org-drill-pop-next-pending-entry: empty session → nil, failed
prioritized over new/old, again-entries fallback, max-item limit
gates primary queues but again-entries bypasses
- org-drill-card-tag-caller: dispatches per-tag hook fn from alist,
unknown tag is silent no-op (falls through to ignore)
- org-drill-id-get-create-with-warning: creates ID and flips
warned-about-id-creation flag, doesn't re-warn (uses tempfile-
backed buffer because org-id-get requires file-visiting)
- org-drill-add-cloze-fontification: sets buffer-local cloze-regexp
and cloze-keywords from current delimiters
- org-drill-strip-all-data: yes-or-no-p gate (no-confirm = no-op,
confirm = wipes scheduling props)
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
14 ERT tests covering:
- org-drill-explain-entry-p: with/without :explain: tag, no-inherit
flag rejects parent's tag
- org-drill-end-of-entry-pos: single-heading and multi-heading subtree
bounds
- org-drill-get-verb-conjugation-info: full property read, tense-only
(mood optional), missing-required errors, tense-color highlight face
- org-drill-get-noun-info: full property read, missing-required errors,
feminine-gender orchid color from alist, unknown-gender red fallback
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
17 ERT tests covering:
- org-drill-swap: distinct indices, same-index no-op, end-to-start
- org-drill-shuffle: preserves element multiset, empty list, singleton
- org-drill-pop-random: removes-one, nil-on-empty, empties singleton
- org-drill-hide-comments: per-line overlay, no-op on comment-free buffer
- org-drill-hide-drawers: PROPERTIES drawer, multiple drawers, no-op
on drawer-free entry
- org-drill-leitner-promote: box-N → box-(N+1), graduation at box 5
(with and without org-drill-leitner-promote-to-drill-p flag)
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Plus a docs fix to org-drill-order-overdue-entries' header comment.
16 ERT tests covering:
- org-drill-entry-status: non-drill nil, empty entry nil, virgin :new,
future :future, low-quality :failed, due+short-interval :young,
due+long-interval :old, very-overdue :overdue, skipped-leech
:unscheduled, three-element return shape
- org-drill-entry-days-since-creation: with DATE_ADDED, missing without
flag (nil), missing with use-last-interval-p flag (overdue+interval)
- org-drill-order-overdue-entries: empty stays empty, non-lapsed
sorted by DUE desc, lapsed split (by DUE crossing threshold, not AGE)
appearing after sorted by AGE desc
Fixed misleading header comment at line 2888 — it claimed the lapse
split was by AGE, but the code uses DUE (cl-second). This matches
the semantic gate in org-drill--entry-lapsed-p, so the code was
right and the comment was stale. Updated the comment to state the
actual three-step sort.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
23 ERT tests covering the queue control flow:
- org-drill-entries-pending-p: empty session, current-item slot,
again-entries bypassing limits, item-count limit interaction
- org-drill-pending-entry-count: empty, sums all queues, current-item
marker check
- org-drill-maximum-duration-reached-p: nil-duration disables, cram
bypasses, fresh session under limit, old session over limit
- org-drill-maximum-item-count-reached-p: nil disables, cram bypasses,
under/at limit, includes-failed-items-p flag
- org-drill--entry-lapsed-p: feature flag gate, threshold respected
- org-drill-free-markers: explicit list, t-frees-everything
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
19 ERT tests covering the buffer-overlay machinery behind card
presentation:
- org-drill-hide-region / unhide-text: bounds, optional display
text, no-op on clean buffers, leaves unrelated overlays alone
- org-drill-hide-clozed-text / unhide-clozed-text: hides every
cloze span with org-drill-cloze-overlay-defaults category, clean
round-trip
- org-drill-hide-cloze-hints: hides only the ||hint portion when
present, no-op when absent (locks in the production fix)
- org-drill-replace-entry-text / unreplace-entry-text: covers entry
body with placeholder string overlay
- org-drill-get-entry-text: returns body text, strips text-properties
by default
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
org-drill-hide-cloze-hints checked (null (match-beginning 2)) to detect
"no hint present," but the cloze regex's hint group is an empty-allowed
alternation — the group always participates in the match, so
match-beginning is always a position, never nil.
For a card like "[Paris]" (no hint), the function fell through to
org-drill-hide-region with start = end and made a zero-width overlay.
Cosmetically harmless but accumulates one stray overlay per hint-less
cloze. On a buffer with many such cards the tracking cost is real.
Switched the guard to (= (match-beginning 2) (match-end 2)) — empty match.
Found while writing tests; locked in by tests/test-org-drill-hide-show.el's
test-org-drill-hide-cloze-hints-no-hint-no-overlay.
|