Сайт

Commands

Объявите команду в contributes.commands, затем зарегистрируйте её поведение с помощью sdk.commands.

registerCommand

registerCommand(id: string, handler: (...args: unknown[]) => void): IDisposable

Используйте тот же короткий идентификатор command, что и в манифесте. Fragmenta добавляет к нему пространство имён вашего расширения, поэтому полный идентификатор команды — <publisher>.<name>.<command>, так что идентификаторы никогда не пересекаются между расширениями.

export function activate(context: ExtensionContext) {
  context.subscriptions.push(
    sdk.commands.registerCommand('sayHello', () => {
      sdk.window.showInfoMessage('Привет!')
    }),
  )
}
  • Обработчик получает аргументы, переданные вызывающей стороной.
  • Хотя по типу обработчик возвращает void, он может вернуть значение или promise — результат возвращается тому, кто выполнил команду.
  • Команда, зарегистрированная без объявления в манифесте, всё равно может быть выполнена по идентификатору, но у неё нет заголовка, категории или условия when и она не отображается в панели команд.
  • Регистрации удаляются при деактивации расширения.

executeCommand

executeCommand<T, A extends unknown[] = unknown[]>(id: string, ...args: A): T

Выполняет команду по идентификатору. Команды вашего собственного расширения сначала разрешаются по короткому идентификатору; всё остальное выполняется как глобальная команда. Возвращаемое значение зависит от того, какой путь разрешения используется:

| Команда | Возвращает | | --- | --- | | Ваша, по короткому id | Результат обработчика, синхронно. Исключения пробрасываются вам, when не проверяется. | | Всё остальное | Promise, который резолвится результатом команды — или undefined, если команды нет, у неё нет обработчика, она отключена своим when или бросила исключение. |

Глобальные команды включают команды из других расширений, вызываемые по их полному идентификатору <publisher>.<name>.<command>, а также ваши собственные команды, вызываемые по полному идентификатору. Их аргументы и возвращаемые значения пересекают границу хоста расширений, поэтому они должны быть сериализуемыми.

sdk.commands.executeCommand('sayHello')

const result = await sdk.commands.executeCommand<Promise<string | undefined>>('acme.tools.pickColor')