-
Notifications
You must be signed in to change notification settings - Fork 37k
Code inset feature #66418
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Code inset feature #66418
Conversation
|
Hi @rdeline, is there an open issue tracking this feature request? Please see our contributing guidelines, we ask that PRs address open issues.
|
|
Sorry, @RMacfarlane, it's my first PR, so I don't know the conventions. :) Relevant issues include 41775 (which this PR directly addresses), and 34739, and 39492 (which this PR enables, with a further change in the Python extension, which I've also done). |
|
Linking #3220 which I believe was the first request of this kind |
|
Would this PR allow the HTML/JS to "return" something to the code? example: #66493 |
|
@leocb Yes, it could. The feature is implemented using a webview element, and there is a communication channel between Code and the webview. So, the JS code hosted in the webview can post a message, which the extension can listen for. In the PR, the inline-doc extension uses this approach to communicate the size of the HTML content. |
|
@jrieken Looking at the VS Code PR requests, I see some open from 2016, and some merged two days ago. As a result, I thought it was worth asking - is it, and if so when is it, likely that this PR will be merged? ( I come from an extension that is deeply interested in this functionality) |
|
@tecosaur Yes - we do have interest in the PR. No - we don't have a timeline. |
|
@rdeline Thanks so far. I did take this for spin and things look promising. Everything is weird into the right places and it's more about the following items
Wrt the API we actually wanna go away from the URL-approach and expose the class CodeInset {
id: string;
range: Range;
height?:number;
}
export interface CodeInsetProvider {
//...
resolveCodeInset(inset: CodeInset, webview: Webview, token: CancellationToken): Promise<void>
}So, the extension provides the insets and the editor calls back with a web view which can be managed by the extension, e.g. |
|
@jrieken I like this tweak to the API, particularly since it means that extensions won't have to implement both a I'm trying to update the PR to implement this change, but it's a struggle. The issue is this. The webview needs to be created by |
|
I've updated the PR to reflect the requested API change that @jrieken requested. The new API is definitely nicer as can be seen in extensions/inline-doc/extension.ts. I found a way to wire up the pieces that I think is reasonable, but of course all suggestions are welcome. I think there's an interesting speed/space trade-off with this feature. Webviews both take up memory and are noticeably slow to load. To optimize for space, one could allocate webviews only for the currently visible viewport, but the loading delay would be noticeable to the user. I think it's up to the core Code team to decide an appropriate policy for this trade-off. |
|
@rdeline We have finished our February planning and we wanna go forward with this. The goal is to get this merged quickly and that we take over for the final bits. No promise on when we expose this a real API, for now this will be proposed and we will experiment with the overall performance first. As next steps I would propose
|
|
Can we get a screenshot please? |
|
Will it be possible to create floating webviews with this? |
…ayer, change inset api proposal to push style, re #66418
|
fyi - while tackling some debt I have also jumped on this api proposal and I have changed it to a push model. surely some new regressions have been added, but the API really looks nice: vscode/src/vs/vscode.proposed.d.ts Lines 138 to 152 in 6f1da34
|
|
sample, implements command that adds an inset: vscode.commands.registerCommand('extension.sayHello', async (args, brgs, crgs) => {
if (!vscode.window.activeTextEditor) {
return;
}
const inset = vscode.window.createWebviewTextEditorInset(
vscode.window.activeTextEditor,
vscode.window.activeTextEditor.selection.with({ end: vscode.window.activeTextEditor.selection.end.translate(8) }),
// { enableScripts: true, enableCommandUris: true }
);
inset.onDidDispose(() => {
console.log('WEBVIEW disposed...');
});
inset.webview.html = `<head><meta></head><body><img src="https://imgs.xkcd.com/comics/plutonium.png"/><body>`;
}); |
|
@jrieken Is there a way to make the webview html interactive? (So that the user can click on a button in the code inset, for example) |
|
@jrieken Great work. The most astonishing point is that this is so fast and lightweight. I have a question. Insets disappear when we change tabs. Is this an intended behavior? I am looking forward to this feature coming to the stable branch. |
|
@jrieken I love the simplified the API, but I'm wondering about this code in the implementation: As far as I can tell, the fact that extension is null means that the |
Yes - for the API it means the editor goes aways and comes back (as new editor) and therefore you need to re-add them. This is inline with how decorations work.
Ops, that was an oversight and not in the intent. I will push a fix for that |
|
@jrieken Another piece of feedback on the new API, based on my PR for the Python extension to inline Jupyter results. First, in the new API, the inset range encodes two unrelated pieces of information: the line number where the inset should appear, and the height (in lines) of the inset. The fact that Second, I think the height needs to be specified in either lines or pixels. Consider the Python case below (still a work in progress). A textual result is easiest to express in lines, but an image result is easiest to express in pixels. Indeed, I cannot find an extension API method to get the line height to do the conversion myself. If such an API call exists, then I suppose it's okay to make the extension writer do the conversion. |
Took a short cut there... The neat thing with hight in lines (vs pixels) is that is honours different line height settings without further ado. Not yet sure how we could expose that to extension author tho... |
|
latest proposal (height is still a multiple of line numbers) export function createWebviewTextEditorInset(editor: TextEditor, line: number, height: number, options?: WebviewOptions): WebviewEditorInset; |
|
how access |
|
Hello, maybe I don't fully understand how this works, but is there a piece of API documentation relevant to this functionality, or is it not fully completed? |
|
@dddom check out this branch by @rdeline https://github.com/rdeline/vscode-python/tree/inset-results |
|
Wait, I don't get it. I'm really confused. Can I now use the //INLINE <img_url> command? (In my code editor it doesn't seem to work) I rather don't build a Python VSCode extension that is 20+ commits ahead and 300+ commits behind when I'm coding in JavaScript. |
|
@dddom: The API is still in Proposed status, which means it can't be used in extensions yet, but that's usually a matter of time. You can see the implementation of @melvinroest No, the "//INLINE" comment is an example of an extension which could be built to use Code Insets, rather than a description of this feature. So far, there are no user-visible changes to VSCode, and no published extensions can use Code Insets until it leaves Proposed status. |
|
hi guys complete noob here, is this in production now? |
|
FYI: issue #85682 opened. |



This PR introduces a new feature to allow an HTML document to be inset inside a code editor at a given line of code. This feature is exposed to extensions to support a variety of use cases. To illustrate the feature, the PR includes an extension that looks for specially formatted comments in JS/TS files, e.g.
// INLINE some-url
and embeds the contents of that URL directly below the comment line. Another use case is to support a user experience like computations notebooks (e.g. Jupyter) in which script results are shown inlined inside the script code.
This PR is an MVP to illustrate the feature.