transvi fixes:
1. qu-/gi- onset tone placement. The u after q, and the i after g when a
vowel follows, are onset glides rather than the rime nucleus, so the
tone must skip them: qua -> quá (was qúa), gia -> giá. The onset was
previously passed straight through to the app, so transvi never saw it
and toned the glide. Keep the onset in the preedit by adding qu-/gi-
clusters to telex.map (mktelex.py onsets(), appended additively to the
curated map), and add onsetglide() so transvi skips the glide. gi- with
no following vowel keeps i as the nucleus (gì, gìn).
2. A tone key on a vowel-less preedit (e.g. "đ" from dd) now commits the
preedit and lets the tone key pass through (eat=0), matching the engine
commit-on-passthrough invariant, instead of eating it into the commit.
Verified against the running engine: qua/quan/quay/quê/quên/quyển,
gia/già/giàu/giữ/giúp/giống, gì/gìn, dd+s; unchanged mua->mùa, của, lúa;
all non-qu/gi words byte-identical to before.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>