当前位置: 首页 > news >正文

vscode插件开发之 - menu配置

   上一遍博客介绍了如何从0到1搭建vscode插件开发的base code,这遍博客将重点介绍如何配置menu。通常,开发一款插件,会将插件显示在VSCode 左侧的活动栏(Activity Bar),那么如何配置让插件显示在Activity Bar中呢?非常简单。在package.json中增加如下的内容即可。

SideBar配置

"viewsContainers": {"activitybar": [{"id": "demo","title": "demo","icon": "./public/static/bot.png"}]},"views": {"demo": [{"type": "webview","id": "demoSidebar","name": "DemoSidebar"}]},

activitybar配置的作用:在 VSCode 左侧的活动栏(Activity Bar)中添加一个新的视图容器。提供一个名为 "demo" 的新图标,当用户点击这个图标时,可以打开相关的视图面板.
views配置的作用:在 "demo" 视图容器中添加一个类型为 webview 的视图,名为 "demoSidebar"。需要注意:views里面的名称要与视图容器中定义的id保持一致。

配置了上面的内容后,如果要正常显示,还需要修改extension.ts的内容,extension.js中内容如下所示:下面的代码创建了一个WebviewViewProvider的class,通过resolveWebviewView方法来创建插件的UI界面。在activate方法中,再通过vscode.window.registerWebviewViewProvider将provider注册进去。

import * as vscode from 'vscode';
import * as path from 'path';class MyWebviewViewProvider implements vscode.WebviewViewProvider {public static readonly viewName = 'demoSidebar';constructor(private readonly _extensionPath: string) { }public resolveWebviewView(webviewView: vscode.WebviewView,context: vscode.WebviewViewResolveContext,_token: vscode.CancellationToken) {webviewView.webview.options = {enableScripts: true,localResourceRoots: [vscode.Uri.file(path.join(this._extensionPath, 'dist'))]};const onDiskPath = vscode.Uri.file(path.join(this._extensionPath, 'dist', 'bundle.js'));const webviewUri = webviewView.webview.asWebviewUri(onDiskPath);webviewView.webview.html = this.getWebviewContent(webviewUri);}private getWebviewContent(webviewUri: vscode.Uri): string {return `<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Taoli Webview</title></head><body><div id="root"></div><script src="${webviewUri}"></script></body></html>`;}
}export function activate(context: vscode.ExtensionContext) {context.subscriptions.push(vscode.window.registerWebviewViewProvider(MyWebviewViewProvider.viewName,new MyWebviewViewProvider(context.extensionPath)));
}export function deactivate() { }

上面构建html代码时,需要注意一点:在<body></body>中要添加上<div id="root"></div>的代码,否则UI无法显示,会提示无法找到root element的错误。因为在用React构建UI时,增加了查看root element的逻辑。下面是react构建的index.tsx文件。

const App = () => {return (<div><input type="text" name="name"></input><button>hello</button></div>);
};
const rootElement = document.getElementById('root');
if (rootElement) {const root = (ReactDOM as any).createRoot(rootElement);root.render(<App />);
} else {console.error('Root element not found!');
}

配置完成后,再次开启extension,可以看到在sidebar中显示了插件UI,具体如下图所示:

上面介绍了如何在sidebar中显示插件的UI,接着在看看如何在配置右键菜单,通过右键菜单,可以trigger相关的command。

配置右键菜单

下面的配置中,首先定义一个子菜单 demo.submenu,并命名为 "Demo"。接着,在编辑器的右键上下文菜单中添加一个子菜单 demo.submenu。使用户在右键点击编辑器中的内容时,可以方便地访问 "Demo" 相关的命令.在 demo.submenu 子菜单中添加 demo.showOne 和 demo.showTwo 命令,将相关的命令放入子菜单中,方便用户选择和执行这些命令.

 "contributes": {"commands": [{"command": "demo.showOne","title": "showOne"},{"command": "demo.showTwo","title": "showTwo"}],"submenus": [{"id": "demo.submenu","label": "Demo"}],"menus": {"editor/context": [{"submenu": "demo.submenu","group": "demo"}],"demo.submenu": [{"command": "demo.showOne"},{"command": "demo.showTwo"}]}},

配置完后,启动extension,在打开的文件中,点击右键,可以看到新配置的两个菜单。具体如下图所示:

如果要验证点击菜单是否有效,可以在extension.ts中对showOne和showTwo两个命令配置简单的信息显示即可。具体内容如下所示,修改extension.ts,再次运行,点击菜单后,在窗口中就会显示对应的信息。

export function activate(context: vscode.ExtensionContext) {context.subscriptions.push(vscode.window.registerWebviewViewProvider(MyWebviewViewProvider.viewName,new MyWebviewViewProvider(context.extensionPath)));context.subscriptions.push(vscode.commands.registerCommand('demo.showOne', () => {vscode.window.showInformationMessage('I am showOne.');}));context.subscriptions.push(vscode.commands.registerCommand('demo.showTwo', () => {vscode.window.showInformationMessage('I am showTwo.');}));
}

相关文章:

  • ffmpeg的部署踩坑及简单使用方式
  • Linux排查问题常用命令
  • C语言详解(文件操作)1
  • ARM的异常处理
  • Android 上展示 GIF 动图的方法
  • Stable Diffusion 3 Medium 模型
  • Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库
  • UnityAPI学习之延时调用(Invoke)
  • vscode中模糊搜索和替换
  • 如何使用asyncua模块在opcua的Server端添加值为列表的变量?
  • Office 2021 mac/win版:智慧升级,办公新风尚
  • 【大数据】计算引擎:Spark核心概念
  • L50--- 104. 二叉树的最大深度(深搜)---Java版
  • windows11 建立批处理bat文件来删除指定目录下的所有隐藏的文件。
  • mysql_ssl_rsa_setup使用详解
  • 分享的文章《人生如棋》
  • 时间复杂度分析经典问题——最大子序列和
  • CAP理论的例子讲解
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • leetcode388. Longest Absolute File Path
  • MySQL用户中的%到底包不包括localhost?
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Travix是如何部署应用程序到Kubernetes上的
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 将回调地狱按在地上摩擦的Promise
  • 前端技术周刊 2019-02-11 Serverless
  • 巧用 TypeScript (一)
  • 深度学习中的信息论知识详解
  • 跳前端坑前,先看看这个!!
  • 微信小程序:实现悬浮返回和分享按钮
  • 一文看透浏览器架构
  • 白色的风信子
  • FaaS 的简单实践
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 组复制官方翻译九、Group Replication Technical Details
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #1015 : KMP算法
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #NOIP 2014# day.1 T2 联合权值
  • $forceUpdate()函数
  • (7)STL算法之交换赋值
  • (c语言)strcpy函数用法
  • (第一天)包装对象、作用域、创建对象
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三)uboot源码分析
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十一)c52学习之旅-动态数码管
  • (一)Linux+Windows下安装ffmpeg
  • (转)memcache、redis缓存
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .gitignore文件使用