Оценка динамического сниппета в VSCode

Возможно ли, чтобы фрагмент кода вставлял динамически вычисляемое завершение или фрагмент в код Visual Studio?

Мне нужен фрагмент для вставки строк даты и времени различных форматов. Например, если вы наберете date, текущая дата в формате ISO будет автоматически расширена.

пример динамического расширения сниппета с указанием дат

В Sublime Text есть возможность сделать это в API Python через _ 2_ в классе 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 []

Я прочитал документацию по Пользовательским фрагментам, но, похоже, можно вставить только предварительно -определенный текст с позициями табуляции и переменными, которые пользователь заполняет.

Если это невозможно с функциональностью, предоставляемой API фрагмента, смогу ли я реализовать что-то подобное с помощью API плагинов / расширений нижнего уровня?

Я понимаю, что существует расширение под названием Insert Date and Time, но это работает через палитру команд вместо динамического расширения.


person Chris Scott    schedule 09.09.2016    source источник
comment
Вы можете использовать расширение Command Variable и определить сочетания клавиш   -  person rioV8    schedule 09.08.2020


Ответы (2)


Определенно невозможно выполнить сценарий или что-то подобное в сниппете.

Вместо этого вы можете написать расширение для Visual Studio Code. Расширение должно реализовывать CompletionItemProvider.

Его provideCompletionItems метод вернет список CompletionItems. Их filterText свойства будут установлены в тексты, отображаемые в поле предложения (например, «дата» или «время»), а их свойства insertText будут установлены на динамически вычисляемые значения.

Наконец, вам нужно будет зарегистрировать поставщика завершения, используя registerCompletionItemProvider.

Перед тем, как начать, вы должны обязательно взглянуть на то, как создать расширение: https://code.visualstudio.com/docs/extensions/example-hello-world

person Wosi    schedule 09.09.2016
comment
Спасибо, это указывало мне в правильном направлении. Использование CompletionItems для реализации не так просто, как ST для этого варианта использования, но дает большую гибкость. - person Chris Scott; 12.09.2016
comment
@ chris-scott, я искал, как сделать то же самое (и по той же причине - метки времени в разных форматах). Поскольку похоже, что оно у вас работает, не хотите ли поделиться своим расширением или разместить его на VS Code Marketplace? :) - person Dullroar; 16.09.2016
comment
@Dullroar, да, я планирую. Я не тестировал его вне режима разработки, поэтому я еще не опубликовал его, но я загружу его на github, чтобы вы могли посмотреть. - person Chris Scott; 19.09.2016
comment
С нетерпением жду этого. - person Dullroar; 21.09.2016
comment
это все еще так или какие-либо обновления по этому поводу? Погуглил, но ничего не нашел :( - person sreenivas; 05.09.2017
comment
Вы можете выполнять сценарии в фрагментах с помощью HyperSnips, а insertText может быть динамически созданный фрагмент кода - person rioV8; 09.08.2020

Тем не менее, можно достичь простых вещей с указанием даты и без расширений:

"⌚ 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
);
person Alex    schedule 09.08.2019