10

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

我想要一个用于插入各种格式的日期和时间字符串的片段。例如,如果您键入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 []

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

如果片段 API 公开的功能无法做到这一点,我能否通过较低级别的插件/扩展 API 实现类似的功能?

我确实意识到有一个名为“插入日期和时间”的现有扩展,但这通过命令托盘而不是动态扩展来工作。

4

2 回答 2

7

绝对不可能在片段中执行脚本或类似的东西。

您可以改为为 Visual Studio Code 编写扩展。扩展必须实现一个CompletionItemProvider.

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

最后,您需要使用registerCompletionItemProvider.

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

于 2016-09-09T15:05:27.670 回答
5

虽然,可以在没有扩展的情况下实现简单的日期时间:

"⌚ 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
);
于 2019-08-09T17:22:29.183 回答