fontina0.2.0

Next: Command reference,  Previous: Activation and installation,  Up: Manual

4. Watching, previews and the browser

`watch` keeps the index current; `preview` draws real shaped glyphs in the terminal; `ui` is the keyboard-first browser over what is in your fonts.

Watching

A source registered with source add is watched by default. fontina watch follows every watched source and keeps the index current until interrupted:

$ fontina source add ~/Fonts
$ fontina watch

Changes arrive in batches: the watcher waits for a quiet period (--debounce-ms, default 500) and then rescans what changed, so unpacking a hundred files produces one batch, not a hundred. One line is printed per batch; with --json, one JSON object per line, which makes it a stream another program can follow.

Extra directories can be followed for one run without registering them:

$ fontina watch ~/Downloads/fonts-to-sort

watch is a foreground process on purpose. Run it under whatever supervises long processes on your system. A systemd user unit on Linux:

# ~/.config/systemd/user/fontina-watch.service
[Unit]
Description=Keep the fontina index current

[Service]
ExecStart=%h/.local/bin/fontina watch
Restart=on-failure

[Install]
WantedBy=default.target

Turn watching off for a source with source watch PATH --off; it is still scanned by scan and source add, just not followed.

Previews

fontina preview shows a face as real, shaped glyphs, in the terminal:

$ fontina preview 42
$ fontina preview 42 -t "Sphinx of black quartz, judge my vow" -s 64
$ fontina preview family:Amiri -t "بسم الله"
$ fontina preview 42 -a wght=700 -a wdth=85 -f smcp -f liga=0
$ fontina preview 42 -o specimen.png

The text is shaped by HarfBuzz’s Rust port, so Arabic joins, Indic reorders, emoji sequences compose, and kerning and ligatures apply. Outlines come from the same parser as everything else and are rasterised at the requested size and axis position. -a sets a variable axis (repeatable); -f turns an OpenType feature on, or off with =0. The default text is a pangram, or the face’s own sample text when it carries one.

The bitmap is drawn with the best protocol the terminal supports, detected automatically:

Protocol Terminals
kitty graphics kitty, Ghostty, WezTerm, Konsole
iTerm2 inline images iTerm2, WezTerm, mintty
sixel foot, xterm, mlterm, Windows Terminal
half-block text everywhere else, including CI logs and less -R

-p forces one (kitty, iterm, sixel, blocks); -p png with -o writes a PNG instead. --fg and --bg set the ink and, for sixel and blocks, the background; --max-width clips.

The browser

$ fontina ui

opens the index with a keyboard on it. A filter line across the top, families or faces on the left, the face itself on the right.

It uses the terminal’s own sixteen colours, so it looks like your terminal rather than like a website — and it uses them by reversing rather than by painting, so the cursor in the glyph map and the row your list is on are your own foreground and background, whichever way round you have them. Six roles, no more: the pane you are in, a label, a thing that worked, a thing to notice, a thing that failed, and the thing being pointed at. Colour carries hierarchy and never meaning; a failing check says FAIL whether or not the red arrives.

Every pane is the same box — rounded, a column of padding inside it, dim until it has the focus, its name on the top edge and what to press on the bottom. Every quantity is the same bar, in eighths: what a script covers, how far along its range an axis is set. A list longer than its pane says so, down the right-hand border. The mouse works. The keyboard is the design.

It shows what is in a font rather than a picture of one. A terminal cell is about one pixel wide and two tall, so type drawn with block characters arrives through a filter that changes its weight, loses its spacing and destroys its detail — a judgement made on something that is not the font. s writes a real specimen and opens it in a browser; fontina preview draws a true image where the terminal has a protocol for one. The browser is where you decide what to look at.

fontina uifamilies
  filter  nothing narrowed — f narrows, / searches                                                        5 families
╭ families ──────────────────────────────────╮╭ Amiri Regular ─────────────────────────────────────────────────────────╮
│ Amiri                               1      ││ style      weight 400 · width 100% · normal                            │
│ Bricolage Grotesque                 1 V    ││ state      not active                                                  │
│ Inter                               2      ││                                                                        │
│ Nabla                               1 VC   ││ features                                                               │
│ Source Serif 4                      1      ││   liga ○ Standard ligatures                                            │
│                                            ││   pnum ○ Proportional figures                                          │
│                                            ││   ss01 ○ Stylistic set 1                                               │
│                                            ││   ss02 ○ Stylistic set 2                                               │
│                                            ││   ss03 ○ Stylistic set 3                                               │
│                                            ││   ss04 ○ Stylistic set 4                                               │
│                                            ││   ss05 ○ Stylistic set 5                                               │
│                                            ││   ss06 ○ Stylistic set 6                                               │
│                                            ││   ss07 ○ Stylistic set 7                                               │
│                                            ││ glyphs     6710 · 1699 codepoints                                      │
│                                            ││ Arab       ██████████ 1217                                             │
│                                            ││ Latn       ██▌░░░░░░░ 291                                              │
│                                            ││ Zyyy       █▍░░░░░░░░ 160                                              │
│                                            ││ Zinh       ▍░░░░░░░░░ 31                                               │
│                                            ││ features   25: ccmp dnom fina init liga locl mark medi numr pnum rlig  │
│                                            ││            rtlm                                                        │
│                                            ││                                                                        │
│                                            ││ licence    OFL-1.1  free                                               │
│                                            ││                                                                        │
│                                            ││ designer   Khaled Hosny                                                │
│                                            ││ file       ../../fixtures/Amiri-Regular.ttf                            │
│                                            ││                                                                        │
│                                            ││ metrics    1000 upm · asc 1124 · desc -634 · gap 0                     │
│                                            ││ shape      cap 646 · x-height 433 · x/em 0.43                          │
│                                            ││                                                                        │
│                                            ││                                                                        │
│                                            ││                                                                        │
╰────────────────────────────────────────────╯╰────────────────────────────────────────────────────────────────────────╯
  $ fontina families
  / search  f narrow  F flags  x clear  ⇥ pane  ⏎ open  ⌫ back  ␣ select  t tag  c collection  a/A activate  … ? help

The top line is the filter, and it is there whether or not anything is filtered. With nothing on it says so and says which key would change that. With something on it names every filter in your own words, says what they did to the count — 341 → 12 families — and names the key that clears them.

Narrow by

f opens the library counted rather than searched.

fontina uif — narrow by
  filter  nothing narrowed — f narrows, / searches                5 families
╭ Narrow by ─────────────────╮╭ Amiri Regular ─────────────────────────────────╮
│ Script                     ┃│ style      weight 400 · width 100% · normal    │
│   Latn               5 (6) ┃│ state      not active                          │
│   Arab               1 (1) ┃│ features                                       │
│   Cyrl               1 (1) ┃│   liga ○ Standard ligatures                    │
│   +3 more                  ┃│   pnum ○ Proportional figures                  │
│ Language                   ┃│   ss01 ○ Stylistic set 1                       │
│   en                 5 (6) ┃│   ss02 ○ Stylistic set 2                       │
│   TRK                3 (3) ┃│   ss03 ○ Stylistic set 3                       │
│   CAT                2 (3) ┃│ glyphs     6710 · 1699 codepoints              │
│   +17 more                 ┃│ Arab       ██████████ 1217                     │
│ Foundry                    ││ Latn       ██▌░░░░░░░ 291                      │
│   RSMS               1 (2) ││ features   25: ccmp dnom fina init liga locl   │
│   ADBO               1 (1) ││            mark medi numr pnum rlig rtlm       │
│   ALIF               1 (1) ││ licence    OFL-1.1  free                       │
│   +2 more                  ││ designer   Khaled Hosny                        │
│ Capability                 ││ file       ../../fixtures/Amiri-Regular.ttf    │
│   proportional       5 (6) ││ metrics    1000 upm · asc 1124 · desc -634 ·   │
│   variable           2 (2) ││            gap 0                               │
│   color              1 (1) ││ shape      cap 646 · x-height 433 · x/em 0.43  │
╰ ⏎ picks · Esc closes ──────╯╰────────────────────────────────────────────────╯
  $ fontina families
  / search  f narrow  F flags  x clear  ⇥ pane  ⏎ open  ⌫ back  … ? help

Script first, then language, foundry, your own tags and collections, then what a face can do, then weight, width and style, licence, source and format. That is the order a person walks into a font library; nobody has ever opened a font manager thinking “show me the 500 Mediums”. Each section shows its top three and ends with +N more, which Enter opens. Enter on a value filters everything; x clears them all; Esc closes the panel. Nothing here is a saved list you have to build first.

Every count is a pair: families, and faces in brackets. The list beside the panel is a list of families, so the number that leads is the one that says what pressing the row will do to it. And a value you have selected is drawn at every count, including zero — narrowing to nothing must not take away the row that undoes it.

Opening a family

Enter opens a family into its faces, and Backspace closes it again.

fontina uia family, opened
  filter  nothing narrowed — f narrows, / searches                                                           2 faces
╭ Inter ─────────────────────────────────────╮╭ Inter Regular ─────────────────────────────────────────────────────────╮
│ Regular  400 woff                          ││ style      weight 400 · width 100% · normal                            │
│ Regular  400 woff2                         ││ state      not active                                                  │
│                                            ││                                                                        │
│                                            ││ features                                                               │
│                                            ││   calt ○ Contextual alternates                                         │
│                                            ││   frac ○ Fractions                                                     │
│                                            ││   pnum ○ Proportional figures                                          │
│                                            ││   tnum ○ Tabular figures                                               │
│                                            ││ glyphs     515 · 230 codepoints                                        │
│                                            ││ Latn       ██████████ 119                                              │
│                                            ││ Zyyy       ████████▊░ 104                                              │
│                                            ││ Zinh       ▋░░░░░░░░░ 7                                                │
│                                            ││ features   11: calt ccmp dnom frac locl numr pnum tnum kern mark mkmk  │
│                                            ││                                                                        │
│                                            ││ licence    OFL-1.1  free                                               │
│                                            ││                                                                        │
│                                            ││ postscript Inter-Regular                                               │
│                                            ││ version    Version 4.001;git-66647c0bb                                 │
│                                            ││ file       ../../fixtures/inter-latin-400-normal.woff                  │
│                                            ││                                                                        │
│                                            ││ metrics    2048 upm · asc 1984 · desc -494 · gap 0                     │
│                                            ││ shape      cap 1490 · x-height 1118 · x/em 0.55                        │
│                                            ││                                                                        │
│                                            ││                                                                        │
│                                            ││                                                                        │
│                                            ││                                                                        │
│                                            ││                                                                        │
│                                            ││                                                                        │
│                                            ││                                                                        │
│                                            ││                                                                        │
│                                            ││                                                                        │
╰────────────────────────────────────────────╯╰────────────────────────────────────────────────────────────────────────╯
  $ fontina list --family "Inter"
  / search  f narrow  F flags  x clear  ⇥ pane  ⏎ open  ⌫ back  ␣ select  t tag  c collection  a/A activate  … ? help

Look at the bottom row. It says $ fontina list --family Amiri, which is the command that would produce exactly this view. That row is the whole relationship between the two halves of the program: the browser is a way of building a command line by looking at things, and everything it can do, the command line can do.

The glyph map

m gives the face its whole screen and lays out every character it has, block by Unicode block, with how many of each block are covered.

fontina uim — the glyph map
  filter  nothing narrowed — f narrows, / searches                                                        5 families
╭ glyph map ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ > Basic Latin              95/128 0020     ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D   │
│   Latin-1 Supplement       96/128 0045   E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i   │
│   Latin Extended-A        128/128 006A   j k l m n o p q r s t u v w x y z { | } ~                                   │
│   Latin Extended-B          3/208                                                                                    │
│   Spacing Modifier Lett…   12/80                                                                                     │
│   Combining Diacritical…   17/112                                                                                    │
│   Arabic                  255/256                                                                                    │
│   Arabic Supplement        48/48                                                                                     │
│   Arabic Extended-B         2/48                                                                                     │
│   Arabic Extended-A        38/96                                                                                     │
│   Latin Extended Additi…   44/256                                                                                    │
│   General Punctuation      53/112                                                                                    │
│   Superscripts and Subs…    7/48                                                                                     │
│   Currency Symbols          1/48                                                                                     │
│   Mathematical Operators    4/256                                                                                    │
│   Geometric Shapes          1/96                                                                                     │
│   Supplemental Punctuat…    1/128                                                                                    │
│   Arabic Presentation F…  611/688                                                                                    │
│   Arabic Presentation F…  140/144                                                                                    │
│   Arabic Mathematical A…  143/256                                                                                    │
│                                                                                                                      │
│                                                                                                                      │
│                                                                                                                      │
│                                                                                                                      │
│                                                                                                                      │
│                                                                                                                      │
│                                                                                                                      │
│                                                                                                                      │
│                                                                                                                      │
│                                                                                                                      │
│                                                                                                                      │
╰ / finds a codepoint or a block · m or Esc closes ────────────────────────────────────────────────────────────────────╯
  1699 codepoints in 20 blocks   (fontina glyphs 1)
  / search  f narrow  F flags  x clear  ⇥ pane  ⏎ open  ⌫ back  ␣ select  t tag  c collection  a/A activate  … ? help

h and l pick a block, j and k scroll it, and / finds either a codepoint — U+0041, 0x41, 41 — or a block by name. It is a mode rather than a pane because reading coverage needs the width: 1,699 codepoints in twenty blocks does not fit beside anything else.

The controls

Tab moves to the controls, where a variable font stops being a list of instances and becomes a family you can move through.

fontina ui⇥ — axes and features
  filter  nothing narrowed — f narrows, / searches                                                        5 families
╭ families ──────────────────────────────────╮╭ Bricolage Grotesque 96pt ExtraBold ────────────────────────────────────╮
│ Amiri                               1      ││ style      weight 800 · width 100% · normal · variable (opsz wght      │
│ Bricolage Grotesque                 1 V    ││            wdth)                                                       │
│ Inter                               2      ││ state      not active                                                  │
│ Nabla                               1 VC   ││                                                                        │
│ Source Serif 4                      1      ││ axes & features — custom                                               │
│                                            ││ > opsz       96  ───────────● Optical size                             │
│                                            ││   wght      800  ───────────● Weight                                   │
│                                            ││   wdth      100  ───────────● Width                                    │
│                                            ││   case ○ Case-sensitive forms                                          │
│                                            ││   frac ○ Fractions                                                     │
│                                            ││   lnum ○ Lining figures                                                │
│                                            ││   onum ○ Oldstyle figures                                              │
│                                            ││   pnum ○ Proportional figures                                          │
│                                            ││   sinf ○ Scientific inferiors                                          │
│                                            ││ glyphs     597 · 527 codepoints                                        │
│                                            ││ Latn       ██████████ 327                                              │
│                                            ││ Zyyy       █████▋░░░░ 180                                              │
│                                            ││ Zinh       ▋░░░░░░░░░ 18                                               │
│                                            ││ Grek       ▏░░░░░░░░░ 2                                                │
│                                            ││ features   18: aalt case ccmp dnom frac lnum locl numr onum ordn pnum  │
│                                            ││            sinf                                                        │
│                                            ││                                                                        │
│                                            ││ licence    OFL-1.1  free                                               │
│                                            ││                                                                        │
│                                            ││ designer   Mathieu Triay                                               │
│                                            ││ file       ../../fixtures/BricolageGrotesque[opsz,wdth,wght].ttf       │
│                                            ││                                                                        │
│                                            ││ metrics    1000 upm · asc 930 · desc -270 · gap 0                      │
│                                            ││ shape      cap 660 · x-height 528 · x/em 0.53                          │
│                                            ││                                                                        │
│                                            ││                                                                        │
╰────────────────────────────────────────────╯╰────────────────────────────────────────────────────────────────────────╯
  $ fontina families
  / search  f narrow  F flags  x clear  ⇥ pane  ⏎ open  ⌫ back  ␣ select  t tag  c collection  a/A activate  … ? help

h and l move an axis and H and L move it by ten; n and p step through the named instances the designer drew; Space toggles an OpenType feature; 0 puts everything back. The status line carries the command that draws what you have set — fontina preview 12 --axes wght=600,opsz=14 — so a position you found by feel is a position you can hand to something that renders.

What the face pane says, and in what order

The pane is named by the face, and reads down in the order you are likely to be asking: what it is and what you have done to it, then the axes and features you can move, then what it can set — glyphs, codepoints, coverage per script with the count beside a bar — then the licence and the verdict on it, then where the file is, and last the measurements.

Last is deliberate. A terminal too short for all of it drops from the bottom, and the measurements are the numbers you go looking for, while everything above is a question you arrive with. The blank lines between the groups go before the content does, and a face with eleven stylistic sets gets a third of the pane for them rather than two-thirds — the block scrolls to keep the cursor in it.

The measurements themselves are what a terminal is good for: units per em, ascender, descender, line gap, cap height, x-height and the x-height ratio. Two faces compared this way are actually comparable. x/em 0.43 against x/em 0.52 says which will look larger at the same size, and no rendering at terminal resolution would have told you that.

Looking at the type

s writes a self-contained HTML specimen for the selection and opens it in your browser: a waterfall, the script samples, axis sliders, feature toggles and a glyph map, with real antialiasing and real spacing. On the command line, fontina preview draws a true image over kitty graphics, iTerm2 or sixel.

Neither is the browser’s job. It finds and organises; those show.

Many at once

Every action starts out meaning the row under the cursor. Space marks a row instead, v starts a range and v again ends it, and * marks everything the current filter matches — so tagging a foundry’s worth of faces is * and then t, rather than two hundred keystrokes on the same key.

Once anything is marked, every action below applies to the marked faces: activate, deactivate, install, uninstall, tag, collection. The pane title says how many are marked so it is readable at the moment you reach for the key, a filter that stops matching a marked face drops it and says so, and an action that fails on some of them reports which and leaves the rest applied. Esc clears the marks.

A family row stands for its faces, so marking a family marks all of them — the mark survives opening that family and looking at the faces one at a time.

Taking it back

U undoes the last thing that changed the index and Ctrl-R does it again. A whole selection is one undo: marking two hundred faces and pressing a is one entry, so one U puts all two hundred back. The status line names what came back rather than saying “undone”, because pressing U twice should tell you which of two changes you just reversed.

What comes back is what was there, which is not always the opposite of what you asked for. Tagging a hundred faces of which forty already carried the tag records the sixty that gained it, so undo takes the tag off those sixty and leaves the forty carrying what they came with. An activation records the state each face was in, one by one, so a selection that held three states goes back to three states.

What cannot be put back exactly is not offered. A rescan changes what the index knows about the disk, and there is no earlier state to restore, so it records nothing and U says there is nothing to undo. The history is in memory, for the session: one that outlived the process would be a claim about a filesystem several other programs can also write to.

Every command, from inside the browser

: lists every command fontina --help lists — the nested ones too, tag add and collection export and the rest — with the same one-line description, filtered as you type. Above the list is the command line it would run, carrying the filter or the selection you already have, so the palette teaches the command line rather than replacing it.

The names come out of the program’s own argument parser rather than a list somebody maintains, so a new subcommand appears here the day it is added. What is written down is the other half — whether the browser can do each one — and a test fails the build when a command exists that nobody has decided about. That is what stops the two surfaces drifting.

Enter runs the ones the browser implements, by pressing the browser’s own key, so there is one implementation of activating a font and not two. The ones that print get written into the status line instead, ready to paste into another window: the browser is using the screen they would print to. Anything that writes to the disk asks first, and anything but y is a no.

Filters the facets cannot express

The facet pane shows what the library contains and lets one value be chosen from each heading. A weight range, two scripts at once, a coverage threshold, “not variable” — none of those fit that shape, and the only way to find out how many faces a filter would leave was to run it in another window.

F opens a filter bar that takes the flags fontina list takes, and takes them by handing them to fontina list’s own parser. Nothing lists the fields twice: a flag added to the command line is a flag the browser understands the same day.

--weight 300-500 --script Cyrl --script Grek --script-min 200 --variable=false

It is applied as you type, so the panes behind the prompt are already showing the answer and the count sits beside the line. A half-typed flag is not a filter, so the panes stay on the last line that parsed and the prompt says which word is wrong, in the command line’s own words. Enter keeps it, Esc puts back what was there, and Ctrl-S saves everything it matched as a collection.

The bar opens pre-filled with the flags for the screen you are already on, so it starts as an editable copy of what you can see rather than an empty box. Toggling a facet afterwards hands control back to the facets and says so: a typed filter and the facet pane are two ways of saying the same thing, and there is no sensible way to add one facet to --variable=false.

What else is nearly this font

A real library holds families that are one typeface spelled several ways: a patched build, a re-encoding, a subset, an interpolation. One library of 149 faces reports twenty families and holds about eight typefaces, because a patch spaced three ways names itself three times. Nothing surfaced that, so you scrolled past six rows that were one design.

r lists what else covers nearly the same characters, ranked by how much. Each row carries the score, how many codepoints the two share out of the union, and the four metrics that decide whether identical coverage means identical design — units per em, ascender, descender, and whether the face is fixed pitch.

The score is shown, never thresholded away. That is the whole point: 0.62 between two faces at different units per em is a coincidence, and 0.98 with every metric agreeing is the same design twice, and only the reader can tell you which of those they were looking for. The floor the query used is in the title, so if you see six answers you can ask what the seventh was. Enter goes to the face; a face with nothing near it says so rather than showing a weak list.

Can anything I own set this?

Coverage shown per face, as scripts and counts, answers a question about fonts. The question a designer actually has is about text: here is a line, who can set it.

e takes a line — paste it — and answers per face. A face that sets the whole thing is marked; a face that nearly does is offered with the characters it lacks named, by codepoint and by the character itself, because “no” tells you nothing you can act on and “missing U+0641 ف” tells you whether to subset, pair, or look elsewhere.

A mixed-script line fails per script rather than as a whole. A line of English with one Arabic word is two questions, and a face that answers the first and not the second has said something useful.

The text is kept when you close the answer, and e opens with it already in the box — retyping a sentence to change one word of it is the friction this exists to remove. Enter goes to the face.

Which faces cover the whole line comes out of one query over the whole library. The near misses need each candidate’s own coverage, so they are asked of what you have already filtered to, up to two hundred faces; when the answer is bounded, the title says so.

What might go with this

Pairing is the question after choosing, and it is the one thing here that no field in the index answers directly. So be clear about what P is: it is not taste and it does not pretend to be. It is a ranking, shown with the numbers behind it, that puts twenty plausible candidates in front of you instead of four hundred faces.

Nothing is called a good pairing. Every row says what was measured and what was found, in the words of the measurement:

Inter Regular            weight +100 · spacing differs · serif vs sans-serif · x/em 0.48 vs 0.55 · 2 scripts shared

Five things are measured, all of them in the index: contrast in weight, contrast in width, whether the spacing class differs, how close the x-heights are at a common size, and whether the two are different kinds of typeface. Plus one gate — scripts in common — because two faces that cannot set the same text are not a pair whatever else is true of them. The pseudo-scripts (Zyyy, Zinh) do not count, or every pair would look compatible.

Faces from the same family are left out: pairing a typeface with its own bold is a weight, not a pairing. The ranking looks at the whole library rather than the pane you are on, because a partner is by definition something you do not already have in front of you. A face with nothing sharing a script says so.

A fifth thing is measured now that OS/2.sFamilyClass and PANOSE are parsed: whether the two are different kinds of typeface, serif against sans. It is the axis a person would name first and the weakest of the five, because it is a report of what the font claims. Of the five fonts this repository tests against, not one fills in sFamilyClass, three decline to classify themselves at all, and the chromatic display face calls itself a normal sans.

So a face that did not say is not scored on it either way, and the row says “kind not stated” rather than guessing. A ranking that treated silence as sans-serif — the commonest answer among fonts that did answer — would be inventing the very fact it was ranking on.

The keys

? puts this list over whatever you are looking at.

fontina ui? — the keys
  filter  nothing narrowed — f narrows, / searches                                                        5 families
╭ families ────╭ fontina ui ────────────────────────────────────────────────────────────────────────────╮──────────────╮
│ Amiri        │                                                                                        │              │
│ Bricolage Gro│  MOVING                                                                                │              │
│ Inter        │  j/k ↑/↓ PgUp/PgDn g/G   move        ⇥  cycle the panes                                │              │
│ Nabla        │  ⏎  open a family        ⌫ or Esc  close it                                            │              │
│ Source Serif │  The list and the face side by side at 78 columns and up, one at a time below          │              │
│              │                                                                                        │              │
│              │  FINDING                                                                               │              │
│              │  /  search names, Esc clears it      x  clear every filter                             │              │
│              │  f  Narrow by, the facets as a panel: ⏎ picks, ⏎ on +N more opens, Esc closes          │              │
│              │  F  the filter bar: the flags fontina list takes, applied as you type                  │              │
│              │     Ctrl-S saves what it matched as a collection                                       │              │
│              │                                                                                        │              │
│              │  DOING — to the marks when there are any, to the row under the cursor when not         │              │
│              │  ␣  mark a row   v  a range   *  all the filter matches   Esc  clear the marks         │              │
│              │  t  tag          c  add to a collection                                                │              │
│              │  a  activate for the user   A  until logout   i  install a copy   d/u  undo those      │              │
│              │  U  undo the last change to the index   Ctrl-R  do it again                            │              │
│              │                                                                                        │              │
│              │  LOOKING                                                                               │mr pnum rlig  │
│              │  h/l ←/→  move an axis (H/L by ten)   ␣  a feature   n/p  instances   0  reset         │              │
│              │  m  the glyph map: h/l pick a block, / finds a codepoint or a block by name            │              │
│              │  r  what else covers nearly the same characters, with the score and the metrics        │              │
│              │  e  who can set a line of text: paste it, and see what each face lacks                 │              │
│              │  P  the library ranked against this face: weight, width, spacing, x-height             │              │
│              │  s  write an HTML specimen and open it, because a terminal cannot set type             │              │
│              │                                                                                        │              │
│              │  THE PROGRAM                                                                           │              │
│              │  :  every command, filtered as you type    R  rescan every source    q  quit           │              │
│              │                                                                                        │              │
│              │  The status line is the command that would give you what is on the screen.             │              │
│              │                                                                                        │              │
╰──────────────│  any key to close                                                                      │──────────────╯
  $ fontina fam╰────────────────────────────────────────────────────────────────────────────────────────╯
  / search  f narrow  F flags  x clear  ⇥ pane  ⏎ open  ⌫ back  ␣ select  t tag  c collection  a/A activate  … ? help
Key Action
j k, arrows, PageUp, PageDown, g, G move
Tab cycle the panes this width has
/ search; type, then Enter. Esc clears
f Narrow by: the facets, as a panel. Esc closes it
F the filter bar: fontina list flags, applied as you type
Enter open a family, or pick a value in Narrow by
Space mark the row under the cursor
v start a range; v again ends it
* mark everything the filter matches, again to unmark
Backspace, Esc back, or clear the marks
x clear every filter
t / c tag the selection / add it to a collection
a / A activate for the user / until logout
i / u install a copy / uninstall it
d deactivate
h l, H L move an axis, by one or by ten
n / p step through named instances
0 reset the axes and features
r what else covers nearly the same characters
e who can set this text
P faces ranked against this one for pairing
m the glyph map
s write an HTML specimen and open it
U / Ctrl-R undo the last change to the index / do it again
: every command, filtered as you type
R rescan every source (fontina scan --prune)
? this list
q, Ctrl-C quit

A conflict on activation is shown in the status line with the --replace hint, exactly as on the command line.

One program

The status line is not a log. It is the command for what is on screen, and it changes as you do:

fontina uithe status line, four moments
 $ fontina families
 $ fontina families --variable --vendor ATLR
 search: grot▏
 tagged 1 face as favourite

A filter is a flag. A search is a prompt. An action says what it did, until the next reload. So the way to learn the command line is to use the browser, and the way to script what you just did by hand is to copy the row.

Every frame on this page is the program’s own output, read from the snapshot files a test asserts on. They cannot go stale without a test going red first.

Next: Command reference,  Previous: Activation and installation,  Up: Manual