Checks and counts

yumete can count what you have written, keep a daily log against a target, and look over a manuscript for the slips that ordinary reading misses: two spellings of one word, a quote mark that never closes, a character the printer's font will not have. It also tells you what the character under the cursor is.

Each check opens its findings as a read-only list, one line each. Press gf on a line to go to that place in the manuscript.

How words are counted

Counts follow Word's rule: each Chinese character is one, and each Latin word is one. 我用 Rust 寫了 hello world。 counts 7. The status line, :count, the daily target and :count-progress all count this way.

The count on the status line

The status line shows how long the file is, after the cursor position: Ln 12, Col 5, Chr 5 3214 words. With a selection it shows the selection's count beside the whole: 120 / 3214 words. On a narrow window the count is the first thing to give way. The outline sidebar (Space s) shows each heading's count at its right edge, including its subsections.

[editor]
status_count = "text"
ValueWhere it shows
text (default)Markdown, plain text and Typst; not code
allevery file
offnowhere

:count

:count (or :wc) reports the whole file, or the selection if there is one:

the whole file  3214 words  2980 han  3302 characters (no spaces)  41 paragraphs

The first number is the Word-style count. The count on the status line is the same number.

A daily target: :count-target and :count-progress

:count-target 2000     set a goal of 2000 a day
:count-progress        how much today, how much in the book, how many days running
:count-target off      stop measuring against a target; the log goes on

:count-progress opens a list with one line per day, oldest first, and a bar for that day's share:

2026-09-04  -260 字  -
2026-09-05  2440 字  ████████████+
2026-09-06  1830 字  ███████████

The line under the status line sums it up: 1830/2000 字 today (91%), 62480 in the book, 3 days running.

+ marks a day over target. - marks a day you cut more than you wrote. Without a target the bars are measured against your best day.

The log counts what changed between saves, so unsaved typing does not count yet. "In the book" is the sum of every file's count at its last save. A day you have not started yet does not break the run.

The log is a plain text file, .yumete/progress.tsv in the project. Each line is a date, a file name, the count at the day's start and the count now, separated by tabs:

目標	2000
2026-09-05	chapter-1.md	0	1830
2026-09-06	chapter-1.md	1830	2440

You may edit it to fix a mistake, delete a day, or merge two machines' copies. A line it cannot read is skipped, not the whole file. Nothing is written until you run :count-target or :count-progress; after that, every :w in the project adds to it. To stop, delete the file.

Two spellings of one word: :check-usage

Many words have two accepted spellings, such as 裏 and 裡, or 為 and 爲. A long manuscript drifts between them, and no spell checker will notice, because both are correct.

:check-usage compares the manuscript with itself. It reports a group only when both spellings appear, and points at the places that use the less common one:

4: 「裡」 here (3), 「裏」 in the rest (400)

A manuscript that only ever writes one spelling gets no report. Pairs that mean different things, such as 面 and 麵, are not in the built-in table.

Your book's own names are in no table, so add them in the config, one group per string, the spelling to keep first:

[editor]
usage_groups = ["阿嬌 阿姣", "落霞鎮 落霞鄉"]

Words you lean on: :word-habit

:word-habit lists the words this file uses more often than ordinary text does, ranked by how much they stand out and how often they occur. A common word such as 的 is never listed, because every text uses it at the usual rate.

12: 「然後」 47× — 4.2 times more often than ordinary text

The line number is where the word first appears. Names the frequency table does not know, single characters, and words used fewer than three times are left out. The check needs a word-frequency table, which comes with the 宇浩 data (see The input method). yumete's built-in word list has no frequencies, so without that data the check says so and lists nothing.

Punctuation: :check-punct

:check-punct looks for three things:

  • a half-width , . ; : ! ? ( ) next to Chinese text;
  • ... where Chinese uses ……;
  • an opening 「 『 ( 《 〈 【 that never closes.
1: half-width 「,」 should be 「,」
2: 「「」 is never closed by 「」」

Only marks touching a Chinese character are reported, so 3.14, 1,000 and English sentences are left alone. Inline code and code blocks are skipped. A quote that runs over several paragraphs, opening 「 again at the head of each, is not counted as unclosed. Brackets must close in the same paragraph.

:view-punct on shows the same hint on the page as you write: the right mark is drawn beside the half-width one.

Characters a font may not have: :check-charset

:check-charset lists characters that are in none of the four standard character sets (mainland, Taiwan, Hong Kong, and the set for classical texts). Your screen may show them fine, while the typesetter's font does not have them.

There is one line per character, not per place, with the first place it appears, how many times in all, and its Unicode block:

37: 「𠮷」 is in no standard (CJK-B), occurrences in the file: 412

The check reads the character sets from the input method's data, so it needs a scheme loaded (:yume-scheme). Without one it says there is no data. 〇 and 々 are never reported.

Simplified and traditional: :convert

:convert converts the whole file between simplified and traditional forms. It runs OpenCC, which needs to be installed and on PATH.

:convert s t        simplified to traditional
:convert t s        traditional to simplified
:convert            list the codes and which pairs work
:convert-opencc     is opencc installed, where, which version
CodeForm
ssimplified
tOpenCC's plain traditional
twTaiwan
hkHong Kong
jpJapanese shinjitai (converts with t, c and g; not with s, tw or hk)
cmainland standard traditional forms
gstandard forms for classical texts

:convert! also converts vocabulary where OpenCC can (:convert! s tw turns mainland computer terms into Taiwan ones). This changes the word count and cannot be reversed by converting back, so it needs the !.

One conversion is one undo: press u to get the file back. Converting back the other way is not an undo, since the round trip is not exact.

On macOS, :convert-opencc-install runs brew install opencc. On other systems it prints the command for you to run.

To convert only the selection, use the case group: under the helix keymap ` then s (to simplified), t, w (Taiwan), k (Hong Kong), c, g, or j; under the vim keymap the group is g` .

What is the character under the cursor

The right end of the status line names the character under the cursor:

螭 U+87ED · CJK Unified Ideographs

When a rare character shows as a box, this tells you whether the character is wrong or the font is missing it. When the line is crowded, the block name goes first, then the code point. [editor] char_info = false turns it off.

Invisible characters

Some characters take no space on screen: a zero-width space, a soft hyphen, a byte-order mark in the middle of the text, a joiner outside an emoji, and the bidi controls that can make text read differently from how it is stored. The cell after one of them gets an amber background. A space that is not a plain space, such as a no-break space, has its own cell tinted. Put the cursor on the tinted cell and the status line names what is there:

U+200B · ZERO WIDTH SPACE

The ideographic space U+3000, emoji joiners and the variation selectors that pick a Chinese glyph are never marked. To turn the marks off:

[editor]
unicode_alarm = false

The settings panel has it under Marks.

The sign beside the cursor: :view-hud

A command you have started typing, such as 3, 2t or d3l, is shown at the right end of the status line and beside the cursor.

:view-hud full     a bordered panel under the cursor, over the text (default)
:view-hud basic    a small label in blank space nearby; covers nothing
:view-hud off      nothing beside the cursor
:view-hud          which one is on

The status line copy is always there. If you mind the panel covering the text you are counting over, use basic. When the input method's candidates need the same place, they win.

A note beside the sentence

When the cursor stops on a footnote mark such as [^1], the note floats in a panel in the corner, with the line it is on:

That winter it snowed[^1] on the hill.
                              ╭ [^1]───────────────────────╮
                              │ The county records say so. │
                              ╰────────────────────line 11─╯

The panel keeps to the right and moves only up and down, so the start of each line stays visible; in vertical layout it keeps to the bottom. It takes no rows from the page. Annotations written %%like this%% get the same panel, so a long one can be read without spreading the paragraph apart.

gd on the mark goes to the note, and gd there brings you back to the exact character you left. If you move somewhere else in between, the way back is forgotten.