Skip to content

Fix halfwidth katakana voiced and semi-voiced sound marks in width calculations - #89

Merged
Manishearth merged 3 commits into
unicode-rs:masterfrom
tats-u:fix-half-voiced
Jul 2, 2026
Merged

Manishearth merged 3 commits into
unicode-rs:masterfrom
tats-u:fix-half-voiced

Conversation

@tats-u

@tats-u tats-u commented May 26, 2026 •

Copy link
Copy Markdown
Contributor

Related: microsoft/terminal#18087

Halfwidth katakana (semi-)voiced sound marks U+FF9E & U+FF9F are the only Grapheme Extenders that belong to Letter (Lm). They are typical edge cases when you cosider grapheme clusters.

They should be counted as 1 (their EAW is H), not 0.


English transtion of initial Prompt (Copilot + GPT-5.4 high):

Add test_halfwidth_katakana:
パグ→4 characters


English translation of additional handling prompt after discovering that the added test fails (because GPT started flailing around trying to fix it):

The half-width Kana voiced mark test failed because they're Grapheme Extenders despite being Letters. The current spec sucks, so please fix it together


"pug dog" was hand-written. The rest part of that comment was completed by Copilot line completion.

Comment thread src/lib.rs Outdated
@tats-u
tats-u requested a review from Jules-Bertholet May 27, 2026 23:57
Comment thread src/lib.rs Outdated
Co-authored-by: Jules Bertholet <[email protected]>
@tats-u
tats-u requested a review from Jules-Bertholet May 28, 2026 03:33
@tats-u
tats-u requested a review from Manishearth June 8, 2026 00:34
@tats-u

tats-u commented Jun 30, 2026

Copy link
Copy Markdown
Contributor Author

@Manishearth Do you agree with the current change? Is there anything that prevents this PR from merged?

@Manishearth

Copy link
Copy Markdown
Member

Just busy and haven't been able to get around to it

@tats-u

tats-u commented Jul 1, 2026

Copy link
Copy Markdown
Contributor Author

That's too bad. Please do it when you have the chance.

@Manishearth
Manishearth merged commit c7b4d42 into unicode-rs:master Jul 2, 2026
@tats-u
tats-u deleted the fix-half-voiced branch July 2, 2026 08:41
@tats-u

tats-u commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

Thank you for the merge.

@tats-u

tats-u commented Oct 7, 2026

Copy link
Copy Markdown
Contributor Author

Since the Unicode version has been updated, isn't it about time to release a new version?

hakula139 added a commit to hakula139/oxide-code that referenced this pull request Oct 28, 2026
…rks one cell wide (#717)

## Summary

Renovate's #711 bumps unicode-width to 0.2.3, and every Rust and Nix job
then fails
`testing::tests::buffer_rows::read_an_offset_area_and_skip_the_cells_wide_symbols_cover`,
which reads `["界ガa", " "]` where it expects `["界ガa ", " "]`. The new
width table is correct, but ratatui double counts with it. ratatui-core
0.1.2 adds a cell to each halfwidth katakana sound mark (U+FF9E, U+FF9F)
in `CellWidth` (ratatui/ratatui#2499) because unicode-width used to
count them as zero-width, and unicode-width 0.2.3 counts them as one
cell itself (unicode-rs/unicode-width#89). Together they lay `ガ` out
over three cells while terminals draw it in two, so ratatui reserves a
cell after each mark that the terminal never draws. This PR holds
unicode-width at 0.2.2, where ratatui paints each mark one cell wide.

The hold has a cost: `ox`'s own measures, such as `wrap.rs` and the `ox
--list` padding, still count each mark as zero cells, as on `main`, one
cell less than ratatui and the terminal draw. unicode-width 0.2.3 would
fix `ox --list`, which writes to the terminal directly, but not the TUI,
since ratatui would then paint one cell more than `wrap.rs` measures.
Both gaps close once a fixed ratatui lets the bound go.

- **Bound:** `Cargo.toml` requires `unicode-width = ">=0.2, <0.2.3"`, so
`cargo update` and lock file maintenance stay on 0.2.2. ratatui-core
0.1.2 is its latest release, ratatui's `main` still adds the cell, and
its manifest accepts any unicode-width from 0.2.0, so no ratatui update
fixes the combination yet.
- **Renovate:** Renovate widens a range with a `<` bound by default, and
a local dry run proposed `>=0.2, <0.2.4` in the Rust dependencies group.
A `packageRules` entry with `allowedVersions: "<0.2.3"` stops that, so
Renovate's rebase of #711 leaves only xattr 1.7.0.
- **Upstream:** No ratatui issue or PR reports the double count yet.
#718 tracks dropping the bound once a ratatui-core release counts each
mark once.

## Test plan

- [x] With #711's lock on `main` (unicode-width 0.2.3, xattr 1.7.0),
`cargo test -p ox-tui --lib testing::tests` fails with the same
`["界ガa", " "]` as CI
- [x] With the bound, `cargo update -p unicode-width` locks nothing, and
a full `cargo update` changes only xattr 1.6.1 → 1.7.0, on which `cargo
test --workspace` passes
- [x] `renovate-config-validator --strict --no-global
.github/renovate.json` passes, and `renovate --platform=local
--dry-run=lookup --enabled-managers=cargo` proposes no unicode-width
update and keeps xattr 1.7.0 in `renovate/rust-dependencies`
- [x] `cargo fmt --check`, `cargo build`, `cargo clippy --all-targets`,
`cargo clippy`, and `cargo doc --no-deps` pass
- [x] `cargo llvm-cov`: 3543 tests pass with 99.17% line coverage
- [x] `cargo deny check` passes: advisories, bans, licenses, and sources
ok
- [x] `pnpm format`, `pnpm lint`, and `pnpm spellcheck` pass
- [x] CI passes on every job at 64f1c61, including Rust and Nix on
every platform, Lint, MSRV, and the release builds
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants