当前位置:   article > 正文

vscode扩展开发_vscode 扩展开发

vscode 扩展开发

官方文档

VS Code API | Visual Studio Code Extension API

官方文档

https://code.visualstudio.com/api/references/vscode-api

vscode扩展整体开发流程

vscode插件开发流程 - 掘金

  • vscode插件开发调试

    1. 卸载开发的插件

    2. 执行watch脚本, 监听代码的变化

    3. 点击编辑器按F5, 进入调试状态

    4. Reload Window刷新页面

    5. 审核元素

          帮助 --> 切换开发人员工具

  • 外部登录交互

      背景

      当一个外部的应用程序或者网页试图通过特定的 URI 模式(通过链接快速执行 VSCode 中的命令 即:vscode://)启动或者与 VSCode 进行交互时,使用这个registerUriHandler可以注册一个处理程序(handler)以响应和处理这些 URI 请求。

      registerUriHandler 在 Visual Studio Code (VSCode) 中通常用于让你的扩展(extension)能够响应和处理外部调用的 URI (统一资源标识符)。

      VSCode打开外部链接

    vscode.env.openExternal(vscode.Uri.parse(url))

      VSCode扩展处理URI

    1. vscode.window.registerUriHandler({
    2. handleUri(uri) {
    3. if(uri.scheme === 'vscode') {
    4. // 解析和处理 URI 中的参数
    5. const query = new URLSearchParams(uri.query);
    6. }
    7. }
    8. });

      在 Visual Studio Code (VSCode) 中,可以通过构建特定的 URI 并使用 vscode:// 协议来快速执行 VSCode 内的命令。URI 的格式通常如下:

    vscode://<publisher>.<extension>/<command>?<params>

      extensionID:<publisher>.<extension>, 可在扩展的设置位置复制

    • <publisher> 是扩展的发布者名称。

    • <extension> 是扩展的名称。

    • <command> 是要执行的命令。

    • <params> 是传递给命令的参数,采用 URL 查询字符串的格式。

  • 状态栏设置快捷入口

      在extension.ts文件中创建状态栏

    1. // 创建状态栏快速入口
    2. let statusBarItem = vscode.window.createStatusBarItem(
    3. vscode.StatusBarAlignment.Right,
    4. 10
    5. );
    6. statusBarItem.command = "vscode.view.focus";
    7. statusBarItem.tooltip = "xxx";
    8. // 状态栏text设置需以package.json中配置的icons的key为准
    9. statusBarItem.text = `$(xxx-dark)`;
    10. statusBarItem.show();

      在package.json中创建一个图标

    1. "icons": {
    2. "xxx-dark": {
    3. "description": "icon",
    4. "default": {
    5. // fontPath需是woff/woff2/ttf格式
    6. "fontPath": "images/xxx.woff",
    7. "fontCharacter": "\\e900"
    8. }
    9. }
    10. }

woff字体可以通过https://icomoon.io/app/#/select生成

  1. 上传svg

  2. 选中上传的图标, 点击右下角的Font

  3. Download

  • 侧边栏标题旁设置操作区

        在package.json文件中menus下设置view/title

  1. "view/title": [
  2. {
  3. "command": "login",
  4. // 什么情况下进行展示, loginSuccess表示触发命令时进行展示
  5. "when": "loginSuccess && view == vscode.view",
  6. // 分组, 如不设置, 则会统一管理
  7. "group": "navigation"
  8. }
  9. ]

配置view/title之后需设置commands

  1. commands: [
  2. {
  3. "command": "login",
  4. "title": "已登录",
  5. // 设置不可交互
  6. "enablement": "false",
  7. // $(icon-name) vscode设置图标语法
  8. "icon": "$(clear-all)"
  9. }
  10. ]

要触发loginSuccess需使用

vscode.commands.executeCommand('setContext', 'loginSuccess', true);
  • 使用 VS Code 的语言特性获取所有的文档符号

    1. const editor = vscode.window.activeTextEditor!;
    2. // 该方式可以获取到全部的变量和函数的行号; 缺点是执行时间过久
    3. const symbols = await vscode.commands.executeCommand<vscode.DocumentSymbol[]>("vscode.executeDocumentSymbolProvider", editor.document.uri);
  • 代码透镜

    1. class MyCodeLensProvider {
    2. provideCodeLenses(document: vscode.TextDocument) {
    3. // 在这里实现你的逻辑来确定在哪些范围以及如何创建 CodeLens
    4. let lenses: vscode.CodeLens[] = [];
    5. // 假设我们为每个函数声明创建 CodeLens
    6. for (let i = 0; i < document.lineCount; i++) {
    7. const lineOfText = document.lineAt(i);
    8. if (lineOfText.text.startsWith("function")) {
    9. const range1 = new vscode.Range(i, 0, i, lineOfText.text.length);
    10. const command1: vscode.Command = {
    11. // 此命令将用于 CodeLens 交互
    12. command: "extension.showCodeLens",
    13. title: "代码解释", // 显示在 CodeLens 上的文本
    14. arguments: [], //传递到command命令的参数, 只能传递至registerCommand注册的命令
    15. };
    16. const range2 = new vscode.Range(i, 0, i, lineOfText.text.length);
    17. const command2: vscode.Command = {
    18. command: "extension.showCodeLens",
    19. title: "代码优化",
    20. };
    21. let lens1 = new vscode.CodeLens(range1, command1);
    22. let lens2 = new vscode.CodeLens(range2, command2);
    23. lenses.push(lens1, lens2);
    24. }
    25. }
    26. return lenses;
    27. }
    28. }
    29. let provider = new MyCodeLensProvider();
    30. // 注册 CodeLens 提供程序
    31. // 第一个参数指定 CodeLens 在哪种类型的文件中激活
    32. // 第二个参数是提供程序实例
    33. context.subscriptions.push(
    34. vscode.languages.registerCodeLensProvider("*", provider)
    35. );

  • 内联代码提示

    1. let completionItems: vscode.InlineCompletionItem[] = [];
    2. const provider = vscode.languages.registerInlineCompletionItemProvider(
    3. { pattern: "**" },
    4. {
    5. provideInlineCompletionItems: async (
    6. document: vscode.TextDocument,
    7. position: vscode.Position,
    8. context: vscode.InlineCompletionContext,
    9. token: vscode.CancellationToken
    10. ) => {
    11. // 每次触发代码提示triggerKind都是先1后0, 不进行判断会连续执行两次提示
    12. if (context.triggerKind === vscode.InlineCompletionTriggerKind.Invoke) {
    13. return completionItems;
    14. } else if (
    15. context.triggerKind === vscode.InlineCompletionTriggerKind.Automatic
    16. ) {
    17. const editor = vscode.window.activeTextEditor!;
    18. const cursorPosition = editor.selection.active;
    19. let beforeSelection = new vscode.Selection(
    20. 0,
    21. 0,
    22. cursorPosition.line,
    23. cursorPosition.character
    24. );
    25. // 获取光标之前的文本
    26. let beforeText = document.getText(beforeSelection);
    27. const trailingRange = new vscode.Range(
    28. cursorPosition,
    29. document.lineAt(document.lineCount - 1).range.end
    30. );
    31. const trailingText = document.getText(trailingRange);
    32. if (
    33. cursorPosition.character === 0 &&
    34. beforeText[beforeText.length - 1] !== "\n"
    35. ) {
    36. beforeText += "\n";
    37. }
    38. if (beforeText.trim() === "") {
    39. return [];
    40. }
    41. let beforeLine = document?.lineAt(cursorPosition.line - 1);
    42. let beforeLineText = beforeLine?.text;
    43. let result = await util.getCodeCompletions();
    44. const completionItem = new vscode.InlineCompletionItem(
    45. result, // 插入的文本
    46. new vscode.Range(
    47. cursorPosition.translate(0, result.length),
    48. cursorPosition
    49. ) // 插入文本的位置
    50. );
    51. completionItems.push(completionItem);
    52. return completionItems;
    53. }
    54. },
    55. }
    56. );
    57. context.subscriptions.push(provider);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/918512
推荐阅读
相关标签
  

闽ICP备14008679号