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')