Skip to content

Compose Tool

reminiscience edited this page Aug 13, 2026 · 1 revision

The command-line tool

ananeo-tool.exe is a separate build that links neither the keyboard hook nor the drawing library. It answers questions about the compose stock and generates the layout sheet, without a running AnaNeo.

It reads the same layouts.json, config.json and compose/ files as the program, always relative to its own directory, not to the working directory.

Building it

dub build --config=tool --build=plain

Use --build=plain. Two build types will waste your time otherwise:

  • The default (debug) switches the loader's full loading log on, written to stdout before the actual output. Useful when debugging the loader itself, useless when piping the result anywhere.
  • --build=release is broken for this configuration and must not be used. It applies the Windows subsystem and entry point meant for the GUI executable, producing a program that outputs nothing at all and exits with code 0. Measurements taken with it look like empty results rather than like a failure.

--out <file> and --html <file> write to a file and are unaffected by the first point.

Subcommands

ananeo-tool sheet [layout]                    printable layout sheet
ananeo-tool compose <subcommand>
Subcommand Answers
origin [module] which file contributed what, and which sequences lost to a later one
namespace [prefix…] [--layout <name>] the continuations under a keysym prefix; with --layout, which layer each sits on
coverage how much of each Unicode block the stock covers
gaps <block…> which characters of a block are missing
find <char|U+XXXX> which sequences produce a given character
check <file.module> a candidate file against the existing stock, before adding it
diff <selection-a> <selection-b> two module selections against each other
layers [layout] layers against the compose stock
spiegel --layout <name> [--schwelle N] [--alle] duplicates between layers and the tree
report several sections in one report
gen-schrift, gen-kreis regenerate the computed modules

Common switches: --modules a,b,c to override the module selection, --out <file>, --html <file>.

The ones you will actually use

find – where does this character come from?

ananeo-tool compose find U+2460

Note the syntax: U+XXXX with the plus. Without it the argument is read as a literal string and the tool reports zero hits – which looks exactly like "not in the stock" and is not.

origin – what did each module bring, and what collided?

ananeo-tool compose origin

The first columns are counts per file: new, overwritten, dual-role, rejected, removed, unparsable. Then the individual sequences that lost to a later module.

Careful when comparing against the running program's debug log: the log adds new and overwritten into a single entries figure, while origin keeps them apart. For en_US that is 4238 against 4191 – the same load, two numbers. When recording a value for an acceptance test, always note which of the two it came from.

spiegel – did a layer assignment duplicate a compose sequence?

ananeo-tool compose spiegel --layout AnNoted

Classifies each duplication as Reihe (series), Muster (pattern) or Einzelfall (isolated case) and shows only the isolated ones by default – those are the candidates for deletion under the division of labour. --alle shows all of them, --schwelle N moves the threshold.

coverage and gaps – what is missing?

ananeo-tool compose coverage
ananeo-tool compose gaps "Mathematical Alphanumeric Symbols"

Both work against Unicode 17.0.0, pinned in data/. That directory is not part of a release package – the tool is a development aid, not something an installation needs. The Unicode data is deliberately not updated automatically: a version bump would shift the coverage figures without anything having changed about the compose stock.

The output is German

The tool's column headings and classifications are German – Herkunft, ueberschr., Einzelfall. It was written for working on AnaNeo rather than for distribution, and it is not part of the release package.

Clone this wiki locally