Question: import { WebviewResourceProvider } from './util/resources'; import { isOfScheme, Schemes } from './util/schemes'; <del> const UNICODE_NEWLINE_REGEX = /u2028|u2029/g; </del> /** * Adds begin line index to the output via the 'data-line' data attribute. */

When rendering Markdown preview, Unicode newline characters U+2028 LINE SEPARATOR and U+2029 PARAGRAPH SEPARATOR are replaced with an empty string at the source preprocessing stage. This behavior was introduced in to but it breaks the document in multiple ways: double-click word selection does not work as expected, screen readers may announce the text incorrectly, line wrapping and hyphenation does not work correctly, markdown-it plugins that rely on or may work incorrectly, even linkify fails: and so on. Since then it was fixed at the markdown-it side, and is no longer needed: It would be better to revert this change, and keep the Markdown source as is before feeding it to the parser. Steps to reproduce: a Markdown document like this: preview: Expected result: LS and PS are displayed as is, links end at Unicode newlines. Actual result: no Unicode newline characters displayed, links also consume the immediately following word. <!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Read our guide about submitting issues: --<!-- Search existing issues to avoid creating duplicates. --<!-- Test using the latest Insiders build to see if your issue has already been fixed: --<!-- Instead of creating your report here, use 'Report Issue' from the 'Help' menu in VS Code to pre-fill useful information. --<!-- Launch with to check. --Does this issue occur when all extensions are disabled?: Yes <!-- If you answered No above, use 'Help: Start Extension Bisect' from Command Palette to try to identify the cause. --<!-- Issues caused by an extension need to be reported directly to the extension publisher. The 'Help Report Issue' dialog can assist with this. --- VS Code Version: OS Version: WindowsNT x64 10.0.
<!-- AUTHORVERIFICATIONREQUEST --This bug has been fixed in the latest release of ! you can help us out by commenting if things are now working as expected. If things still don't seem right, please ensure you're on version of Insiders (today's or later - you can use in the command palette to check), and leave a comment letting us know what isn't working as expected. Happy Coding!


Question: } .quick-input-widget .interactive-session .interactive-input-part .interactive-execute-toolbar { <del> bottom: 1px; </del> <ins> margin-bottom: 1px; </ins> } .quick-input-widget .interactive-session .interactive-input-and-execute-toolbar {

In VS Code action items inside inputs are vertically aligned to top, in the Chat features they are centered in the middle. This happens when putting in a lot of text or pressing Shift+Enter. Panel: <img width="425" alt="image" src=""Inline: <img width="608" alt="image" src=""Quick: <img width="621" alt="image" src=""For Inline and Quick the action items to the right of the input box should also stick to the top.
Seems like we have a mix of top-aligned and overflow w/ scroll (see below). But I agree that we should be consistent as much as possible. But it does feel like a chat send button should generally but aligned to the bottom, no? We may even consider rendering the toolbar on its own row once we're into multiple lines. That would ensure the text isn't forced to fill a tiny space now that we have 2+ icons. Here's how Teams does it as an example: ! ! ! !
Would be awesome if the text could wrap around it, especially in the narrow search widget case, I've always wanted that but I think it would be a pain to implement.
Don't have a strong opinion about top or bottom, I think each can be justified on a case-by-case basis. but middle looks weird. :) For example, inline Chat may want to do top alignment as the icons would align with those outside the input field (poppet and close) Bottom would help with the wrapping.


Question: builtin printf "e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/x1b/x1b/g')a" __vsc_report_prompt() { <ins> # HACK: Git bash is too slow at reporting the prompt, so skip for now if [ "$__vsc_is_windows" = "1" ]; then return fi </ins> # Expand the original PS1 similarly to how bash would normally # See https://stackoverflow.com/a/37137981 for technique if ((BASH_VERSINFO[0] >= 5 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 4))); then

Type: <bBug</bterminal git bash Enter and you will get delay VS Code version: Code - Insiders 1.90.0-insider (, 2024-05-06T08:07:13.626Z) OS version: WindowsNT x64 10.0. Modes: <details<summarySystem Info</summary </details<details<summaryExtensions (42)</summaryExtensionVersion ------ rust-bundle1.0.0 glance0.0.8 project-manager12.8.0 redmodscript-lang0.2.0 redmodtweak-lang0.1.0 lit-html1.11.1 glsl-literal1.0.6 vscode-markdownlint0.55.0 vscode-eslint2.4.4 composer-php-vscode1.45. intelli-php-vscode0.12. phptools-vscode1.45. profiler-php-vscode1.45. rust-syntax0.6.1 gitlens14.9.1 EditorConfig0.16.4 prettier-vscode10.4.0 auto-close-tag0.5.15 auto-rename-tag0.1.10 copilot1.186.856 copilot-chat0.16. todo-tree0.0.226 path-autocomplete1.25.0 redscript-syntax-highlighting0.0.3 auto-comment-blocks1.0.1 dotenv1.0.1 debugpy2024.6.0 python2024.6.0 vscode-pylance2024.4.1 remote-wsl0.88.2 hexeditor1.10.0 vscode-extension-auto-import1.4.3 indent-rainbow8.3.1 vscode-yaml1.14.0 rust-analyzer0.3.1950 crates0.6.6 shader1.1.5 vscode-styled-components1.7.8 vscode-stylelint1.4.0 vscode-mdx1.8.4 highlight-matching-tag0.11.0 vscode-import-cost3.3.0 (1 theme extensions excluded) </details<details<summaryA/B Experiments</summary</details<!-- generated by issue reporter --
does this reproduce if you disable shell integration, ?
If I uncheck Shell Integration, it works well after terminal restart.
I have more details in with what's going wrong.


Question: builtin printf "e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/x1b/x1b/g')a" __vsc_report_prompt() { <ins> # HACK: Git bash is too slow at reporting the prompt, so skip for now if [ "$__vsc_is_windows" = "1" ]; then return fi </ins> # Expand the original PS1 similarly to how bash would normally # See https://stackoverflow.com/a/37137981 for technique if ((BASH_VERSINFO[0] >= 5 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 4))); then

The issue was introduced by this PR where becomes extremely slow
I had the same issue and setting to does the trick.
When I just hit the enter key on a bash prompt it takes about 4 seconds for the prompt to return. I ran process monitor and noticed many many (maybe over a hundred) instances of being spawned to run the shellIntegration- script.
Any idea where this ticket is tracked? Every reference to the issue is closed marking duplicate.
Closing an unfixed issue that everyone have ? I don't get the point
I closed this accidentally, have reopened.
worked for me !
Hey guys I'm having the same issue. Running a single is taking over 15 seconds to complete the command. After disabling , bash looks way better
The problem seems to be related to The issue happens also if I start (outside VsCode) my bash thus (same as VsCode does for its terminal): Each time the prompt must be shown (eg, after simply pressing the Enter key) a delay of about two seconds happens. Most of the delay is caused, it seems, by the function In particular, commenting out the line 178 seems to alleviate good part (not all) of the delay. Edit: More specifically, the culprit seems to be If I change the line 109 from to (effectively forcing "the switch to the faster function"), the problem goes away. (BTW: the faster function seems to have a bug of its own, it produces an extra prompt!)
Process monitor screenshot shows it re-running this over and over 89 times when I press enter at the shell prompt "C:Program FilesGitbin..usrbin" --init-file "c:UsersarthuAppDataLocalProgramsMicrosoft VS Coderesourcesapp/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-" !
Disabling is another workaround that improves the delay for me.
Hello Guys, This setting worked for me.
This helped me, thanks!
will move you to the old backend stack which significantly reduces the functionality/capabilities of the terminal. shouldn't do anything. is the right workaround for now, expect a fix soon though
what caused so many bash invocations when shell integration is enabled?
we started reporting the bash prompt in order to better position shell integration markers and understand the prompt.


Question: builtin printf "e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/x1b/x1b/g')a" __vsc_report_prompt() { <ins> # HACK: Git bash is too slow at reporting the prompt, so skip for now if [ "$__vsc_is_windows" = "1" ]; then return fi </ins> # Expand the original PS1 similarly to how bash would normally # See https://stackoverflow.com/a/37137981 for technique if ((BASH_VERSINFO[0] >= 5 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 4))); then

Apparently printf is just extremely slow on git bash
I had this terminal slowdown problem, in git bash, and found setting fixed the problem - the terminal was back to being fast. However, after the last, or recent, insiders update, even with that setting set to , the terminal is slow again - and it's showing the icons, etc. like it is ignoring this setting: ! !
you probably just didn't restart the terminal. This is now fixed and will come in the next Insiders and likely 1.90.1
Actually, I had the shell integration disabled for the last several insiders updates, so it has been off for a while. Terminal windows have been created and closed many time since. For whatever reason, when launching VSCode and the terminal session was restored, this last time, the integration feature was ignoring the flag. I terminated the terminal and started another, and the integration went away again. So basically the integration flag was ignored when the terminal session was restored. I just did a quick test of quitting VSCode, with a terminal window open, then relaunching, and the integration was still disabled. Unsure what happened. Guessing, also, you type-o-ed the version? I am already running 1.91.0 insider !
what happened was the terminal was restored which re-creates the process after vscode starts with the original environment, args, etc. No the next insiders build on Monday and v1.90.1 (stable)
when will be the next minor update, not the insider build so this terminal slowness is resolved?
FWIW, I can also observe the prompt's slowness on Linux (bash 5.1.16(1)-release on Ubuntu 22.04.4 LTS) on the order of a half-second or so (still annoying but bearable). looks like a temporary workaround for Git Bash only; will we fix the underlying cause of the slowness?
I also observe this to be slow over linux using an ssh remote. It's much slower if I have a starship prompt enabled (4s) and around 1s if I have the default debian prompt.
I have this issue (Win 10, git bash). The suggested workaround of disabling shell integration then restarting terminals worked for me.
Also having this problem. Disable terminal integration worked for me too. (Win 11, Git bash).


Question: builtin printf "e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/x1b/x1b/g')a" __vsc_report_prompt() { <ins> # HACK: Git bash is too slow at reporting the prompt, so skip for now if [ "$__vsc_is_windows" = "1" ]; then return fi </ins> # Expand the original PS1 similarly to how bash would normally # See https://stackoverflow.com/a/37137981 for technique if ((BASH_VERSINFO[0] >= 5 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 4))); then

I re-enabled terminal integration with the latest Insiders - ! and it the problem seems to have been fixed. For me at least.
Yes, it's been fixed in insider's already.
Perfect solution
When is the release date for the VSCode stable one?
no exact date, but probably later this week
, Turning off shell integration only sorta helped me out. It does return a result slightly faster, but it does not return the prompt back for 4 seconds or so, but only with python poetry workspaces/folders opened. This slowness goes away if I don't have a workspace/folder open, a non-poetry python one, a javascript one, etc. There's now a '(packagename-pythonversion)' at the top of my prompt when I open a python poetry folder and that seems to be taking forever to generate after each command. Definitely wasn't happening before my last update. This seems like a separate issue? Or is it related somehow? Happy to open a separate Issue if needed.
I don't know if this is the same as your issue but I've found that, if I already opened a terminal in a workspace before changing the setting, I had to kill the terminal for that workspace and open a new one so it would be initiated with the updated setting.
Yes. With the feature disabled, issue does not happen . But the feature will not work also . I can live without that feature but I like it. It makes my IDE look smarter. It's strange. I remember the feature was there earlier without any issue.
Was the fix included in 1.90.1? The shell integration is still too slow even after I updated to 1.90.1. It still takes over a second for all those bash commands to run every time press the enter key at the terminal. I have to keep it off to keep my Windows git bash terminal usable. It seems like it takes around a second and a half to get a new prompt with that setting on. Is this expected?


Question: builtin printf "e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/x1b/x1b/g')a" __vsc_report_prompt() { <ins> # HACK: Git bash is too slow at reporting the prompt, so skip for now if [ "$__vsc_is_windows" = "1" ]; then return fi </ins> # Expand the original PS1 similarly to how bash would normally # See https://stackoverflow.com/a/37137981 for technique if ((BASH_VERSINFO[0] >= 5 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 4))); then

I just updated to this version: Version: 1.90.1 (user setup) Commit: Date: 2024-06-11T21:01:24.262Z Electron: 29.4.0 ElectronBuildId: Chromium: 122.0.6261.156 20.9.0 V8: 12.2.281.27-electron.0 OS: Windows_NT x64 10.0.
it should be fixed yes, can you run and paste in the results?
$ for i in {1..10}; do time _vscreport_prompt; done real 0m0.236s user 0m0.045s sys 0m0.092s real 0m0.194s user 0m0.045s sys 0m0.076s real 0m0.210s user 0m0.030s sys 0m0.122s real 0m0.217s user 0m0.015s sys 0m0.152s real 0m0.216s user 0m0.061s sys 0m0.138s real 0m0.245s user 0m0.045s sys 0m0.123s real 0m0.202s user 0m0.015s sys 0m0.091s real 0m0.212s user 0m0.061s sys 0m0.091s real 0m0.230s user 0m0.000s sys 0m0.153s real 0m0.212s user 0m0.045s sys 0m0.108s
It seems like it's taking a long time to parse the prompt. My git bash prompt is user MINGW64 /c/path/to/dir (master), where the my /c/path/to/dir is a 29 character path. But sometimes it's a lot longer. Does a longer path make it slower?


Question: builtin printf "e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/x1b/x1b/g')a" __vsc_report_prompt() { <ins> # HACK: Git bash is too slow at reporting the prompt, so skip for now if [ "$__vsc_is_windows" = "1" ]; then return fi </ins> # Expand the original PS1 similarly to how bash would normally # See https://stackoverflow.com/a/37137981 for technique if ((BASH_VERSINFO[0] >= 5 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 4))); then

When I cd to a 135 character path, and try to time it it just prints 633;D;0: $ time vscreportprompt 633;D;0 $ vscreportprompt 633;D;0
those numbers aren't too bad, but regardless I think we need to rethink how we're doing this prompt reporting feature. I'm going to stick it behind a setting in so it's just disabled completely by default.
This is still unreasonably slow, IMO. If I'm running a shell with the extensions the shortest possible interval between two commands seems to be over 700ms on my machine: ! Running without the shell integration, it's closer to 250ms, and that may only be because that's how fast I can press the ⇧⏎⇧⏎ keys: ! Despite the improvement over 1.90.0, I still feel like I have to disable the shell integration. It's 2024. Having to wait a perceptible amount of time just for the terminal prompt to re-appear feels like a huge regression to 1980s computing. Is my floppy drive trying to seek to a specific sector?
v1.91 which I think is being released today includes the changes I mentioned in , disabling the prompt reporting stuff completely (for the stable build): !
I'm running 1.91.0 (insiders) and I still see a significant delay between prompts (on windows, using git-bash terminal). Turning the shell integration off speeds it up quite a bit.
it's only disabled in the stable build. Insiders keeps the slower code as it provided reliability improvements and the plan is to optimize it soon.
While v1.91 does seem to improve the delay, there's still a noticeable delay for me so I'll be sticking with the option disabled.


Question: const keybindingsExtPoint = ExtensionsRegistry.registerExtensionPoint<ContributedKeyBinding | ContributedKeyBinding[]>({ extensionPoint: 'keybindings', <ins> deps: [commandsExtensionPoint], </ins> jsonSchema: { description: nls.localize('vscode.extension.contributes.keybindings', "Contributes keybindings."), oneOf: [

contribute command that uses enablement assign a keybinding, via :bug: enablement isn't honoured
When users configure keybindings we allow them to change preconditions as well, e.g rename requires an editable document so I don't plan to have a different strategy for contributed commands
I don't see the nice "Command 'Hello World' is not enabled in the current context." info toast when I try the keybinding though. I only see that message when I try to run it from the command palette. The command correctly doesn't run when not enabled though.
Yeah, that's the design. Keybindings don't show messages


Question: } const index = this.mustGetTaskIndex(taskId); <ins> const oldTerminalStatePrio = terminalStatePriorities[entry.tasks[index].state]; const newTerminalStatePrio = terminalStatePriorities[state]; // Ignore requests to set the state from one terminal state back to a // "lower" one, e.g. from failed back to passed: if (oldTerminalStatePrio !== undefined && (newTerminalStatePrio === undefined || newTerminalStatePrio < oldTerminalStatePrio)) { return; } </ins> this.fireUpdateAndRefresh(entry, index, state, duration); }

<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Read our guide about submitting issues: --<!-- Search existing issues to avoid creating duplicates. --<!-- Test using the latest Insiders build to see if your issue has already been fixed: --<!-- Instead of creating your report here, use 'Report Issue' from the 'Help' menu in VS Code to pre-fill useful information. --<!-- If you answered No above, use 'Help: Start Extension Bisect' from Command Palette to try to identify the cause. --<!-- Issues caused by an extension need to be reported directly to the extension publisher. The 'Help Report Issue' dialog can assist with this. --- VS Code Version: 1.64.0-insider () In the Catch2 C++ test framework it is possible to have multiple test results for the same test in one run. This happens for example for the following code: In this scenario, the section "S" is run twice, and the first time it fails, the second time it succeeds. The C++ TestMate extension will see the two test runs, and call for the first one, and for the second, with the same for both calls. This results in the confusing display that the section is green, even though it shows a failure inside: <img width="653" alt="image" src="https://user-" does it make sense to change and (et al) so that when called multiple times, it sets the item's state to the max of the old and the new state? This seems to be analogous to what happens with the test messages (they are appended, and doesn't clear them). Or would you say it's the extension's responsibility to not set the state more than once for a given TestItem? (Cc Or maybe it is even Catch2's responsibility to accumulate the results for any section that is run more than once?
IMHO, Catch2 reports it and definitely not the responsibility of vscode. It leaves it to me.. (Though I don't know how I can solve this properly)
Why definitely? It doesn't seem so unreasonable to me. As I said, it already does something similar with the test messages.
As I think of it, vscode part is just the UI, the controlling is in my hand. More precisely and . the test provider is the .


Question: } const index = this.mustGetTaskIndex(taskId); <ins> const oldTerminalStatePrio = terminalStatePriorities[entry.tasks[index].state]; const newTerminalStatePrio = terminalStatePriorities[state]; // Ignore requests to set the state from one terminal state back to a // "lower" one, e.g. from failed back to passed: if (oldTerminalStatePrio !== undefined && (newTerminalStatePrio === undefined || newTerminalStatePrio < oldTerminalStatePrio)) { return; } </ins> this.fireUpdateAndRefresh(entry, index, state, duration); }

I'm not so sure in this case. VS Code is also responsible for setting T's state correctly, you don't do that at all (as far as I'm aware). And note that it gets that one right, so it has some logic already for computing the resulting state of all child runs if there are multiple for the same item.
I would be very interested in your opinion on this.
Yea, I think it would be reasonable to no-op if the extension tries to change the test state to one with a lower priority. For instance, going from passed-skipped or failed-passed.
can you add some steps?
the test sample: this block F5.Verify that, with these changes, test that should pass remain passed in the UI, and tests that failed remain failed.


Question: if (this.widget.viewModel) { this.chatService.clearSession(this.widget.viewModel.sessionId); } <ins> this.viewState.inputValue = ''; </ins> this.updateModel(); }

I use quite a lot and have noticed that sometimes earlier queries are restored after runs. AFAICT it might be because when we run , the restores the input value from the saved view state, which can be stale
Blocked on verifying by
you can work around that issue by manually typing /clear into the input box, that issue only applies to when /clear is selected from the suggest widget


Question: return; } <ins> if (e.browserEvent.defaultPrevented) { return; } </ins> super.onDoubleClick(e); } }

see gif open GH notebook with a few cell that reference a variable run peek references and select entries notice how notebook cells are being highlighted, like "Milestone Work" get selected !
I can repro in Insiders but not master, I'll check again tomorrow
This happens because of this listener: Tho, not yet sure why the selection keeps changing... Maybe some inner list event (from the references list) bubbles up to the outer list
That listener is fine, it's the nested lists
Hey do you have any thoughts on handling this? We have a list inside another list. The inner list handles the touch event properly. The outer list then handles the event and picks up the wrong index because it finds the data attribute inside the inner list in We can Make sure the event is fired on the outer list with the correct element, by fixing to check whether it's in the right list Not fire the event on the outer list at all, when we see that it originates in a different list Add some property to the list event that says it originated in a different list so the consumer can decide In this particular case, I think any of these are fine
Thinking more, I don't think that the event should ever be handled by two lists at all. Meaning we either mark the browserEvent as handled, like with preventDefault/isDefaultPrevented, or we make the list check every event to be sure that it originated in this list.
This sounds good to me. This also sounds good to me.
related when I do peek references, I see markdown cells being selected? ! Notice I'm looking for under-discussion but "Configure" is being highlighted as one of the references
From Good catch, I didn't notice that
Thanks for the quick handling!


Question: } this._currentCommand.commandFinishedMarker = this._terminal.registerMarker(0); <del> const command = this._currentCommand.command; </del> <ins> let command = this._currentCommand.command; </ins> this._logService.debug('CommandDetectionCapability#handleCommandFinished', this._terminal.buffer.active.cursorX, this._currentCommand.commandFinishedMarker?.line, this._currentCommand.command, this._currentCommand); this._exitCode = exitCode;

<!-- Do Not Delete This! featurerequesttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Describe the feature you'd like. --The vscode shell integration currently needs to be turned off or disabled for anyone with complex prompt commands, or any trap DEBUG. Please consider supporting some kind of chaining model so we can work with the shell integration as needed. Even better - use the defacto package that has already been written. VSCode is the 3rd script that wants to mess with prompts and traps - but it's the first to completely ignore Please consider shipping this along side and sourcing/using it. If that is unacceptable, consider at least detecting this module has been loaded as documented in the repo - and using it: fwiw: iterm2 has very very similar functionality to the vscode shell integration, but I've been able to work with it. Although they embedded the script directly, they kept the compatible function names and mechanisms and interop fine.
I believe we have already fixed this: Adding to make sure
Well, line 100 breaks my prompt. Adding the line as the 1st line of vscpreexec shows why. I think perhaps there needs to be 1 more state 'not in prompt' that causes preexec to bail until all promptcommand processing is done. Alternatively, if this is all to send vsccommandoutputstart - it seems like using PS0 on bash = 4.4 would be a lot cleaner?
Hi This was on 1.67.2 with dropped in place.
We've made some big changes in the past few days around debug trap and PS1 handling in bash, I believe the issues here are fixed. We may at some point hook into similar to but for now that will just increase the number of cases we would need to test for (contributions very welcome).
Actually I'll keep this open with help wanted to track integrating with bash-preexec.
OK. Pulling the - Things look better, but not quite right. The problems I see (only when DEBUG trap is being used): Still seems to be not preserving $? for promptcommand Seems to execute the trap twice. repro with setup instructions below: Do 'cd' into some directory. The command '..' should then pop one directory up, but it will try to process twice and pop twice.


Question: } this._currentCommand.commandFinishedMarker = this._terminal.registerMarker(0); <del> const command = this._currentCommand.command; </del> <ins> let command = this._currentCommand.command; </ins> this._logService.debug('CommandDetectionCapability#handleCommandFinished', this._terminal.buffer.active.cursorX, this._currentCommand.commandFinishedMarker?.line, this._currentCommand.command, this._currentCommand); this._exitCode = exitCode;

Instead of 'success dots' in the gutter, all commands seem to think there are fail exit status. Here are my dotfiles: and a branch to help debug: The debug branch just build an array of what commands were that triggered the trap and print them at the start and end of building the prompt. It does show the trap being called twice when shell integration is enabled - and once otherwise. The repro environment/steps: Repros in OSX and WSL Ubuntu 22.04 for me. It uses dotbot. In a scratch user directory you can run ./install to link everything into ~/. Pass to ./install to avoid installing extra tooling it finds missing (pygments/tmux/coreutils)There is a script that get's sourced . This is the root of all evil. It's on the hacky side. The function is small and is (I believe) the only relevant part. I should stop using it, but it's sooooo_ ingrained into my muscle memory. To verify: Removing from makes everything work great with none of the above mentioned problems. One hack, that seems irrelevant is that uses debug trap directly, but also detects and uses the pre-exec infrastructure if it has been loaded (to not break iTerm2's shell integration). I appreciate the time and effort going into this feature. It's becoming a shockingly advanced embedded shell environment.
thanks again, planning on tackling this in June
I use just merged in a fix for this. It would be great if someone could help verify in tomorrow's insiders build as I'm not normally a user of bash-preexec.
Still some problems around . Very simple repro: clean environment. My bash and vscode versions are: use this .bashrc: For me (In WSL, repros in plain OSX): ! Without ! If extdebug works, then this would be the next simplest test (I think). Same clean environment. The following
Are there verif steps for this?
<!-- AUTHORVERIFICATIONREQUEST --This bug has been fixed in the latest release of ! you can help us out by commenting if things are now working as expected. If things still don't seem right, please ensure you're on version of Insiders (today's or later - you can use in the command palette to check), and leave a comment letting us know what isn't working as expected. Happy Coding!


Question: } this._currentCommand.commandFinishedMarker = this._terminal.registerMarker(0); <del> const command = this._currentCommand.command; </del> <ins> let command = this._currentCommand.command; </ins> this._logService.debug('CommandDetectionCapability#handleCommandFinished', this._terminal.buffer.active.cursorX, this._currentCommand.commandFinishedMarker?.line, this._currentCommand.command, this._currentCommand); this._exitCode = exitCode;

With the more complicated scenario, the decorations don't seem to show blue and red anymore. ! I realize that in the screenshot I forgot to add , but that didn't make a difference.
what is your exact debug trap when that happens?


Question: registerEditorCommand(new CursorWordStartRightSelect()); registerEditorCommand(new CursorWordEndRightSelect()); registerEditorCommand(new CursorWordRightSelect()); <ins> registerEditorCommand(new CursorWordAccessibilityLeft()); registerEditorCommand(new CursorWordAccessibilityLeftSelect()); registerEditorCommand(new CursorWordAccessibilityRight()); registerEditorCommand(new CursorWordAccessibilityRightSelect()); </ins> registerEditorCommand(new DeleteWordStartLeft()); registerEditorCommand(new DeleteWordEndLeft()); registerEditorCommand(new DeleteWordLeft());

Type: <bBug</bCC [I cannot easily find my authored issue so I am creating a new] Ctrl+LeftArrow and Ctrl+RightArrow does not work in the Output View (Ctrl+Shift+U) area. This happens on Windows. This means screen reader users cannot navigate word by word within the output view. Ctrl+Shift+U to focus in the Output View Choose any output (e.g., terminal) if you can navigate word by word via Ctrl+LeftArrow or Ctrl+RightArrow VS Code version: Code - Insiders 1.92.0-insider (, 2024-07-12T05:08:08.550Z) OS version: WindowsNT x64 10.0. Modes: <details<summarySystem Info</summary </details<details<summaryExtensions (125)</summaryExtensionVersion ------ vscode-openapi4.27.0 zotenote1.0.1 android-dev-ext1.4.0 aiprm-lang0.0.2 Bookmarks13.5.0 openscad1.2.2 spellright3.0.134 zoterolatex0.4.1 mermaid-markdown-syntax-highlighting1.6.0 external-pdf1.2.0 doxdocgen1.4.0 vscode-markdownlint0.53.0 vscode-eslint3.0.10 vscode-quick-select0.2.9 vscode-deno3.38.0 gitlens14.6.1 EditorConfig0.16.4 prettier-vscode10.1.0 figma-vscode-extension0.3.5 vscode-firefox-debug2.9.10 shell-format7.2.5 vscode-google-translate1.4.13 codespaces1.17.1 copilot1.213.0 copilot-chat0.18. remotehub0.62.0 vscode-github-actions0.26.2 vscode-pull-request-github0.93.


Question: registerEditorCommand(new CursorWordStartRightSelect()); registerEditorCommand(new CursorWordEndRightSelect()); registerEditorCommand(new CursorWordRightSelect()); <ins> registerEditorCommand(new CursorWordAccessibilityLeft()); registerEditorCommand(new CursorWordAccessibilityLeftSelect()); registerEditorCommand(new CursorWordAccessibilityRight()); registerEditorCommand(new CursorWordAccessibilityRightSelect()); </ins> registerEditorCommand(new DeleteWordStartLeft()); registerEditorCommand(new DeleteWordEndLeft()); registerEditorCommand(new DeleteWordLeft());

cloudcode2.14.0 overleaf-workshop0.13.0 cslpreview0.2.2 path-autocomplete1.25.0 latex-workshop10.1.0 lilypond-syntax0.1.1 scheme0.2.0 better-cpp-syntax1.17.2 commitlint2.6.0 language-julia1.90.1 google-search0.0.1 vscode-lua-format1.3.8 lilypond-formatter0.2.3 lilypond-pdf-preview0.2.8 lilypond-snippets0.1.1 vslilypond1.7.3 language-matlab1.2.4 zotero0.1.11 git-graph1.30.0 azure-dev0.8.3 vscode-azureappservice0.25.2 vscode-azurecontainerapps0.6.1 vscode-azurefunctions1.15.1 vscode-azureresourcegroups0.8.3 vscode-azurestaticwebapps0.12.2 vscode-azurestorage0.16.0 vscode-azurevirtualmachines0.6.5 vscode-cosmosdb0.22.0 vscode-docker1.29.1 vscode-edge-devtools2.1.5 black-formatter2024.3. debugpy2024.9. flake82023.13. isort2023.13. python2024.11. vscode-pylance2024.7.1 jupyter2024.6. jupyter-keymap1.1.2 jupyter-renderers1.0.18 vscode-jupyter-cell-tags0.1.8 vscode-jupyter-slideshow0.1.5 remote-containers0.377.0 remote-ssh0.113. remote-ssh-edit0.86.0 remote-wsl0.81.8 vscode-remote-extensionpack0.25.0 azure-account0.12.0 azure-repos0.38.0 cmake-tools1.18.43 cpptools1.21.0 cpptools-extension-pack1.3.0 js-debug-nightly2024.7.517 powershell2024.3.2 remote-explorer0.5. remote-repositories0.40.0 remote-server1.6.


Question: registerEditorCommand(new CursorWordStartRightSelect()); registerEditorCommand(new CursorWordEndRightSelect()); registerEditorCommand(new CursorWordRightSelect()); <ins> registerEditorCommand(new CursorWordAccessibilityLeft()); registerEditorCommand(new CursorWordAccessibilityLeftSelect()); registerEditorCommand(new CursorWordAccessibilityRight()); registerEditorCommand(new CursorWordAccessibilityRightSelect()); </ins> registerEditorCommand(new DeleteWordStartLeft()); registerEditorCommand(new DeleteWordEndLeft()); registerEditorCommand(new DeleteWordLeft());

vscode-github-issue-notebooks0.0.130 vscode-node-azure-pack1.2.0 vscode-selfhost-test-provider0.3.25 vscode-serial-monitor0.12.0 vscode-speech0.10.0 vscode-speech-language-pack-ko-kr0.4.0 vsliveshare1.0.5932 windows-ai-studio0.3.3 autodocstring0.6.1 pandocciter0.10.4 publisher1.1.3 shiny1.0.0 shinyuieditor0.5.0 quarto1.113.0 r-debugger0.5.4 java1.32.0 vscode-xml0.27.1 vscode-yaml1.14.0 r2.8.4 multi-command1.6.0 AudioQ0.0.2 vscode-deepl1.1.1 abc-music0.4.0 lua3.9.3 latex-utilities0.4.14 cmake0.0.17 vscode-terminal-here0.2.4 windows-terminal0.7.0 errorlens3.16.0 intellicode-api-usage-examples0.2.8 vscodeintellicode1.2.30 vscode-conventional-commits1.25.0 vscode-arduino0.6. vscode-java-debug0.58.0 vscode-java-dependency0.23.7 vscode-java-pack0.27.0 vscode-java-test0.41.1 vscode-maven0.44.0 zotero-cite0.8.6 markdown-all-in-one3.6.2 grammarly0.25.0 (1 theme extensions excluded) </details<details<summaryA/B Experiments</summary</details<!-- generated by issue reporter --
do you know why this isn't currently supported?
It seems to work for me in Mac, are you seeing it otherwise?
It does work for me, although sometimes with the screen reader enabled, it's reading the word then a whole chunk of text. I'll try on windows.
It’s not working in Windows.
Can reproduce on windows. I see that this is happening because there's a part of the when clause for and of for windows
Removing that from the clause fixes it. Looks like that condition was to fix this can you try removing that condition from the clause and seeing if you experience any consequences of doing so?


Question: return true; } <del> const domain = `${url.scheme}://${url.authority}`; </del> for (let i = 0; i < trustedDomains.length; i++) { if (trustedDomains[i] === '*') { return true; } <del> if (trustedDomains[i] === domain) { </del> <ins> if (isTrusted(url.toString(), trustedDomains[i])) { </ins> return true; } <ins> } </ins> <del> let parsedTrustedDomain; if (/^https?:///.test(trustedDomains[i])) { parsedTrustedDomain = URI.parse(trustedDomains[i]); if (url.scheme !== parsedTrustedDomain.scheme) { continue; } } else { parsedTrustedDomain = URI.parse('https://' + trustedDomains[i]); } </del> <ins> return false; } </ins> <del> if (url.authority === parsedTrustedDomain.authority) { if (pathMatches(url.path, parsedTrustedDomain.path)) { return true; } else { continue; } } </del> <ins> export const isTrusted = (url: string, trustedURL: string): boolean => { const normalize = (url: string) => url.replace(//+$/, ''); trustedURL = normalize(trustedURL); url = normalize(url); </ins> <del> if (trustedDomains[i].indexOf('*') !== -1) { </del> <ins> const memo = Array.from({ length: url.length + 1 }).map(() => Array.from({ length: trustedURL.length + 1 }).map(() => undefined), ); </ins> <del> let reversedAuthoritySegments = url.authority.split('.').reverse(); const reversedTrustedDomainAuthoritySegments = parsedTrustedDomain.authority.split('.').reverse(); </del> <ins> if (/^[^./:]*:///.test(trustedURL)) { return doURLMatch(memo, url, trustedURL, 0, 0); } </ins> <del> if ( reversedTrustedDomainAuthoritySegments.length < reversedAuthoritySegments.length && reversedTrustedDomainAuthoritySegments[reversedTrustedDomainAuthoritySegments.length - 1] === '*' ) { reversedAuthoritySegments = reversedAuthoritySegments.slice(0, reversedTrustedDomainAuthoritySegments.length); } </del> <ins> const scheme = /^(https?):///.exec(url)?.[1]; if (scheme) { return doURLMatch(memo, url, `${scheme}://${trustedURL}`, 0, 0); } </ins> <del> const authorityMatches = reversedAuthoritySegments.every((val, i) => { return reversedTrustedDomainAuthoritySegments[i] === '*' || val === reversedTrustedDomainAuthoritySegments[i]; }); </del> <ins> return false; }; </ins> <del> if (authorityMatches && pathMatches(url.path, parsedTrustedDomain.path)) { return true; } } </del> <ins> const doURLMatch = ( memo: (boolean | undefined)[][], url: string, trustedURL: string, urlOffset: number, trustedURLOffset: number, ): boolean => { if (memo[urlOffset]?.[trustedURLOffset] !== undefined) { return memo[urlOffset][trustedURLOffset]!; </ins> } <del> return false; } </del> <ins> const options = []; </ins> <del> function pathMatches(open: string, rule: string) { if (rule === '/') { return true; </del> <ins> // Endgame. // Fully exact match if (urlOffset === url.length) { return trustedURLOffset === trustedURL.length; </ins> } <del> if (rule[rule.length - 1] === '/') { rule = rule.slice(0, -1); </del> <ins> // Some path remaining in url if (trustedURLOffset === trustedURL.length) { const remaining = url.slice(urlOffset); return remaining[0] === '/'; </ins> } <del> const openSegments = open.split('/'); const ruleSegments = rule.split('/'); for (let i = 0; i < ruleSegments.length; i++) { if (ruleSegments[i] !== openSegments[i]) { return false; </del> <ins> if (url[urlOffset] === trustedURL[trustedURLOffset]) { // Exact match. options.push(doURLMatch(memo, url, trustedURL, urlOffset + 1, trustedURLOffset + 1)); } if (trustedURL[trustedURLOffset] + trustedURL[trustedURLOffset + 1] === '*.') { // Any subdomain match. Either consume one thing that's not a / or : and don't advance base or consume nothing and do. if (!['/', ':'].includes(url[urlOffset])) { options.push(doURLMatch(memo, url, trustedURL, urlOffset + 1, trustedURLOffset)); </ins> } <ins> options.push(doURLMatch(memo, url, trustedURL, urlOffset, trustedURLOffset + 2)); </ins> } <del> return true; } </del> <ins> if (trustedURL[trustedURLOffset] + trustedURL[trustedURLOffset + 1] === '.*' && url[urlOffset] === '.') { // IP mode. Consume one segment of numbers or nothing. let endBlockIndex = urlOffset + 1; do { endBlockIndex++; } while (/[0-9]/.test(url[endBlockIndex])); if (['.', ':', '/', undefined].includes(url[endBlockIndex])) { options.push(doURLMatch(memo, url, trustedURL, endBlockIndex, trustedURLOffset + 2)); } } if (trustedURL[trustedURLOffset] + trustedURL[trustedURLOffset + 1] === ':*') { // any port match. Consume a port if it exists otherwise nothing. Always comsume the base. if (url[urlOffset] === ':') { let endPortIndex = urlOffset + 1; do { endPortIndex++; } while (/[0-9]/.test(url[endPortIndex])); options.push(doURLMatch(memo, url, trustedURL, endPortIndex, trustedURLOffset + 2)); } else { options.push(doURLMatch(memo, url, trustedURL, urlOffset, trustedURLOffset + 2)); } } return (memo[urlOffset][trustedURLOffset] = options.some(a => a === true)); }; </ins>

Issue Type: <bBug</bWrite http://192.168.1.7:3000/ into a text file. Command-click it to try to open the link. You will get an alert asking whether you want to open the external website. Click “Configure Trusted Domains”. <img width="1025" alt="link and dialog asking to confirm opening external website" src="https://user-"Look at the second option in the menu. It says “Trust 1.7:3000 and all its subdomains”. But 1.7:3000 is not a valid address. <img width="1024" alt="link and menu with buggy entry “Trust 1.7:3000 and all its subdomains”" src="https://user-"I can only guess that VS Code thinks that “7” is a TLD and “1.7” is a full domain name. What I actually want to do is whitelist opening all links to IP addresses like . In other words, white-list the subnet . At least, I think that makes sense. But I am not a network engineer, so if it makes more sense to recommend to the user whitelisting some other subnet such as , or whitelisting only the address but on any port, that would be fine too. VS Code version: Code 1.40.1 (, 2019-11-13T16:47:44.719Z) OS version: Darwin x64 18.7.0


Question: const minimapOpts = options.get(EditorOption.minimap); const minimapEnabled = minimapOpts.enabled; const minimapSide = minimapOpts.side; <del> const backgroundColor = minimapEnabled ? theme.getColor(editorOverviewRulerBackground) || TokenizationRegistry.getDefaultBackground() : null; </del> <ins> const themeColor = theme.getColor(editorOverviewRulerBackground); const defaultBackground = TokenizationRegistry.getDefaultBackground(); let backgroundColor: Color | null = null; if (themeColor !== undefined) { backgroundColor = themeColor; } else if (minimapEnabled) { backgroundColor = defaultBackground; } </ins> if (backgroundColor === null || minimapSide === 'left') { this.backgroundColor = null;

The issue is that when I resize the page to see it along with other content, I can see some text over the scroll page area. I think it wasn't supposed to work like this, that's why i'm reporting it here. ! ! .
The scrollbar is intentionally transparent. We have a color that is used only when the minimap is enabled. We could potentially use it always if set to allow defining opaque scrollbars.
Oh. Thank you for explaining :) In this case, sorry for bothering! Best, Alvaro
To verify, configure the color and that will be applied and will make the overview ruler opaque. e.g.


Question: renderedWordCount: wordCountResult.actualWordCount, lastRenderTime: Date.now(), isFullyRendered: wordCountResult.isFullString, <ins> originalMarkdown: part.content, </ins> }; wordCountResults[index] = wordCountResult; }

Steps: extension that registers a document and a document range formatting provider open a test workspace that activates the extension and trigger a range format. You get:


Question: renderedWordCount: wordCountResult.actualWordCount, lastRenderTime: Date.now(), isFullyRendered: wordCountResult.isFullString, <ins> originalMarkdown: part.content, </ins> }; wordCountResults[index] = wordCountResult; }


Question: return this.openerService.open(uri, { openToSide }); }, err => { <ins> const messageOrError = err instanceof Error ? (<Error>err).message : err; </ins> // different error cases <del> if (err === 'invalid') { </del> <ins> if (messageOrError === 'invalid') { </ins> this.notificationService.warn(nls.localize('invalid.url', 'Failed to open this link because it is not well-formed: {0}', link.url!.toString())); <del> } else if (err === 'missing') { </del> <ins> } else if (messageOrError === 'missing') { </ins> this.notificationService.warn(nls.localize('missing.url', 'Failed to open this link because its target is missing.')); } else { onUnexpectedError(err);

<!-- Please search existing issues to avoid creating duplicates. --<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed: --<!-- Use Help Report Issue to prefill these. --microsoft/monaco-editor VSCode Version: Monaco 0.17.0 Browser: Crhome Steps to Reproduce: a Link Provider for monaco-editor 2 .Click on the link on the monaco editor. results with the following error: <!-- Launch with to check. --Does this issue occur when all extensions are disabled?: N/A Solution: Looks like this is an error in Line 301: It compares the rejected promise errors to 'invalid' and 'missing', but in it rejects an Error not a string Line 61: So instead of the warning in throws an error. The code in should be:


Question: assert.strictEqual(result, 'test_2'); }); <ins> test('Increment file name with suffix version, too big number', function () { const name = 'test.9007199254740992.js'; const result = incrementFileName(name, false); assert.strictEqual(result, 'test.9007199254740992.1.js'); }); test('Increment folder name with suffix version, too big number', function () { const name = 'test.9007199254740992'; const result = incrementFileName(name, true); assert.strictEqual(result, 'test.9007199254740992.1'); }); </ins> test('Increment file name with prefix version', function () { const name = '1.test.js'; const result = incrementFileName(name, false);

Have file named in explorer Copy/paste it Window hangs This is from We shouldn't attempt this when the number is = Number.MAXSAFEINTEGER. It loops forever here: This bug will happen whenever incrementFileName fails to modify the file name.
I guess only interesting thing about this what we should do in this case as we need to create some new file name? Add without changing the original number?
that sounds reasonable


Question: import { ActiveEditorGroupLockedContext, ActiveEditorDirtyContext, EditorGroupEditorsCountContext, ActiveEditorStickyContext, ActiveEditorPinnedContext, ActiveEditorLastInGroupContext, ActiveEditorFirstInGroupContext, EditorPinnedAndUnpinnedTabsContext, ResourceContextKey, applyAvailableEditorIds, ActiveEditorAvailableEditorIdsContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext } from 'vs/workbench/common/contextkeys'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput'; <del> import { Emitter, Relay, Event } from 'vs/base/common/event'; </del> <ins> import { Emitter, Relay } from 'vs/base/common/event'; </ins> import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Dimension, trackFocus, addDisposableListener, EventType, EventHelper, findParentWithClass, isAncestor, IDomNodePagePosition, isMouseEvent, isActiveElement, focusWindow } from 'vs/base/browser/dom'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';

Steps: begin with multi tabs showing open an editor hide tab bar actions move to the top close editor open same editor actions are not visible anymore, there is just a "..." <img width="1348" alt="image" src=""
When creating the editor actions we rely on the event to tell us when actions change. However, this event is not set when there is no active pane. In that case we should have a different event trigger the onDidChange event such as onDidChangeActiveEditor for example


Question: private _isNext: boolean; <del> constructor(next: boolean, opts: IActionOptions) { </del> <ins> private _multiFile: boolean; constructor(next: boolean, multiFile: boolean, opts: IActionOptions) { </ins> super(opts); this._isNext = next; <ins> this._multiFile = multiFile; </ins> } public run(accessor: ServicesAccessor, editor: ICodeEditor): TPromise<void> {

Issue Type: <bBug</bWhen pressing F8 in editor without error markers in current file, tab will switch to another opened file with error. Is it possible to prevent tab switching when F8 is pressed and there is no errors in current file? VS Code version: Code 1.22.0 (, 2018-04-05T17:25:43.982Z) OS version: Darwin x64 16.7.0 <!-- generated by issue reporter --
It's caused by a change in behavior in 1.22 (). I think it's a change to the worse: it's very easy to get used to hitting F8 to get a quick feedback for whether the current file has any errors, and this change breaks this workflow in a very noisy way. It also punishes those who work on 'dirty' projects with lots of errors and prefer to concentrate on one file at a time. I think it would be great to have a config switch for "F8 checks all files/current file", or at least a pair of keyboard bindings for the old behavior. I'm actually surprised that it wasn't implemented with this change.
Understood. The goal was to keep the number of setting low, but I understand the different use-cases and muscle memory. Until then, a workaround, albeit weak, is to hit Shift+F8 which takes to back to the file.
Yeah, I agree that "convention over configuration" has its benefits, and it seems that the suggestion that caused this change was quite popular, but IMO this warrants at least a pair of shortcut bindings. Speaking about conventions, I've just checked that for example similar shortcuts in PyCharm (and I assume all other JetBrains IDEs) only jump through errors in the current file. One upside of the old behavior was that when the current file had no errors, there were no visual changes after pressing F8, and the cursor stayed where it was. Now in this case Shift+F8 after F8 won't even bring you back to that file, it would jump to another file with errors. "Go Back" or "Open Next Recently Used Editor" works though. It was also very useful that F8 would wrap around and bring you to the first error in the current file if you are working near the end of it and did some changes that e.g. made some imports or vars unused.


Question: private _isNext: boolean; <del> constructor(next: boolean, opts: IActionOptions) { </del> <ins> private _multiFile: boolean; constructor(next: boolean, multiFile: boolean, opts: IActionOptions) { </ins> super(opts); this._isNext = next; <ins> this._multiFile = multiFile; </ins> } public run(accessor: ServicesAccessor, editor: ICodeEditor): TPromise<void> {

I think I was relying on this behavior 80% of times when I pressed F8. And now it's become quite difficult to predict whether F8 or Shift-F8 would keep you in the current file or move to another one.
We have the two old commands back (in addition to the new commands). That means there is now "Go to Next Problem" and "Go to Next Problem In Files" as well as the other direction. We have not changed the keybindings, so F8/Shift-F8 walks across the project and you would need to reassign the them to get old, old behaviour back.
Wow, I didn't expect this minor issue to get resolved so quickly! Big thanks to the team, it's really a marvel to witness the development of this amazing project.
Thanks to
I verified the new command works as expected, however is the name "in Files" really clear what it does. Why not "across Files"?
We chose "in Files" to match "Find in Files". "across Files" makes sense too though and might be clearer for users who haven't used "Find in Files" before.


Question: import * as nls from 'vs/nls'; import { ContextKeyExpr, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; <ins> import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; </ins> export class GhostTextController extends Disposable { public static readonly inlineSuggestionVisible = new RawContextKey<boolean>('inlineSuggestionVisible', false, nls.localize('inlineSuggestionVisible', "Whether an inline suggestion is visible")); public static readonly inlineSuggestionHasIndentation = new RawContextKey<boolean>('inlineSuggestionHasIndentation', false, nls.localize('inlineSuggestionHasIndentation', "Whether the inline suggestion starts with whitespace")); public static readonly inlineSuggestionHasIndentationLessThanTabSize = new RawContextKey<boolean>('inlineSuggestionHasIndentationLessThanTabSize', true, nls.localize('inlineSuggestionHasIndentationLessThanTabSize', "Whether the inline suggestion starts with whitespace that is less than what would be inserted by tab")); <ins> /** * Enables to use Ctrl+Left to undo fully (partially) accepted inline completions (the completion is no longer visible then). */ public static readonly inlineSuggestionJustCommitted = new RawContextKey<boolean>('inlineSuggestionJustCommitted', false, nls.localize('inlineSuggestionJustCommitted', "Whether an inline suggestion just got committed")); </ins> static ID = 'editor.contrib.ghostTextController';

<!-- Do Not Delete This! featurerequesttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Describe the feature you'd like. --When using Copilot, users would like to be able to only partially accept suggestion instead of the whole suggestion at once. The users demand either word by word or line by line completion. Desired behaviour: Press a predefined key and accept the whole suggestion. Use a predefined combination of 2 keys to accept the top line of the suggestion. (eg: For a suggestion of 3 lines, the user would need to press the combination 3 times to accept the whole suggestion). The prompt would not show the line already accepted.
this sounds to me like a UX problem. Is there a mock sketch for a potential solution here? Is there some other editor which already supports this? We can also discuss it in one of our UX weekly meetings.
I don’t have a mock sketch. No other editors are supporting this yet but it is a requested features. I wanted to get the discussion going (doing the same for the other editors) to understand the constraints around it as well.
Technically, I think this would be rather easy to implement. I'd love to hear some more UX discussion before we implement this thought. What key-binding do you have in mind?
do you have some UX designers on your team that would like to help here? Once we have some good ux proposal we can bring it in our UX weekly sync on Wednesday to start the discussion.
No I dont have a UX designer in my team. I ll see how i can come up with a suggestion and get back to you
This is similar to Solution for me was 'CMD + -' to accept a word at a time. Something similar here would be great.
Fish shell allows word-by-word completion using the <kbdAlt</kbd+ <kbd&;</kbdkey-combo, which—at least on macOS—is used system-wide for navigating text word-by-word. I notice that I keep trying to automatically use this key-combo, so big +1 from me. ( Did not realise this is the vscode repo.)
awesome idea. since you said this is low hanging maybe we assign to July for the initial investigation? What do you think?
This would be great.


Question: import * as nls from 'vs/nls'; import { ContextKeyExpr, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; <ins> import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; </ins> export class GhostTextController extends Disposable { public static readonly inlineSuggestionVisible = new RawContextKey<boolean>('inlineSuggestionVisible', false, nls.localize('inlineSuggestionVisible', "Whether an inline suggestion is visible")); public static readonly inlineSuggestionHasIndentation = new RawContextKey<boolean>('inlineSuggestionHasIndentation', false, nls.localize('inlineSuggestionHasIndentation', "Whether the inline suggestion starts with whitespace")); public static readonly inlineSuggestionHasIndentationLessThanTabSize = new RawContextKey<boolean>('inlineSuggestionHasIndentationLessThanTabSize', true, nls.localize('inlineSuggestionHasIndentationLessThanTabSize', "Whether the inline suggestion starts with whitespace that is less than what would be inserted by tab")); <ins> /** * Enables to use Ctrl+Left to undo fully (partially) accepted inline completions (the completion is no longer visible then). */ public static readonly inlineSuggestionJustCommitted = new RawContextKey<boolean>('inlineSuggestionJustCommitted', false, nls.localize('inlineSuggestionJustCommitted', "Whether an inline suggestion just got committed")); </ins> static ID = 'editor.contrib.ghostTextController';

I am loving copilot so far, but this is my biggest UX gripe. Copilot's first suggestions in a new piece of code tend to only be accurate for the first few words. It tends to get much better only after more context is . Not a blocker, but it'd make it much easier to get started.
We did an initial investigation and this is not low hanging as I have initially commented above. Also, this milestone we have been mostly focusing on improving the merge editor. So this one will have to continue in September.
Had a sync with the VS folk and here's some very early thinking: When partial completion is accepted the ghost text should not change - we should use the cache. VS did multiple user studies and users always get shocked when the ghost text changes beneath them Undo is the user gesture to undo the last partial acceptance (this should work out of the box for us). Simple keybindings like word next navigation, and navigate to end of line should be used for partial word acceptance, and whole line acceptance. So same keybindnigs as and commands. Open questions (probably not for first version): How to make this keybindings discoverable Should we support the mouse? For example alt + mouse click to accept until the mouse click
I've also previously advocated for a way to accept only a single line out of the multi-line completion. I would strongly support doing this at a line granularity, rather than e.g. token granularity, since I ~never run into the case where I want to accept 'more than 0 tokens but less than a line' of a multi-line completion -- it's ~always either one line or maybe a couple, or the whole completion. Repurposing regular cursor movement commands for partial acceptance when a ghost text completion is open sounds error-prone. I see this kind of key-stealing behavior in some autocomplete systems (especially for ), but it's always optional, since it's really easy to interfere with muscle memory and frustrate people. This would apply to text navigation commands for sure, and it would be even worse in the middle-of-the-line completion case (which would also be wonky if we want an 'accept a single token' shortcut).
Hi! A use case for per-word completion: comment/natural language completion. I want this almost every time that copilot gives me a comment suggestion.


Question: import * as nls from 'vs/nls'; import { ContextKeyExpr, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; <ins> import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; </ins> export class GhostTextController extends Disposable { public static readonly inlineSuggestionVisible = new RawContextKey<boolean>('inlineSuggestionVisible', false, nls.localize('inlineSuggestionVisible', "Whether an inline suggestion is visible")); public static readonly inlineSuggestionHasIndentation = new RawContextKey<boolean>('inlineSuggestionHasIndentation', false, nls.localize('inlineSuggestionHasIndentation', "Whether the inline suggestion starts with whitespace")); public static readonly inlineSuggestionHasIndentationLessThanTabSize = new RawContextKey<boolean>('inlineSuggestionHasIndentationLessThanTabSize', true, nls.localize('inlineSuggestionHasIndentationLessThanTabSize', "Whether the inline suggestion starts with whitespace that is less than what would be inserted by tab")); <ins> /** * Enables to use Ctrl+Left to undo fully (partially) accepted inline completions (the completion is no longer visible then). */ public static readonly inlineSuggestionJustCommitted = new RawContextKey<boolean>('inlineSuggestionJustCommitted', false, nls.localize('inlineSuggestionJustCommitted', "Whether an inline suggestion just got committed")); </ins> static ID = 'editor.contrib.ghostTextController';

To make sure I understand the shape of the discussion, I think three issues are separable here: 1) whether to offer partial completion; 2) at what granularities (here the use case and example-based analysis is most relevant, and feed back into question 1); 3) if doing it, what default keybindings at these levels to provide so as not to hijack muscle memory (but possibly still utilize it in a parallel modifier key universe)? Is that right, and if so at what stage does the team currently see the conversation? For 3), in Lisp-y language tools, Paredit's keybindings might be a decent template too: in some sense what we are doing here is structurally selecting part of what is an (falling back on a as above) structure before "acceptance" (which is already well-understood as a result of by default keybinding users). That would be a more elaborate form of the partial acceptance, though, requiring a language-sensitive parse, so definitely not low hanging fruit.
It's a marketing problem, they market the code you accept as efficiency. If they would also add the 97% of the code you have to remove carefully again it wouldn't be that a nice metric. I believe we need to adapt the plugins on our own or write a plugin watchdog, something that monitors completions, immediately removes them and offers a word-by-word insert of the code.
A use case from He wants to accept the first couple of words here (but not the entire completion): ! ... ~~ A use case for line based acceptance: !
For jetbrains IDE's you can use my plugin () You press CTRL+ALT+D and it will complete the sentence word by word. So in your example you press it 3 times (you'll be after "to", then you type "have a per" and you can continue with the shortcut 3 more times on the new completion text. Or just "TAB" if all is good after your intervention, it doesn't block you from using the default behavior of copilot Though the plugin only works on IntelliJ IDE's (you need to install 'LivePlugin' and 'Stewardess')
I love this suggestion. I encounter the scenario of wanting to only accept a suggestion partially a lot.
would you prefer word-by-word partial acceptance or line-by-line?


Question: import * as nls from 'vs/nls'; import { ContextKeyExpr, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; <ins> import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; </ins> export class GhostTextController extends Disposable { public static readonly inlineSuggestionVisible = new RawContextKey<boolean>('inlineSuggestionVisible', false, nls.localize('inlineSuggestionVisible', "Whether an inline suggestion is visible")); public static readonly inlineSuggestionHasIndentation = new RawContextKey<boolean>('inlineSuggestionHasIndentation', false, nls.localize('inlineSuggestionHasIndentation', "Whether the inline suggestion starts with whitespace")); public static readonly inlineSuggestionHasIndentationLessThanTabSize = new RawContextKey<boolean>('inlineSuggestionHasIndentationLessThanTabSize', true, nls.localize('inlineSuggestionHasIndentationLessThanTabSize', "Whether the inline suggestion starts with whitespace that is less than what would be inserted by tab")); <ins> /** * Enables to use Ctrl+Left to undo fully (partially) accepted inline completions (the completion is no longer visible then). */ public static readonly inlineSuggestionJustCommitted = new RawContextKey<boolean>('inlineSuggestionJustCommitted', false, nls.localize('inlineSuggestionJustCommitted', "Whether an inline suggestion just got committed")); </ins> static ID = 'editor.contrib.ghostTextController';

It would be awesome to be able to do both, but if only one of the two is possible, then I would prefer word-by-word.
There is no reason why only one would be doable. A line based completion is a couple of lines of code. Word based completion is half a page if you want to do the word separation smart, or an abstract if it's dumb.
First iteration has been implemented in


Question: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= <del> xterm-addon-search@0.9.0-beta.39: version "0.9.0-beta.39" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.39.tgz#e8376e1485ee7d763c07d1a8f1354114f65b3e3e" integrity sha512-h45wkecgfqXXoAUqgNytAfSd6g0xNT6rZy/enVaEU0aes7QoL9pxHUKkCry8PP6hs03Slk0VxQ4AGsbSZGvK/w== </del> <ins> xterm-addon-search@0.9.0-beta.41: version "0.9.0-beta.41" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.41.tgz#0992da36fe01ff6d71449265a9dabeef7f9d0a3f" integrity sha512-b1vuWR5JZ8QIiObbKkwSzpzf4x0B9hdzGCHJG+PXWT/xbxk65DOe/X9rgrRyOnCWe5ylQGG4DIHTiREigTp0lg== </ins> <del> xterm-addon-serialize@0.7.0-beta.13: version "0.7.0-beta.13" resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.7.0-beta.13.tgz#5c859c8657cab7f28405aab1a0715daf54bc7714" integrity sha512-TYFlm/gds0pOmpzXw7ZWx8Cy48lMaOZZqZgfm5pWU37HPvzfKxXSVdYL1biWpRCH2zCH+3cWmOma8W1pBRr+Eg== </del> <ins> xterm-addon-serialize@0.7.0-beta.15: version "0.7.0-beta.15" resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.7.0-beta.15.tgz#0f7d5f9b423802ac67c2a891d74de530a4fe6a65" integrity sha512-gO/dxqGgOAuj7DN2ETTeCHyalkb655XogZh5408CmH5D6mjI1lxqVLGUdiFeBVU/OHfWZT2PZ95k06VXqLU5kA== </ins> xterm-addon-unicode11@0.4.0-beta.3: version "0.4.0-beta.3" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa" integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q== <del> xterm-addon-webgl@0.12.0-beta.41: version "0.12.0-beta.41" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.41.tgz#17dbca975b6e9b34526ebc57f4de59ee295da1b6" integrity sha512-wvQxC5diMYEJEMaILfz+4CWB2GgtzjzNQRNDnK7R7Y9wDI+P4idDlQKgyH0nA93sl9R4zgqlBVha//wuq4vfZg== </del> <ins> xterm-addon-webgl@0.12.0-beta.43: version "0.12.0-beta.43" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.43.tgz#916ed4e390371403aab0d277097cd8a61be436e8" integrity sha512-hGXfwT6TOmp0tBDiS/iF8s0SLHLd3shJ5zQyS4HNtq99B5cEhHhwaUAZAfjLt5rnUt0kvqR9YWtGsDux5dWVLA== </ins> <del> xterm-headless@4.19.0-beta.60: version "4.19.0-beta.60" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.60.tgz#ccd09a7c69ba487d3fd87d6a8d159f1a6a10e9b2" integrity sha512-mJ24BRnEDCASJDTGFZysZxiXkCmed3eMFiWCPvIF48LVrqxt1cImoVKBlxqkdgUkHKjfF2c92S1TTBL5aT1I0w== </del> <ins> xterm-headless@4.19.0-beta.67: version "4.19.0-beta.67" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.67.tgz#fe44a243974bf307c9a0694114ab45289734c7f9" integrity sha512-rpxUsE/te2LN4B/erI108uaAhuLTUsnRl9zIZgcqMqZGFRqDUTtyVM05jIA/8A32g06wFd3WioTkeKc6ow+sLg== </ins> <del> xterm@4.19.0-beta.60: version "4.19.0-beta.60" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.60.tgz#de89d93153ae3ec17b53f3e5d03b8ea859126081" integrity sha512-YQjvp4xtSAyNm9+gF4OA5+QzkSWdKMCy4WABETpe7CsrEGx+mJVoXCZ9wgopmvwRXz7DeJvKM5dWz1HPjVLDtA== </del> <ins> xterm@4.19.0-beta.67: version "4.19.0-beta.67" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.67.tgz#9a7d79be64469c91bb693b9f5a50b5a22e921cd3" integrity sha512-4bYTnT6g91N5QId1qPaiSvkpsxMQYpuPdPJItvBZFOcQLTuFSX85x5NeFuDvhNqi33eMFPimyGhzH/JvAV1v/Q== </ins> yallist@^4.0.0: version "4.0.0"

https://user-
Related ,
happening bc the first line's marker isn't disposed of (and thus the decoration isn't either) !
so maybe we should have some API on xterm like so that can be handled specially?
oh here's the issue that solved but looks like that actually wasn't solved anyway
Just to confirm, to verify this issue, are you typing commands followed by the clear command in between? Or are you clearing the terminal another way?
Typing and clearing
Pretty sure this is the command, not run in the terminal


Question: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= <del> xterm-addon-search@0.9.0-beta.39: version "0.9.0-beta.39" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.39.tgz#e8376e1485ee7d763c07d1a8f1354114f65b3e3e" integrity sha512-h45wkecgfqXXoAUqgNytAfSd6g0xNT6rZy/enVaEU0aes7QoL9pxHUKkCry8PP6hs03Slk0VxQ4AGsbSZGvK/w== </del> <ins> xterm-addon-search@0.9.0-beta.41: version "0.9.0-beta.41" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.41.tgz#0992da36fe01ff6d71449265a9dabeef7f9d0a3f" integrity sha512-b1vuWR5JZ8QIiObbKkwSzpzf4x0B9hdzGCHJG+PXWT/xbxk65DOe/X9rgrRyOnCWe5ylQGG4DIHTiREigTp0lg== </ins> <del> xterm-addon-serialize@0.7.0-beta.13: version "0.7.0-beta.13" resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.7.0-beta.13.tgz#5c859c8657cab7f28405aab1a0715daf54bc7714" integrity sha512-TYFlm/gds0pOmpzXw7ZWx8Cy48lMaOZZqZgfm5pWU37HPvzfKxXSVdYL1biWpRCH2zCH+3cWmOma8W1pBRr+Eg== </del> <ins> xterm-addon-serialize@0.7.0-beta.15: version "0.7.0-beta.15" resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.7.0-beta.15.tgz#0f7d5f9b423802ac67c2a891d74de530a4fe6a65" integrity sha512-gO/dxqGgOAuj7DN2ETTeCHyalkb655XogZh5408CmH5D6mjI1lxqVLGUdiFeBVU/OHfWZT2PZ95k06VXqLU5kA== </ins> xterm-addon-unicode11@0.4.0-beta.3: version "0.4.0-beta.3" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa" integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q== <del> xterm-addon-webgl@0.12.0-beta.41: version "0.12.0-beta.41" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.41.tgz#17dbca975b6e9b34526ebc57f4de59ee295da1b6" integrity sha512-wvQxC5diMYEJEMaILfz+4CWB2GgtzjzNQRNDnK7R7Y9wDI+P4idDlQKgyH0nA93sl9R4zgqlBVha//wuq4vfZg== </del> <ins> xterm-addon-webgl@0.12.0-beta.43: version "0.12.0-beta.43" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.43.tgz#916ed4e390371403aab0d277097cd8a61be436e8" integrity sha512-hGXfwT6TOmp0tBDiS/iF8s0SLHLd3shJ5zQyS4HNtq99B5cEhHhwaUAZAfjLt5rnUt0kvqR9YWtGsDux5dWVLA== </ins> <del> xterm-headless@4.19.0-beta.60: version "4.19.0-beta.60" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.60.tgz#ccd09a7c69ba487d3fd87d6a8d159f1a6a10e9b2" integrity sha512-mJ24BRnEDCASJDTGFZysZxiXkCmed3eMFiWCPvIF48LVrqxt1cImoVKBlxqkdgUkHKjfF2c92S1TTBL5aT1I0w== </del> <ins> xterm-headless@4.19.0-beta.67: version "4.19.0-beta.67" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.67.tgz#fe44a243974bf307c9a0694114ab45289734c7f9" integrity sha512-rpxUsE/te2LN4B/erI108uaAhuLTUsnRl9zIZgcqMqZGFRqDUTtyVM05jIA/8A32g06wFd3WioTkeKc6ow+sLg== </ins> <del> xterm@4.19.0-beta.60: version "4.19.0-beta.60" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.60.tgz#de89d93153ae3ec17b53f3e5d03b8ea859126081" integrity sha512-YQjvp4xtSAyNm9+gF4OA5+QzkSWdKMCy4WABETpe7CsrEGx+mJVoXCZ9wgopmvwRXz7DeJvKM5dWz1HPjVLDtA== </del> <ins> xterm@4.19.0-beta.67: version "4.19.0-beta.67" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.67.tgz#9a7d79be64469c91bb693b9f5a50b5a22e921cd3" integrity sha512-4bYTnT6g91N5QId1qPaiSvkpsxMQYpuPdPJItvBZFOcQLTuFSX85x5NeFuDvhNqi33eMFPimyGhzH/JvAV1v/Q== </ins> yallist@^4.0.0: version "4.0.0"

<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed: --<!-- Use Help Report Issue to prefill these. --- VSCode Version: 1.50.1 OS Version: 10.15.7 Steps to Reproduce: system input source to shuangpin, before which add shuangpin as an input source. ! caps lock, with caps lock unlock, you will input Chinese character, which is an expected behavior. something in the integrated terminal, I can only input upper case letters. But when I input something in editor or some other application, I can input lower case letters. <!-- Launch with to check. --Does this issue occur when all extensions are disabled?: Yes. Actually I think it might be the problem of might decide the letters by cap lock. This is not as expected with shuangpin mode.
This looks like an upstream issue in
Thanks for replying. Opened an issue for


Question: })); } } <ins> class EditSessionsStoreClient extends UserDataSyncStoreClient { _serviceBrand: any; } </ins>

Testing I'm not sure why I have two entries for edit sessions and wonder if it came from another machine/sessions. It would be great to see some metadata about where the source is coming from, similar to the "Synced Data" view for Settings Sync. <img width="394" alt="CleanShot 2022-07-26 at 10 58 31 src="https://user-"<img width="373" alt="CleanShot 2022-07-26 at 11 00 07 src="https://user-"


Question: const lastDot = value.lastIndexOf('.'); inputBox.value = value; <del> inputBox.focus(); inputBox.select({ start: 0, end: lastDot > 0 && !stat.isDirectory ? lastDot : value.length }); const done = once(async (success: boolean, finishEditing: boolean) => { </del> <ins> let isFinishableDisposeEvent = false; setTimeout(() => { // Check if disposed if (!inputBox.inputElement) { return; } inputBox.focus(); inputBox.select({ start: 0, end: lastDot > 0 && !stat.isDirectory ? lastDot : value.length }); isFinishableDisposeEvent = true; }, 0); const done = once(async (success: boolean) => { </ins> label.element.style.display = 'none'; const value = inputBox.value; dispose(toDispose); container.removeChild(label.element); <del> if (finishEditing) { // Timeout: once done rendering only then re-render #70902 setTimeout(() => editableData.onFinish(value, success), 0); } </del> <ins> // Timeout: once done rendering only then re-render #70902 setTimeout(() => editableData.onFinish(value, success), 0); </ins> }); const blurDisposable = DOM.addDisposableListener(inputBox.inputElement, DOM.EventType.BLUR, () => { <del> done(inputBox.isInputValid(), true); </del> <ins> done(inputBox.isInputValid()); </ins> }); const toDispose = [

<!-- Please search existing issues to avoid creating duplicates. --<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed: --<!-- Use Help Report Issue to prefill these. --- VSCode Version: 1.34.0 OS Version: Windows 10 Steps to Reproduce: terminal any command that makes any change of your current project directory after a while, like 'New Folder' action refreshing directory by the terminal command, 'New Folder' input will disappear and File Explorer remains inactive <!-- Launch with to check. --Does this issue occur when all extensions are disabled?: Yes !


Question: export class NotebookOutlineEntryFactory { private cellOutlineEntryCache: Record<string, entryDesc[]> = {}; <del> private readonly cachedMarkdownOutlineEntries = new WeakMap<ICellViewModel, { alternativeId: number; headers: { depth: number, text: string }[] }>(); </del> <ins> private readonly cachedMarkdownOutlineEntries = new WeakMap<ICellViewModel, { alternativeId: number; headers: { depth: number; text: string }[] }>(); </ins> constructor( private readonly executionStateService: INotebookExecutionStateService ) { }

Open notebook with a header, code cell, and symbols in the code cell: # 1: symbols appear as a child of the header md cell, and the code cell is not present in the outline. # 2: changing the filter settings to remove code cells or symbols does not recompute the outline. Fixes: For # 1: an outline provider was being created with the incorrect target (sticky scroll was created with a QuickPick target), and this was being retrieved for the outline pane incorrectly. For # 2: one of the locations an outline change event is fired was shifted and subsequently removed, meaning that the outline did not recompute to reflect the filtered-out cells.


Question: return; } <ins> if (this.isPasting) { return; } </ins> const builtinCompletionsConfig = this._configurationService.getValue<ITerminalSuggestConfiguration>(terminalSuggestConfigSection).builtinCompletions; if (!this._codeCompletionsRequested && builtinCompletionsConfig.pwshCode) { this._onAcceptedCompletion.fire(SuggestAddon.requestEnableCodeCompletionsSequence);

Steps to Reproduce: text into PowerShell (with Terminal suggest enabled) see batched pasting behavior
maybe related to
Haha, I think this is it triggering completions while the pasted text is being send then kicking in. Pastes should never trigger completions so let's track that here.
When verifying make sure you're on macOS.


Question: export interface UriComponents { scheme: string; <del> authority: string; path: string; query: string; fragment: string; </del> <ins> authority?: string; path?: string; query?: string; fragment?: string; } export function isUriComponents(thing: any): thing is UriComponents { if (!thing || typeof thing !== 'object') { return false; } return typeof (<UriComponents>thing).scheme === 'string' && (typeof (<UriComponents>thing).authority === 'string' || typeof (<UriComponents>thing).authority === 'undefined') && (typeof (<UriComponents>thing).path === 'string' || typeof (<UriComponents>thing).path === 'undefined') && (typeof (<UriComponents>thing).query === 'string' || typeof (<UriComponents>thing).query === 'undefined') && (typeof (<UriComponents>thing).fragment === 'string' || typeof (<UriComponents>thing).fragment === 'undefined'); </ins> } interface UriState extends UriComponents { $mid: MarshalledId.Uri; <del> external: string; fsPath: string; _sep: 1 | undefined; </del> <ins> external?: string; fsPath?: string; _sep?: 1; </ins> } const _pathSepMarker = isWindows ? 1 : undefined;

Following test throws: I found this while investigating At that point the editor component is quite broken because of a lot of errors being thrown. Notice how not even a tab shows for the editor: <img width="1058" alt="image" src="https://user-"
that should already throw because at least a scheme is needed. It doesn't because was designed to be the runtime counter part of which never produces such output so some IPC deserialisation cost can be saved.
, that works for me and will also throw when we get bad objects into such as the from
Yeah, my plan is to add an argument like we have in other URI-places. It will default to true and only IPC should be relaxed
Not doing that because it actually already exists as . I believe the adoption/migration task is to use instead of whenever getting uri components from storage or esp from command arguments. Tho, there is one special case for which is that it automatically uses when the scheme is missing. We could make that configurable but a check for might make this obsolete
Closing this after and the ask to use when creating uri from "untrusted" sources
I will see to adopt , I forgot we had it


Question: throw e; } <del> let label; if (claims.name && claims.email) { label = `${claims.name} - ${claims.email}`; } else { label = claims.email ?? claims.unique_name ?? claims.preferred_username ?? 'user@example.com'; } </del> const id = `${claims.tid}/${(claims.oid ?? (claims.altsecid ?? '' + claims.ipd ?? ''))}`; const sessionId = existingId || `${id}/${randomUUID()}`; this._logger.trace(`[${scopeData.scopeStr}] '${sessionId}' Token response parsed successfully.`);


Question: throw e; } <del> let label; if (claims.name && claims.email) { label = `${claims.name} - ${claims.email}`; } else { label = claims.email ?? claims.unique_name ?? claims.preferred_username ?? 'user@example.com'; } </del> const id = `${claims.tid}/${(claims.oid ?? (claims.altsecid ?? '' + claims.ipd ?? ''))}`; const sessionId = existingId || `${id}/${randomUUID()}`; this._logger.trace(`[${scopeData.scopeStr}] '${sessionId}' Token response parsed successfully.`);

In that case, I think changing the label to be just email would be best. Then all of these sessions in my example screenshot could be grouped as one. If you deduped per-label with the current labelling it would show two accounts, one that represents 3 tenants, and another representing another single tenant. That would still be pretty confusing. IMO there's two options: Dedupe by email and hide all tenant related stuff. Signing out of that account removes all sessions associated with that email, regardless of tenant. Don't dedupe at all, instead include the tenant display name in the label as .
says this works!


Question: } async sendText(text: string, addNewLine: boolean): Promise<void> { <del> // Apply bracketed paste sequences if the terminal has the mode enabled, this will prevent // the text from triggering keybindings https://github.com/microsoft/vscode/issues/153592 if (this.xterm?.raw.modes.bracketedPasteMode) { text = `x1b[200~${text}x1b[201~`; } </del> // Normalize line endings to 'enter' press. text = text.replace(/r?n/g, 'r'); if (addNewLine && text[text.length - 1] !== 'r') {

<!-- Do Not Delete This! featurerequesttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Describe the feature you'd like. --Several shells (, , ) include vi mode keybindings. It's common for users to rebind vi escape to something like , , or . When interfacing with the shell, VS Code behaves as if it were a user typing keys, which may trigger vi escape if file names or other text input to the shell contains the escape sequence. To show the problematic behavior (assuming the shell is ): Include these lines in your In VS Code, try to run a Python file named . VS Code enters this file name into the shell, which triggers the escape sequence and causes the shell to interpret following the as vi normal mode commands. If VS Code input text to the shell with bracketed paste, this would not happen.
Not sure if this is related, but I use Spectacle to move and resize my windows. It used to work perfectly, but now, since today's update, I cannot use my shortcut to resize my VSCode instance. The shortcuts I used were control+option+command+(left/right/down/up) to move and resize, and option+command+f to toggle fullscreen(not fullscreen but resized as fullscreen). These shortcuts do nothing in VSCode and are not triggered anymore through Spectacle
Can you clarify how you're running the file? I think I understand the problem, sending text to the terminal via extension API or run active file, etc. are triggering the keybinding but wrapping them in bracketed paste would fix it. It should be safe to wrap in the bracketed paste sequences provided the mode is enabled in the terminal. that sounds like a different issue, maybe related to Electron.
Thank you, I'm gonna post this as a new issue.
I'm running the file using Run -Start Debugging, selecting 'Python File' as the debug configuration. VS Code then enters this into the shell: The file is supposed to be called but my shell sees (my escape sequence) and then stops at .


Question: } async sendText(text: string, addNewLine: boolean): Promise<void> { <del> // Apply bracketed paste sequences if the terminal has the mode enabled, this will prevent // the text from triggering keybindings https://github.com/microsoft/vscode/issues/153592 if (this.xterm?.raw.modes.bracketedPasteMode) { text = `x1b[200~${text}x1b[201~`; } </del> // Normalize line endings to 'enter' press. text = text.replace(/r?n/g, 'r'); if (addNewLine && text[text.length - 1] !== 'r') {

Thanks for confirming, we should be able to include the fix in 1.70 (too late for 1.69 unfortunately)
This caused a regression unfortunately so reopening The actual fix is more involved than I thought, we will need to be able to pass in a flag for whether to wrap in bracketed paste mode into the sendSequence command, internal API, extension API. An extension could wrap what it's sending in bracketed paste mode now but that won't work when the shell isn't in bracketed paste mode and the extension is not able to determine that.
We closed this issue because we in the foreseeable future. If you disagree and feel that this issue is crucial: we are happy to listen and to reconsider. If you wonder what we are up to, please see our and . Thanks for your understanding, and happy coding!


Question: ); } <del> for (const [profileName, value] of Object.entries(configProfiles || {})) { if (value === null) { detectedProfiles.delete(profileName); } detectedProfiles.set(profileName, value); } </del> <ins> applyConfigProfilesToMap(configProfiles, detectedProfiles); </ins> const resultProfiles: ITerminalProfile[] = await transformToTerminalProfiles(detectedProfiles.entries(), statProvider, logService, variableResolver, workspaceFolder);

Testing I'm wondering if there's a way to add a schema so that users can get descriptions on the various fields they can use while creating a new profile. I also realize that the keys represent profile names, so that might make it harder to validate/provide descriptions for them. I guess the description for the keys would go under in that case, though there already is a long description for that field.
this would be nice, looked into it a bit but we're not sure how to set it up for such an object. We essentially want to enforce something like
would you be the right person to ask about schemas for settings?
You can use the property to specify the shape of all properties regardless of the key. An example is the setting: If there are constraints on the key, you can use :


Question: }, () => this.extensionManagementService.uninstallExtensions(extensionsToUninstall).then(() => undefined)); } <ins> private getAllPackExtensionsToUninstall(extension: ILocalExtension, installed: IExtension[], checked: ILocalExtension[] = []): ILocalExtension[] { if (checked.some(e => areSameExtensions(e.identifier, extension.identifier))) { return []; } checked.push(extension); const extensionsPack = extension.manifest.extensionPack ?? []; if (extensionsPack.length) { const packedExtensions: ILocalExtension[] = []; for (const i of installed) { if (i.local && !i.isBuiltin && extensionsPack.some(id => areSameExtensions({ id }, i.identifier))) { packedExtensions.push(i.local); } } const packOfPackedExtensions: ILocalExtension[] = []; for (const packedExtension of packedExtensions) { packOfPackedExtensions.push(...this.getAllPackExtensionsToUninstall(packedExtension, installed, checked)); } return [...packedExtensions, ...packOfPackedExtensions]; } return []; } </ins> private getErrorMessageForUninstallingAnExtensionWithDependents(extension: IExtension, dependents: IExtension[]): string { if (dependents.length === 1) { return nls.localize('singleDependentUninstallError', "Cannot uninstall '{0}' extension alone. '{1}' extension depends on this. Do you want to uninstall all these extensions?", extension.displayName, dependents[0].displayName);

From ! It took me a while to be able to use Copilot again. Here are the steps I took (also captured in the attached video): Reloaded VS Code Clicked "Show Extension" from the toast above, I'm brought to Copilot Chat extension in Extensions view Clicked "Uninstall" for Chat extension, nothing would happen Decided to instead search Copilot in Extensions view (thought maybe I was having issues by trying to uninstall Chat without touching Completions, though I would've expected a toast telling me that) After searching, the Copilot extensions automatically start to update Need to restart just Copilot (not chat), so I click to restart I try to uninstall Copilot Chat again, but nothing happens again Reload VS Code again Search for Copilot again in the Extensions view I can now uninstall Copilot (though I initiated the uninstall from the Copilot extension rather than Chat)
Verification steps are in


Question: } } <del> class SelectionToWatchExpressionsAction extends EditorAction { </del> <ins> export class SelectionToWatchExpressionsAction extends EditorAction { public static readonly ID = 'editor.debug.action.selectionToWatch'; public static readonly LABEL = nls.localize('addToWatch', "Add to Watch"); </ins> constructor() { super({ <del> id: 'editor.debug.action.selectionToWatch', label: nls.localize('addToWatch', "Add to Watch"), alias: 'Add to Watch', </del> <ins> id: SelectionToWatchExpressionsAction.ID, label: SelectionToWatchExpressionsAction.LABEL, alias: 'Debug: Add to Watch', </ins> precondition: ContextKeyExpr.and(EditorContextKeys.hasNonEmptySelection, CONTEXT_IN_DEBUG_MODE, EditorContextKeys.editorTextFocus), contextMenuOpts: { group: 'debug',

When I press Ctrl+Shift+P to open the command panel and type "", it shows "No matching commands". So I can't execute this command by Ctrl+Shift+P. I can only bind a shortcut key to this command and then execute it via the shortcut key. I think this is a bug that the command panel search is incomplete.
Please edit this issue title to become:
indicates it may already be there and you just need to know what the command text is.
OK, but according to my observation, there are other commands that cannot be found in the panel. For example, "".
The issue I raised is different from him. His issue is that the shortcut key does not work after binding. My issue is that I can't find the command in the command panel. In fact, some other commands cannot be found, indicating that the search of the command panel is incomplete.
Some commands never appear in the Command Palette because they define their clause as
I open the page where I set the keyboard shortcut and see that their when clause is - not false.
Sorry, I wasn't clear. This is what I am referring to.
I read your link and I probably understand. Please set the when clause of "" to "inDebugMode" instead of false. This is more in line with our needs.
Looks like that command is missing from here: is also missing.
/confirm
I will submit a PR
Thanks!


Question: } public get capabilities(): WorkingCopyCapabilities { <del> return 0; </del> <ins> return WorkingCopyCapabilities.None; </ins> } public isDirty(): boolean {

<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed: --<!-- Use Help Report Issue to prefill these. --- VSCode Version: head OS Version: n/a This is a bug/inconsistency in the VSC codebase, which is currently obscured because of the specific way the code is written. This wouldn't really matter, but when using a build step that generates files for dependencies, the gets evaluated down to and compilation fails. And overall, it'd be nice for the types to align in a sensible way. Steps to Reproduce: , replace with Expected: compiles fine Actual: there are a number of errors like Property 'getFirstLineText' does not exist on type 'never'. The intersection 'this & IResolvedTextFileEditorModel' was reduced to 'never' because property 'capabilities' has conflicting types in some (2339)TextFileEditorModelIWorkingCopyIResolvedTextFileEditorModelthis.isResolved() is known to be true) says capabilities should be a readonly 2. <!-- Launch with to check. --Does this issue occur when all extensions are disabled?: Yes
Since this seems to concern only you with your specific setup, wanna do a PR to fix this?
I would be more than happy to, but I'm not sure what approach you'd find (in)appropriate. could type in as a number instead of an enum (since checks against it are anyways done via bitwise-and) could change in to actually be 2 instead of 0 (though it seems like you also use 0 for this field in other places like , and somehow TSC doesn't care...) could add a enum value of 0 to , since it seems like that's how you use it. I'm leaning towards approach 3. What are your thoughts?
Yeah I think we can give 3. a try in a PR.


Question: }) .text(this.feedback).attr('required', 'required') .on('keyup', () => { <del> $charCounter.text('(' + (FeedbackDropdown.MAX_FEEDBACK_CHARS - this.feedbackDescriptionInput.value.length) + ' ' + nls.localize("characters left", "characters left") + ')'); </del> <ins> $charCounter.text(this.getCharCountText(this.feedbackDescriptionInput.value.length)); </ins> this.feedbackDescriptionInput.value ? this.sendButton.removeAttribute('disabled') : this.sendButton.attr('disabled', ''); }) .appendTo($form).domFocus().getHTMLElement();

To reproduce. click smiley in the bottom right of editor window. The feedback form should appear enter several characters, press "Enter" (the new line should appear) continue entering characters while you can You should stop at "1 characters left" (declensions?) After that you will not be able to enter anything On the screenshot. There's a newline after "1". I reached the end of input and unable to enter more characters. But counter still says "1 characters left": <img width="468" alt="" src=""Mac OS 10.10.5 Yosemite
This is interesting. I created this to reproduce the behavior. do you have any thoughts on this? Here are a couple ideas we've talked about before. 1 - Remove the text area completely and replace with just the tweet button. This makes sense because we're submitting to twitter anyways. 2 - Hack the text area element to get better behavior. This would involve looking for new line characters based on the batter described by OP. I'm not a fan of this as it seems error prone. If we go with option 1, I'll work with Brad and get some design love on the form. any thoughts? I created PR to fix the "s" on singular count issue.
Thanks for your amazing job and thanks for asking! :blush: If the "Tweet" button will not require having a Twitter account, then it's a solution, I guess. I feel a bit weird reporting those super-tiny issues that still require developers time. Is the related (then we should star it)? Probably even disabling line breaks (like turning into line input) could be a solution.
Yes that is the exact issue. Starred it! I thought about disabling line breaks, but I think it would be a good thing for the user to do, considering Twitter supports line breaks. The Tweet button wouldn't require a Twitter account, but once the Tweet button takes them to twitter they would need to login.
Well, the need to login on Twitter is a requirement to have a Twitter account :blush: I wouldn't think it's a good UX :relaxed:
Right. Unfortunately Twitter doesn't support anonymous tweets.
After some internal discussion we decided to go with a dialog redesign. Will work with our UX designer to get some help.
Closing as it will be fixed with .


Question: import { CommandsRegistry, ICommandHandler, ICommandService } from 'vs/platform/commands/common/commands'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ConfigurationScope, Extensions as ConfigurationExtensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; <del> import { ContextKeyEqualsExpr, ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; </del> <ins> import { ContextKeyAndExpr, ContextKeyEqualsExpr, ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; </ins> import { IFileService } from 'vs/platform/files/common/files'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions';

Just to confirm that if you are aware that this change will not show the keybinding for Search view anymore at following places: <img width="367" alt="image" src="https://user-"<img width="161" alt="image" src="https://user-"Not sure if it is intended. Originally posted by in


Question: import { DiffEditorEditors } from 'vs/editor/browser/widget/diffEditorWidget2/diffEditorEditors'; import { DiffEditorViewModel } from 'vs/editor/browser/widget/diffEditorWidget2/diffEditorViewModel'; import { appendRemoveOnDispose } from 'vs/editor/browser/widget/diffEditorWidget2/utils'; <del> import { EditorLayoutInfo } from 'vs/editor/common/config/editorOptions'; </del> <ins> import { EditorLayoutInfo, EditorOption } from 'vs/editor/common/config/editorOptions'; </ins> import { LineRange } from 'vs/editor/common/core/lineRange'; import { Position } from 'vs/editor/common/core/position'; import { OverviewRulerZone } from 'vs/editor/common/viewModel/overviewZoneManager';

This has been fixed for notebook diffs but is still an issue for text diffs: <img width="115" alt="image" src="https://user-"