* fix(injection): send newlines as Return on the xdotool backend
xdotool type maps '\n' to the Linefeed keysym, which GTK targets
silently drop — "new line" produced nothing on X11 even though the
segment reached the injector. Split each chunk on '\n' and press
Return between typed segments so a newline lands as a real keypress
in every app.
Verified against a live GtkTextView on Xvfb: the same "A\nB" input
that previously produced 'AB' now produces 'A\nB'.
Fixes#955
* fix(commands): consume trailing punctuation after mid-utterance commands
"New paragraph." inside a longer utterance substituted correctly but
left the engine's sentence-final period typed after the break
("\\n\\n. Does this work now?"). Text-command substitution now
consumes a run of trailing , . ! ? ; : … when it precedes whitespace
or the end of the segment — the reporter's comma-phrased case
("…, new paragraph, …") stops leaking the stray comma the same way.
A mark glued to following text ("newline.io") is untouched.
Fixes#955
* fix(injection,commands): resume mid-chunk on retry, don't eat produced marks
Greptile review follow-ups on #962:
- A failed Return mid-chunk left 'typed' at the chunk start, so the
retry re-sent text xdotool had already delivered. 'typed' now
advances per typed segment and per Return keypress, so the retry
resumes exactly at the un-typed position — and the clipboard
fallback reports the same progress if retries run out.
- _TRAILING_PUNCTUATION could consume a mark produced by an earlier
command replacement ('hello new line exclamation mark' gave '\\n'
instead of '\\n!'). The eater now only consumes marks before
whitespace; the end-of-utterance case ('hello new line.') is a
pre-pass on the raw segment before any substitution runs.
* style: black-format comment indent and test condition
* fix(commands): strip segment before the end-of-utterance cleanup
Trailing whitespace ('hello new line. ') hid the final mark from the
pre-pass: the raw segment ended in a space, and the stripped segment
left the dot at end-of-string where the mid-utterance eater cannot
touch it. Strip first, then run the cleanup.
Also add the missing type hints on the new test helper.
---------
Co-authored-by: Jatin K Malik <jatinkrmalik@gmail.com>