Можно ли в VSCode вызывать команды между расширениями?

Например, есть два расширения VSCode:

  • extension1 зарегистрировал команду exCommand1
  • extension2 зарегистрировал команду exCommand2

Согласно документации, расширение VSCode может вызывать команды (ref: https://code.visualstudio.com/docs/extensionAPI/vscode-api)

executeCommand<T>(command: string, ...rest: any[]): Thenable<T | undefined>

Если API Doc верен, то

  • extension1 может звонить exCommand2, предоставленный extension2
  • extension2 может звонить exCommand1, предоставленный extension1

Но расширения VSCode загружаются лениво, так как же вызвать команду из другого расширения, которое, возможно, еще не загружено?


person gyeongseok seo    schedule 10.01.2017    source источник


Ответы (1)


Я знаю, что это старый пост, если у вас все еще есть те же требования или другие ищут в Google, вот как я это сделал.

var xmlExtension =  vscode.extensions.getExtension( 'DotJoshJohnson.xml' );

// is the ext loaded and ready?
if( xmlExtension.isActive == false ){
    xmlExtension.activate().then(
        function(){
            console.log( "Extension activated");
            // comment next line out for release
            findCommand(); 
            vscode.commands.executeCommand("xmlTools.formatAsXml");
        },
        function(){
            console.log( "Extension activation failed");
        }
    );   
} else {
    vscode.commands.executeCommand("xmlTools.formatAsXml");
}


// dev helper function to dump all the command identifiers to the console
// helps if you cannot find the command id on github.
var findCommand = function(){
    vscode.commands.getCommands(true).then( 
        function(cmds){
            console.log("fulfilled");
            console.log(cmd);
        },
        function() {
            console.log("failed");
            console.log(arguments);
        }
    )
};
person Mesh    schedule 01.09.2017
comment
Небольшим камнем преткновения для меня было выяснить, что именно передать vscode.extensions.getExtension(). Чтобы получить список идентификаторов расширений, вы можете использовать vscode.extensions.all.map(x => x.id). Они имеют форму <extension publisher>.<extension name>. - person zanedp; 27.01.2020
comment
Не я ответил на вопрос. Вы можете попробовать передать их в качестве второго параметра vscode.commands.executeCommand("xmlTools.formatAsXml", HERE);, но не знаете, работает ли он между расширениями. - person Alex; 12.05.2020