VSCode中的动态代码段评估

时间:2016-09-09 14:21:07

标签: visual-studio-code vscode-extensions

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

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

example of dynamic snippet expansion with dates

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

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 []

我已阅读User Defined Snippets上的文档,但似乎只能插入预定义文本,其中包含用户填写的制表位和变量。

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

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

2 个答案:

答案 0 :(得分:5)

绝对不可能在代码段内执行脚本或类似内容。

您可以编写Visual Studio Code的扩展名。扩展程序必须实现CompletionItemProvider

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

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

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

答案 1 :(得分:2)

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

"⌚ Date Time SNIPPET": {
    "prefix": "datetime",
    "body": [
        "${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}T${CURRENT_HOUR}:${CURRENT_MINUTE}:${CURRENT_SECOND}",
    ]
}

问题在于动态片段。这是一个使用CompletionItemProvider的示例:

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