【问题标题】:Can I trigger a code snippet programmatically in an extension?我可以在扩展程序中以编程方式触发代码片段吗?
【发布时间】:2021-09-10 15:24:58
【问题描述】:

我有一个提供一些 sn-ps 的扩展。我想添加一个命令,该命令创建一个新文件,并为用户自动触发 sn-p。这个想法是让用户立即编辑制表位而无需任何进一步的操作。比如:

  1. 运行命令(从命令面板或键绑定)
  2. VSCode 打开一个新文件,其中 sn-p 已评估并在第一个制表位等待用户输入

我已经搜索了 API,但没有找到任何可以触发 sn-p 的东西。最相关的 API 是那些关于 CompletionItemProvider 的 API,可用于提供 sn-p。

有人知道如何自动触发/扩展 sn-p 吗?

【问题讨论】:

    标签: visual-studio-code vscode-extensions


    【解决方案1】:

    TextEditor 上还有一个insertSnippet 方法,参见https://code.visualstudio.com/api/references/vscode-api#TextEditor

    所以你可以这样做:

    const editor = vscode.window.activeTextEditor;
    
    // build your snippet with the SnippetString methods
    const snippet = new vscode.SnippetString("option1 attr1=${2:Option 1 Placeholder 1} attr2=${3:Option 1 Placeholder 2}");
    
    await editor.insertSnippet(snippet);
    

    您也可以像这样运行命令insertSnippet

    // body of snippet here is exactly as you would write it in a keybinding
    await vscode.commands.executeCommand("editor.action.insertSnippet", { "snippet": "${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}T${CURRENT_HOUR}:${CURRENT_MINUTE}:${CURRENT_SECOND}Z" });
    
    // the below uses a pre-existing snippet with a name 'Custom Header'
    await vscode.commands.executeCommand("editor.action.insertSnippet", { "name": "Custom Header"});
    

    最后一个executeCommand 可以引用您在扩展中贡献的预先存在的sn-p。更多内容见下文。

    所有这些命令都将在光标处插入,sn-ps 位于您想要的第一个制表位位置。


    在你的扩展中贡献 sn-ps:

    在你的package.json:

    "contributes": {
      "snippets": [
        {
          "language": "javascript",
          "path": "./snippets/javascript.json"
        }
      ]
    }
    

    您在扩展程序中创建了一个名为 snippets 的文件夹,并为 javascript sn-ps 创建了一个名为 javascript.json 的文件。然后在该文件中使用通常的 sn-p 格式,例如:

    {
      "Custom Header2": {             // use this 'name'
        "prefix": "reactpure",
        "body": [
            "import React from 'react';",
            "import PropTypes from 'prop-types';",
            "import './${1:ComponentName}.module.css';",
            "const ${1:ComponentName} = ({ ${2:propValue=[] } }) => (",
            "<${3:rootelement}>${4:content}</${3:rootelement}>",
            ")",
            "${1:ComponentName}.propTypes = {",
            "${5:propValue}: PropTypes.string",
            "};",
            "export default ${1:ComponentName};",
            "$0"
        ],
        "description": "Create a react pure component"
        }
    }
    

    然后你可以在你的扩展中使用name

    // using an extension-contributed snippet
    await vscode.commands.executeCommand("editor.action.insertSnippet", { "name": "Custom Header2"});
    ``
    

    【讨论】:

    • 啊!谢谢!起初我确实尝试过insertSnippet,但对我没有用。错误是我在做:await vscode.commands.executeCommand("editor.action.insertSnippet", "Custom Header"); 而不是正确的await vscode.commands.executeCommand("editor.action.insertSnippet", { "name": "Custom Header"});
    猜你喜欢
    • 2011-10-11
    • 2013-04-03
    • 2011-06-26
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多