-
Notifications
You must be signed in to change notification settings - Fork 8.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[1.15+] Flushing FTCS sequences causes flickering in nushell 0.66+ #13710
Comments
(I'm supposed to be on vacation RN so apologies for the brevity in my notes) Hmmmmmmmmm. I wonder if this isn't playing nicely with the frame flushing. Like, when the prompt gets drawn, what's happening is a
The trick is that we're flushing all buffered state to the Terminal when we see a prompt sequence. The problem is that at the time the mark is re-rendered, the prompt line is empty, causing the flickering. No clever solutions off the top of the dome. I'll noodle on the drive home. Edit 2023/01/10: The above set of steps is wrong. Don't use that as a guide for what's happening. |
@zadjii-msft for what it's worth, we're tracking a related issue with WezTerm. I say they're related because disabling the Quoting here
You can see more of the detailed research here nushell/nushell#5585 |
Ah, that's probably another related issue. Before a few months ago, conpty didn't recognize those sequences at all, and would emit them immediately, possible before the rest of the "frame" they were emitted with. at the end of the day, it just means that FTCS sequence support on older Windows builds is gonna be wacky. Now, the Terminal uses an out-of-band version of the ConPTY apis. We do that so we can always use the If that all makes sense. |
It all makes sense except this was on an updated copy of Windows 11. So, I expect old versions to be wacky but hopefully recent Win10 and Win11 will behave better in the near future. |
I mean, FTCS support landed literally 3 months ago - I'm not sure it's even made its way to any official Windows builds yet 😅 |
FWIW, wezterm bundles and uses openconsole.exe and conpty.dll built from GitHub. I just updated it to the most recent tag this morning and the issue reproduces there too. |
Any update on this issue @zadjii-msft? |
Alas, no. I haven't noodled on this too much since getting back from leave, and I'm only just getting back into the swing of things after the holidays. I've got this marked up to take a look at ~this month, but I seriously doubt I'll have a good solution that fast. IIRC we briefly discussed some ideas, that might work okay in this specific scenario, but wouldn't work more broadly for the other sequences that are leveraging the same flushing that we do here (looking at you alt buffer sequences). I can't remember the details though 😕 |
I would also really appreciate a solution for this. Makes using Windows Terminal a pain right now because of all the flickering. |
(huge apologies to folks following this thread, these notes are an unintelligible stream of consciousness) Refer to #13163 My outline of events in #13710 (comment) might be wrong[1]. Look at the video closer - is that it? The left prompt is always visible, even as command and right prompt are flickering. Hmm. This diff would seem to suggest that the prompt is written as one long string, "
ConPty always flushes all FTCS's in 1.15. On "
as three frames. That it shouldn't. That probably should all be one frame. Can we just I'll keep editing with notes as I go [1] it might not be, I've re-edited this comment like 10 times as writing it This is what I get out the debug tap. Now, where are the frames....
CR, cursor off, Cursor Forward 17 (?!), mark
This is what actually gets written to conhost
Okay playing with this more locally, and staring at it, I do see the prompt section flickering as I'd expect. So, I guess the trick now is that even if we do not immediately flush the frame, a regular frame might come in in the middle of the string. Hmm. Bad idea
The console should be locked for that whole write, start to finish. |
I accidentally discovered one configuration in which nushell does not seem to flicker within Windows Terminal:
In contrast, all of the following exhibit the flicker in Windows Terminal (on the same Windows 11 22H2 system):
Absolutely no idea what it is about the former configuration that differs from the latter three in terms of flicker-proneness, but posting just in case it may be a clue for anyone who has a better bead on this. |
@jxcrw that makes sense. The
|
A fix was mentioned in another thread and I can confirm it works:
It should stop flickering now. I don't know what the downside is for disabling shell integration, everything seems to work totally fine over a month in. |
@popcar2 When you disable |
Interestingly, there is no such problem in the terminal of vscode |
any update? This problem does not occur when nushell runs on alacritty ;-) |
Alacritty does not seem to support OSC133 ;-) |
Tl;dr: Conpty would flush a frame whenever it encountered a FTCS mark. Combine that with the whole-line redrawing that nushell does, and the Terminal would get the prompt in two frames instead of one, causing a slight flickering. This fixes that by rendering the frame, but not flushing to the pipe when we encounter one of these sequences. Closes #13710 A complication here: there are some sequences that we passthrough _immediately_ when we encounter them. For example, `\x1b[ 2q`. we need to also not flush when we encounter one of these sequences. nushell emits one of these as a part of the prompt, and that would force the buffered frame to get written _anyways_, before writing that to the pipe.
Nushell is still flickering when used within Windows Terminal (both MS store stable/preview + latest GitHub release). |
What version are you on exactly? I just tried 1.18.1462 here and I don't see any flickering. Perhaps what you're seeing is one of the newer rendering bugs? That might repro regardless of what shell you're using. Could you share your settings.json? |
nu v0.80.0 |
Oh good, I'm glad! This was a tricky fix so I'm really glad it did work after all. Looks like our friendly neighborhood bot is having a tough time this week and forgot to come around with release notes. This fix shipped in Terminal Preview 1.18 earlier this week. |
No flickering issues with nushell and v1.18 when I tested (great job with this!!!), although it wasn't real stable. I also noticed that the right click command selection was selecting the wrong data. I tried the debug tap and think our escapes look good. |
if one of you could check this behavior with the current nightly build of wezterm, I'd appreciate it: I updated the bundled conpty pieces to match 0ee2c74 of this repo, so my understanding is that this should be fixed in wezterm now too. |
Uh oh, the terminal flickering is back! I can reproduce it in Terminal Preview 1.20.10303.0 and Nu 0.90.1. I cannot reproduce it in Terminal 1.18.10301.0. It seems to occur with or without AtlasEngine enabled. @zadjii-msft Would you like me to open a new issue for this? |
@rgwood I can't reproduce any flickering when using nushell's default out-of-the-box configuration. I think it'd be best to open a new issue for this. I don't think it'll be necessary to describe the issue in detail - IMO you can just refer to this issue (#13710) in your description. 😅 Given that I don't have this issue, could you check if it occurs when you use the default configuration? If it doesn't reproduce for you either, it'd be nice if there was some way to figure out which option or plugin in nushell causes the issue. (...since reproducing it locally would help me a lot while fixing it. 🙂) |
@lhecker I'm really sorry, I should have clarified that this only occurs with Easiest way to change this setting is by opening the config file with |
Thanks! That was super easy to reproduce. I should've realized that given that this issue was also about FTCS. I've opened #16769 so we don't ping the ~dozen people on this issue unnecessarily. I'll try to fix it soon (if possible). |
Windows Terminal version
1.15.2003.0
Windows build number
Microsoft Windows [Version 10.0.22000.795]
Other Software
Nushell v0.66+
Steps to reproduce
Hi, I work on a cross-platform shell called Nushell and we've noticed a rendering regression in Windows Terminal Preview v1.15.
Nushell's prompt now flickers on every keystroke. The following recording illustrates the problem (but it's a little worse in real life, the recording didn't capture every flicker):
2022-08-09_11-27-44.mp4
To reproduce this, run any version of Nushell from v0.66 or later and start typing. Nushell can be downloaded from our GitHub releases or installed with Scoop (
scoop install nushell
) or winget (winget install nushell
).nu.exe
is the executable for Nushell.Details / Investigation
The flickering does not occur in Windows Terminal v1.14.1963.0.
We bisected Nushell's code and found that the flickering did not occur prior to this PR which added some scroll mark ANSI escape codes for VS Code. WT v1.15 Preview added experimental support for scroll marks; maybe this is a bug in the experimental scroll mark code?
The flickering occurs even with the scroll mark settings (
experimental.autoMarkPrompts
andexperimental.showMarksOnScrollbar
) set to false.If there's anything else we can do to help with investigation or reproduction, just let me know!
The text was updated successfully, but these errors were encountered: