VSCode中的动态代码段评估

Chr*_*ott 9 visual-studio-code vscode-extensions

片段是否可以在Visual Studio代码中插入动态计算的完成或片段?

我想要一个用于插入各种格式的日期和时间字符串的代码段.例如,如果键入date,将自动扩展ISO格式的当前日期.

带日期的动态代码段扩展示例

Sublime Text中有一个工具可以通过类中的on_query_completions方法在python API中执行此操作EventListener.那里的实现非常简单:

def on_query_completions(self, view, prefix, locations):
  if prefix == 'date':
    val = datetime.now().strftime('%Y-%m-%d')
  return [(prefix, prefix, val)] if val else []
Run Code Online (Sandbox Code Playgroud)

我已阅读有关用户定义代码段的文档,但似乎只能插入预定义文本,其中包含用户填写的制表位和变量.

如果使用代码段API公开的功能无法实现这一点,我是否可以通过较低级别的插件/扩展API实现类似的功能?

我确实知道有一个名为Insert Date and Time的现有扩展,但这可以通过命令托盘而不是动态扩展来实现.

Wos*_*osi 6

绝对不可能在代码段内执行脚本或类似的东西.

您可以编写Visual Studio Code的扩展名.扩展必须实现一个CompletionItemProvider.

它的provideCompletionItems方法将返回一个列表CompletionItems.它们的filterText属性将设置为建议框中显示的文本(例如"日期"或"时间"),其insertText属性将设置为动态计算值.

最后,您需要使用注册完成提供程序registerCompletionItemProvider.

在开始之前,您应该完全了解如何创建扩展:https://code.visualstudio.com/docs/extensions/example-hello-world

  • @ chris-scott,我正在寻找如何做同样的事情(同样的原因 - 不同格式的时间戳).既然听起来你有它工作,关心分享你的扩展或把它放在VS Code Marketplace上?:) (2认同)

Ale*_*lex 6

尽管如此,无需扩展也可以实现简单的日期时间内容:

\n\n
"\xe2\x8c\x9a Date Time SNIPPET": {\n    "prefix": "datetime",\n    "body": [\n        "${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}T${CURRENT_HOUR}:${CURRENT_MINUTE}:${CURRENT_SECOND}",\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是关于动态片段。这是使用的示例CompletionItemProvider

\n\n
const datetimeProvider = vscode.languages.registerCompletionItemProvider(\n    {\n        scheme: \'file\',\n        // language: \'typescript\',\n    },\n    {\n        provideCompletionItems(document: vscode.TextDocument, position: vscode.Position) {\n            const completionItem = new vscode.CompletionItem(\'datetime \xe2\x8c\x9a\', vscode.CompletionItemKind.Snippet);\n            completionItem.insertText = new Date(Date.now() - new Date().getTimezoneOffset() * 60000).toISOString().split(\'.\')[0];\n            return [completionItem];\n        }\n    },\n    // \'\'// trigger character\n);\n
Run Code Online (Sandbox Code Playgroud)\n