vscode [请求] [笔记本] 在单元格的语言选择器中允许使用任意值,

sgtfey8w  于 5个月前  发布在  Vscode
关注(0)|答案(7)|浏览(68)

.NET交互式笔记本允许通过单元格底部右侧的语言选择器使用不同的单元格语言。目前,唯一允许的值是已经通过清单的"contributes"."languages"字段与VS Code预先注册的语言。
我们经常看到的一个常见场景是用户创建了多个连接到不同SQL数据库的连接,例如AdventureWorksNorthwind。目前,我们通过预先注册一个名为"SQL (.NET Interactive)"的别名的语言dotnet-interactive.sql来处理这种情况,但这实际上并不能让用户针对特定的数据库连接执行查询。他们必须将一个魔术命令放在单元格的顶部,我们用它来路由请求。
例如,一个单元格的语言可能被设置为"SQL (.NET Interactive)",但其内容如下:

#!sql-AdventureWorks
SELECT * FROM ...

下一个单元格的语言也被设置为"SQL (.NET Interactive)",但其内容如下:

#!sql-Northwind
SELECT * FROM ...

如果用户可以从下拉菜单中简单地选择"C# (.NET Interactive)","F# (.NET Interactive)","AdventureWorks","Northwind"等选项,那么对于用户来说将会更加有指导意义。其中最后两个项目是我们在运行时动态添加的。

dphi5xsq

dphi5xsq1#

当我与我的团队讨论这个想法时,我们已经缩小了要求范围。
笔记本控制器具有 supportedLanguages 类型为 string[] | undefined 的属性。然后这些字符串值与在运行时注册到VS Code的语言进行匹配,下拉菜单显示“友好”名称。例如,将该属性设置为 ['dotnet-interactive.csharp', 'dotnet-interactive.fsharp'] 将导致在下拉菜单中可见的值为“C#(.NET交互式)”和“F#(.NET交互式)”。

需求

我们建议将 supportedLanguages 属性类型扩展到 string[] | { languageId: string, displayName?: string }[] | undefined,其中如果存在 displayName? 属性,则在运行时使用它,否则使用已注册语言的“友好”名称的默认值。

结果

在一个具有多个SQL连接的.NET Interactive笔记本中,用户下拉菜单将显示数据库连接的名称。

示例

notebookController.supportedLanguages = [
    { languageId: 'dotnet-interactive.csharp' },
    { languageId: 'dotnet-interactive.fsharp' },
    // ...all the other values normally present
    { languageId: 'dotnet-interactive.sql', displayName: 'AdventureWorks (SQL Server 2018 - localhost)' },
    { languageId: 'dotnet-interactive.sql', displayName: 'Northwind (SQL Server 2008 - Azure)' },
];

需要注意的是,最后两个条目都列出了 dotnet-interactive.sql 作为语言ID,这是为了能够选择正确的TextMate语法,但是 displayName? 属性是不同的,所以用户可以区分它们。

此时,.NET Interactive扩展可以获取单元格选定的语言标识符,例如:

// this API should come from VS Code
getCellLanguageValue(cell: NotebookCell): string | { languageId: string, displayName?: string } {
    ...
}

// this code is in the .NET Interactive extension
const cellLanguage = getCellLanguageValue(theCell);
if (typeof cellLanguage === 'string') {
    // we do our own mapping from `dotnet-interactive.csharp` to `C#`, etc.
} else if (typeof cellLanguage.languageId === 'string' && typeof cellLanguage.displayName === 'string') {
    // now we map against the cell's reported language as well as its display name
} ... // all other scenarios
6fe3ivhb

6fe3ivhb2#

目前,我们通过预先注册一个别名为"SQL (.NET Interactive)"的语言dotnet-interactive.sql来处理这个问题,但这实际上并不能让用户针对特定的数据库连接执行查询。

你能解释一下是什么在区分这些语言吗?我从语言定义的Angular 提问:它们有不同的语法、括号规则还是注解标记吗?从你提供的模拟/示例来看,似乎更像是某种备份/服务器连接信息,这让我怀疑是否应该继续扩展语言。

2w3rbyxf

2w3rbyxf3#

你能解释一下如何区分这些语言吗?
从语言的Angular 来看,我们称之为“SQL - AdventureWorks”的语言与“SQL - Northwind”相同,意味着相同的语法、注解标记等,但我们需要知道要针对哪个内部连接对象执行查询,而单元格底部的下拉菜单似乎是让用户做出选择的理想场所。
在类似的情况下,我们目前有一个C#语言/内核,但我们希望给用户一个选项,让他们能够启动一个针对.NET 7运行的实验性C# 11内核。从语言的Angular 来看,它仍然是C#,但我们的笔记本控制器需要知道在哪里分派该请求,因此给用户“C# (.NET Interactive)”(当前)“C#预览 - .NET 7 (.NET Interactive)”是他们做出区分的方式。

i2byvkas

i2byvkas4#

另一个例子:

  • .NET Interactive的VS Code扩展有两个不同的JavaScript "子内核"。一个在扩展主机中运行,并可以访问VS Code功能(编辑器特性、UI交互等),而另一个在webview中运行,可用于生成单元格输出,编写针对数据可视化库的代码等。
  • .NET Interactive有一个"值"内核,可以直接粘贴文本。它是一个纯文本单元格,但功能是特定的。您可以使用它直接粘贴数据,而无需担心需要转义它。允许在下拉菜单中宣传它将有助于可发现性。
kadbb459

kadbb4595#

我认为我们明天早上会讨论这个问题,但我会先给你我的初步React——看起来你把两个概念混淆了——语言和代码执行的位置。有任何理由你不能让语言选择器保持不变,而是使用一个NotebookCellStatusBarItemProvider来在它旁边提供另一个选项,显示基于单元格语言的目标可用选项吗?这两个概念似乎是独立的,我们不应该为组合矩阵制造虚假的语言。

cdmah0mi

cdmah0mi6#

概念是独立的,但我们还没有遇到过将它们作为两个独立的用户手势增加价值的情况。这是因为在我们见过的每个例子中(其中一些在上面已经描述过了),语言与代码执行的位置是密不可分的。

让我们以SQL为例。如果我首先选择SQL,我仍然需要在查看特定于模式的自动补全或运行查询之前选择要连接的数据库。由于数据库使用特定的语言(可能是PostgreSQL,也可能是T-SQL),选择语言是在选择连接时隐含的。孤立地选择SQL是没有用的。对于用户来说,这只是一种多余的、多余的点击。

从不同的Angular 看,孤立地选择语言能提供什么价值呢?如果我选择C#,我无法将其发送到我的JavaScript、Python、SQL、Mermaid或HTML内核,并获得除语法错误之外的任何结果。

nfs0ujit

nfs0ujit7#

语言是代码单元格的最基本特征,在我看来,它需要在vscode笔记本中独立存在。一个包含Python代码的单元格仅仅是一段Python代码,无论它将如何执行。一个.js文件必须是一个.js文件,即使我们可以通过强制用户告诉我们它将在node还是浏览器中运行来提供更好的体验。当然,你需要连接到数据库来执行你的SQL查询,但我应该被允许在不先连接到数据库的情况下输入SQL代码。我应该能够在wifi中断时创建单元格😁
但是,如果你想在创建单元格时获得更快的体验,听起来你像是想创建一个带有某种模板的单元格。如果这里有第三个按钮,可以弹出一个带有语言*运行时的自定义选择器矩阵会怎样呢?

你甚至可以在单元格状态栏中添加一个按钮来弹出这样的选择器,并填充语言和运行时字段。
听说我们要面对面见面,但我的日程表上什么都没有


## 语言与运行时的选择器

- 语言: Python
- 运行时: Node
- 语言: JavaScript
- 运行时: Browser

相关问题