Bob Hyman 0a8c9b22b0
string | fill counts clusters, not graphemes; and doesn't count ANSI escape codes (#8134)
Enhancement of new `fill` command (#7846) to handle content including
ANSI escape codes for formatting or multi-code-point Unicode grapheme
clusters.
In both of these cases, the content is (many) bytes longer than its
visible length, and `fill` was counting the extra bytes so not adding
enough fill characters.

# Description

This script:
```rust
# the teacher emoji `\u{1F9D1}\u{200D}\u{1F3EB}` is 3 code points, but only 1 print position wide.
echo "This output should be 3 print positions wide, with leading and trailing `+`"
$"\u{1F9D1}\u{200D}\u{1F3EB}" | fill -c "+" -w 3 -a "c"

echo "This output should be 3 print positions wide, with leading and trailing `+`"
$"(ansi green)a(ansi reset)" | fill -c "+" -w 3 -a c
echo ""
```

Was producing this output:
```rust
This output should be 3 print positions wide, with leading and trailing `+`
🧑‍🏫

This output should be 3 print positions wide, with leading and trailing `+`
a
```

After this PR, it produces this output:
```rust
This output should be 3 print positions wide, with leading and trailing `+`
+🧑‍🏫+

This output should be 3 print positions wide, with leading and trailing `+`
+a+
```
# User-Facing Changes

Users may have to undo fixes they may have introduced to work around the
former behavior. I have one such in my prompt string that I can now
revert.

# Tests + Formatting

Don't forget to add tests that cover your changes.
-- Done

Make sure you've run and fixed any issues with these commands:

- [x] `cargo fmt --all -- --check` to check standard code formatting
(`cargo fmt --all` applies these changes)
- [x] `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A
clippy::needless_collect` to check that you're using the standard code
style
- [x] `cargo test --workspace` to check that all tests pass

# After Submitting

`fill` command not documented in the book, and it still talks about `str
lpad/rpad`. I'll fix.

Note added dependency on a new library `print-positions`, which is an
iterator that yields a complete print position (cluster + Ansi sequence)
per call. Should this be vendored?
2023-02-20 06:32:20 -06:00
..
2022-11-22 16:58:11 -08:00
2023-01-22 19:49:40 +01:00
2022-12-30 17:44:37 +02:00
2022-02-07 14:54:06 -05:00
2023-02-01 21:48:21 +01:00
2023-02-16 02:30:56 +00:00
2022-02-17 06:40:24 -05:00
2022-02-07 14:54:06 -05:00
2022-12-22 00:33:26 +02:00
2022-09-11 11:48:27 +03:00
2022-02-16 12:24:45 -06:00
2022-05-18 20:47:26 -05:00
2022-07-04 06:31:50 +12:00
2022-02-07 14:54:06 -05:00
2022-11-11 19:51:08 +13:00
2022-09-11 11:48:27 +03:00
2023-02-16 02:30:56 +00:00
2022-02-07 14:54:06 -05:00
2022-11-09 17:06:47 -08:00
2022-02-07 14:54:06 -05:00
2022-02-07 14:54:06 -05:00
2022-11-27 07:19:02 +13:00
2023-01-16 12:43:46 +01:00
2022-12-02 11:36:01 +01:00
2022-03-24 16:42:41 +13:00