Strip OSC and DCS sequences to support e.g. OSC 8 hyperlinks over tmux.#280
Strip OSC and DCS sequences to support e.g. OSC 8 hyperlinks over tmux.#280khoek wants to merge 2 commits intoconsole-rs:mainfrom
Conversation
|
Appreciate the clean commit history, but it looks like there's a fair bit of code duplication. Could that be deduplicated? (If not, why not?) |
@djc Just my editorial choice to keep things simple. Did you have something more like the following (see latest commit) in mind? It's more complex but clarifies intent. (Happy to squash if you like it, honestly I kind of do.) Either way, I think the new commit at least clearly shows why there is some subtlety due to the differences in OSC and DCS semantics/idiosyncrasies---two examples:
Let me know what you like! |
3d2f8f2 to
07d3b28
Compare
|
(Sorry about the noise I was bikeshedding a function name.) |
djc
left a comment
There was a problem hiding this comment.
I definitely like it better too -- please squash.
Is there existing stuff which could leverage the same trait?
Treat OSC and DCS (including tmux passthrough wrappers) as non-printing when iterating/stripping ANSI codes. Adds regression tests for OSC 8 hyperlinks (ST/BEL) and tmux-wrapped OSC 8 hyperlinks.
Ensure the complex_data test fixture is present in packaged sources.
|
If there's a natural other place the same trait fits, I can't seem to find it. I would say the DFA core is structurally a bit different. (Above are my subjective feelings about your comments and they are made with relatively little conviction, so please feel free to override if you feel more strongly.) |
|
@djc (The politest possible) ping, just in case this fell off your desk (as opposed to being placed in the filing cabinet 😄). Obviously no pressure. |
|
I'll have you know my GitHub notifications are neatly stacked in a filing cabinet 😄, but due to various factors (including vacation) the cabinet is rather full at the moment -- ping me again if I haven't gotten to it in a month, okay? |
|
@djc polite ping! :) |
djc
left a comment
There was a problem hiding this comment.
Thanks for your patience! This needs a rebase and a few more tweaks.
| if S::on_char(c).end { | ||
| return end; | ||
| } |
There was a problem hiding this comment.
Can this be part of the match? Would be nice to reduce rightward drift for the \u{1b} case by handling it outside of the match.
| const START: char = ']'; | ||
|
|
||
| fn on_escape(next: Option<char>) -> EscAction { | ||
| if matches!(next, Some('\\')) { |
There was a problem hiding this comment.
Suggest simplifying this to be more like:
let end = matches!(next, Some('\\'));
EscAction { consume_next: end, end }
I noticed that using
indicatif(and friends) to embed a hyperlink in a console progress bar caused the wheels to fall off my app (with many newlines being spammed to the console and the auto-updating line-rewriting broken). I tracked the problem down to the OSC sequences incorrectly being interpreted as printable, and the following patch fixes the problem for me.