【问题标题】:VS Code Branching Snippet Completion Items ExtensionVS Code Branching Snippet Completion Items 扩展
【发布时间】:2022-08-15 08:50:31
【问题描述】:

我正在尝试将 Completion sn-ps 添加到我正在编写的基于完成示例(https://github.com/microsoft/vscode-extension-samples/tree/main/completions-sample)的扩展中。我想让它分支完成。在我的扩展中,是一个关键字,然后有可能的参数。然后每个参数都有更多参数。

前任:设置 FOO|BAR|BAS在哪里设置富开|关,设置栏1|2|3, 和设置基础红色|蓝色.

我试过用

            const SetCompletion = new vscode.CompletionItem(\'SET\');
            SetCompletion.insertText = new vscode.SnippetString(\'SET ${1|FOO,BAR,BAS|};\');

然后继续

            const SetFooCompletion = new vscode.CompletionItem(\'FOO\');
            SetFooCompletion.insertText = new vscode.SnippetString(\'FOO ${1|ON,OFF|};\');

            const SetBarCompletion = new vscode.CompletionItem(\'BAR\');
            SetBarCompletion.insertText = new vscode.SnippetString(\'BAR ${1|1,2,3|};\');

            const SetBasCompletion = new vscode.CompletionItem(\'BAS\');
            SetBasCompletion.insertText = new vscode.SnippetString(\'BAS ${1|RED,BLUE|};\');

如果我在插入第一个项目后重新触发完成,这种工作方式。我认为可能有更好的方法。在我的真实世界代码中,我可以调用大约 15 个 SET 东西,每个都有不同类型的参数。有些是 ON|OFF,有些是数字,有些是字符串。在上面的 sn-ps 中,SET BAR ON 是无效的,因为 BAR 是一个整数并且只有 FOO 是 ON|OFF 所以我不想为所有 SET 语句提供所有可能的参数。它们应该特定于在第一次完成中解析的 SET 命令。

这可能吗?

编辑:修正了示例代码中的错别字

  • 在您的 CompletionItemProvider 中,首先只为 SET 的第一个参数提供一个 sn-p,然后当用户键入空格时,您会为用户选择的情况找到正确的选项 sn-p:SET FOO SET BAR ,请注意测试字符串末尾的空格

标签: visual-studio-code vscode-extensions vscode-snippets


【解决方案1】:

以下代码有效。

const linePrefix = document.lineAt(position).text.substr(0, position.character);
if (linePrefix.endsWith('SET')) {
  const setCompletion = new vscode.CompletionItem('SET', vscode.CompletionItemKind.Snippet);
  setCompletion.insertText = new vscode.SnippetString('SET ${1|FOO,BAR,BAS|};');
  const setFooCompletion = new vscode.CompletionItem('SET FOO', vscode.CompletionItemKind.Snippet);
  setFooCompletion.insertText = new vscode.SnippetString('SET FOO ${1|ON,OFF|};');
  const setBarCompletion = new vscode.CompletionItem('SET BAR', vscode.CompletionItemKind.Snippet);
  setBarCompletion.insertText = new vscode.SnippetString('SET BAR ${1|1,2,3|};');
  const setBasCompletion = new vscode.CompletionItem('SET BAS', vscode.CompletionItemKind.Snippet);
  setBasCompletion.insertText = new vscode.SnippetString('SET BAS ${1|RED,BLUE|};');
  return [setCompletion, setFooCompletion, setBarCompletion, setBasCompletion];
}

如果您使用new vscode.CompletionItem('FOO');,它将不起作用。看起来标签必须与该行的最后一个单词匹配。

还有线

blablaSET

不给出完成项。 SET 必须是一个单独的词。完成项已创建但未显示。


或者您可以尝试:

const linePrefix = document.lineAt(position).text.substr(0, position.character);
if (linePrefix.endsWith('SET')) {
  const setCompletion = new vscode.CompletionItem('SET', vscode.CompletionItemKind.Snippet);
  setCompletion.insertText = new vscode.SnippetString('SET ${1|FOO,BAR,BAS|}$0;');
  return [setCompletion];
}
if (linePrefix.endsWith('SET FOO')) {
  const setFooCompletion = new vscode.CompletionItem('FOO', vscode.CompletionItemKind.Snippet);
  setFooCompletion.insertText = new vscode.SnippetString('FOO ${1|ON,OFF|}');
  return [setFooCompletion];
}
if (linePrefix.endsWith('SET BAR')) {
  const setBarCompletion = new vscode.CompletionItem('BAR', vscode.CompletionItemKind.Snippet);
  setBarCompletion.insertText = new vscode.SnippetString('BAR ${1|1,2,3|}');
  return [setBarCompletion];
}
if (linePrefix.endsWith('SET BAS')) {
  const setBasCompletion = new vscode.CompletionItem('BAS', vscode.CompletionItemKind.Snippet);
  setBasCompletion.insertText = new vscode.SnippetString('BAS ${1|RED,BLUE|}');
  return [setBasCompletion];
}

选择SET 选项之一后,您必须使用Ctrl+Space 触发CompletionItems。使用TAB(多次)时离开sn-p(或双sn-p)时仔细看

【讨论】:

    【解决方案2】:

    我看了很长时间,试图弄清楚发生了什么,并得出结论,因为你的第一个 sn-p 是选择sn-p,您将无法像您想要的那样简单地做到这一点。

    通常,如果你使用这个

    const SetCompletion  = new vscode.CompletionItem('SET');
    SetCompletion .insertText = new vscode.SnippetString('SET ${1|FOO,BAR,BAS|};');
    
    SetCompletion.command = { command: 'editor.action.triggerSuggest', title: 'Re-trigger completions...' };
    

    command 属性将帮助您避免手动重新触发 FOO/BAR/BAS 的建议。但它不起作用。我确信command 在插入 sn-p 之后但在它完成之前运行。

    如果您使用其他命令,例如

    SetCompletion.command = { command: 'leaveSnippet', title: '...' };
    

    在这种情况下,您甚至不会得到选择,因为leaveSnippet 命令已经运行!

    所以看起来最简单的是:

    const SetFooCompletion = new vscode.CompletionItem('SET FOO');
    SetFooCompletion.insertText = new vscode.SnippetString('SET FOO ${1|ON,OFF|};');
    
    const SetBarCompletion = new vscode.CompletionItem('SET BAR');
    SetBarCompletion.insertText = new vscode.SnippetString('SET BAR ${1|1,2,3|};');
    
    const SetBasCompletion = new vscode.CompletionItem('SET BAS');
    SetBasCompletion.insertText = new vscode.SnippetString('SET BAS ${1|RED,BLUE|};');
    

    您将不得不制作一堆SET xxx CompletionItems,但不会手动触发建议来完成。


    作为一个有趣的旁白(以及更多证明command 正在运行sn-p 选择,因此没有用是这样的代码:

    const SetCompletion = new vscode.CompletionItem('SET');
    SetCompletion.insertText = new vscode.SnippetString('${TM_FILENAME_BASE/(.*)/${1:/upcase}/}');
    
    SetCompletion.command = { command: 'folder-operations.setCompletionCommand', title: 'Re-trigger completions...' };
    

    将命令定义为

    const setCompletionHandler = vscode.commands.registerCommand('folder-operations.setCompletionCommand', async () => {
      await vscode.commands.executeCommand('editor.action.triggerSuggest');
      await vscode.commands.executeCommand('acceptSelectedSuggestion');
    });
    context.subscriptions.push(setCompletionHandler);
    

    如果您在 FOO.<some extension>BAR.<ext>BAS.<ext> 中运行它,它将按预期工作。在运行 command 之前解析 sn-p fileNameBase - 该命令只选择最佳选择。

    【讨论】:

      猜你喜欢
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      相关资源
      最近更新 更多