实现一个vscode插件:打开多个vscode项目时根据.nvmrc文件自动切换nvm

在这里插入图片描述

开发背景与最终功能

需要维护一些老项目,同时开发新项目时,切换nvm很烦人
最终实现vscode插件:每个vscode实例打开一个项目,切换vscode实例时能自动切换版本(需要项目根目录有一个.nvmrc文件)

插件下载

vscode插件市场搜索vscode-nvmrc在这里插入图片描述

设计思路

项目根目录新建.nvmrc文件,这是nvm的官方文件,当使用nvm use时会自动查找这个文件,而windows系统一般使用的是nvm-for-windows,它是由另一个开发者维护的windows版本,并不支持nvm use查找.nvmrc
不过这并不影响vscode插件中实现nvm use功能,只不过了解下.nvmrc是nvm的官方文件

话不多说,上代码,很简单,vscode插件方法vscode.window.onDidChangeWindowState中读取下.nvmrc文件,e.focused表示当vscode窗口显示时触发,切换vscode实例时能够触发,然后调用child_process.exec 运行nvm use

import * as vscode from "vscode";
import { exec } from "child_process";
import { readFile } from "fs";
import { resolve } from "path";let statusBar: vscode.StatusBarItem | undefined;
let timeout: NodeJS.Timeout;enum Status {error = "error",
}
function customStatusBar(text: string, type?: Status, time = 4000) {if (statusBar) {statusBar.dispose();}if (timeout) {clearTimeout(timeout);}statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);statusBar.color = "#ffffff";if (type === Status.error) {statusBar.backgroundColor = new vscode.ThemeColor("statusBarItem.errorBackground");}if (!type) {statusBar.backgroundColor = new vscode.ThemeColor("statusBarItem.warningBackground");}statusBar.text = "vscode-nvmrc: " + text;statusBar.show();timeout = setTimeout(() => {if (statusBar) {statusBar.dispose();}}, time);return;
}function execute(cmd: string) {exec(cmd, (error, stdout, stderr) => {if (error) {customStatusBar(`${error}`);} else {if (stderr) {customStatusBar(stderr);} else {customStatusBar(stdout);}}});
}function nvmuse(url: string) {readFile(url, { encoding: "utf8" }, (err, data) => {if (err) {customStatusBar(".nvmrc file not found.");return;}execute("nvm use " + data);});
}function resolveRootPathAndNvmuse() {const workspaceFolders = vscode.workspace.workspaceFolders;if (workspaceFolders && workspaceFolders.length > 0) {const rootPath = workspaceFolders[0].uri.fsPath;if (rootPath) {const url = resolve(rootPath, ".nvmrc");nvmuse(url);}}
}export function activate(context: vscode.ExtensionContext) {resolveRootPathAndNvmuse();const disposable = vscode.window.onDidChangeWindowState((e) => {if (e.focused) {resolveRootPathAndNvmuse();}});context.subscriptions.push(disposable);
}export function deactivate() {}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/22942.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学建模———层次分析法及其matlab语法,函数和代码实现

层次分析法思想登场 建模比赛中最基础的模型之一,其主要用于解决评价类问题(例如:选择那种方案最好,哪位运动员或者员工表现的更优秀。) 评价类问题字眼: 评价的目标是什么?达到这个目标有那…

【已解决】JavaScript为控件绑定事件死活不生效

本博文源于最近操作的JavaScript一个诡异的事情。我在用js一个动态生成的按钮,然后想要为其绑定一个alert的事件,结果发现控制台给我报未定义的错误,我慌的不要要的,经过长时间胡乱尝试终于解决了。 问题再现 dataHtml "&…

uniapp 打包安卓apk (原生App)云打包

uniapp 打包安卓apk (原生App)云打包 hbuilder中操作 项目的一些配置appid DCloud appid 用途/作用/使用说明: https://ask.dcloud.net.cn/article/35907 右键我们项目目录-》发行-》原生APP-云打包 说明: 1. 打包安卓,只选择安卓打包项&…

【Redis】—— Redis的RDB持久化机制

💧 【 R e d i s 】—— R e d i s 的 R D B 持久化机制 \color{#FF1493}{【Redis】 —— Redis的RDB持久化机制} 【Redis】——Redis的RDB持久化机制💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞…

Jupyter notebook添加与删除kernel

目录 1 添加虚拟环境的kernel 2 删除jupyter notebook已有的kernal 3 切换内核与查看当前内核 4 添加C语言的kernel 5 添加python2的kernel 6 添加java语言的kernel 6.1 sudo apt install default-jre 6.2 下载并安装 ijava 6.3 sudo apt install openjdk-11…

RabbitMQ ---- Hello World

RabbitMQ ---- Hello World 1. 依赖2. 消息生产者3. 信息消费者 本节使用 Java 编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者。 1. 依赖 <!--指定 jdk 编译版本--><build><plugins><plugin><groupId>org.apache.maven.plu…

前端开发中的微服务架构设计

前端服务化和小程序容器技术为前端应用带来了更好的组织结构、可维护性和可扩展性。这些技术的应用将促进前端开发的创新和发展&#xff0c;使团队能够更好地应对复杂的前端需求和业务挑战。通过将前端视为一个服务化的架构&#xff0c;我们能够构建出更强大、可靠且可持续的前…

独立看门狗 IWDG

独立看门狗介绍 Q&#xff1a;什么是看门狗&#xff1f; A&#xff1a;可以理解为对于一只修勾的定时投喂&#xff0c;如果不给它吃东西就会狂叫&#xff0c;因此可以通过观察修勾的状态来判断喂它的人有没有正常工作。 在由单片机构成的微型计算机系统中&#xff0c;由于单…

Pixi + Tone 实现简单midi音频可视化

依赖库 Pixi.js 是一个前端图形渲染库&#xff0c;使用精灵技术绘制高性能的图形。Tone.js是一个前端音频框架&#xff0c;对web audio api进行了封装&#xff0c;可以快速创建音频样本、音频效果、进行音频分析和音频播放。tonejs/midi是tonejs的一个插件&#xff0c;可以讲m…

解决小程序 scroll-view 里面的image有间距、小程序里面的图片之间有空隙的问题。

1&#xff09;小程序 image跟view标签上下会有间隙&#xff0c;解决方法如下&#xff1a; 在image那里设置vertical-align:top/bottom/text-top/text-bottom 原因&#xff1a;图片文字等inline元素默许是跟父级元素的baseline对齐&#xff0c;而baseline又和父级底边有必定间距…

http1.0、http1.1 http 2.0

HTTP/1.0是无状态、无连接的应用层协议。 无连接 无连接&#xff1a;每次请求都要建立连接&#xff0c;需要使用 keep-alive 参数建立长连接、HTTP1.1默认长连接keep-alive   无法复用连接&#xff0c;每次发送请求都要进行TCP连接&#xff0c;TCP的连接释放都比较费事&…

【测试开发】测试用例的设计方法

目录 一. 测试用例的基本要素 二. 测试用例的设计方法 1. 测试用例设计的万能公式 水杯测试用例 2. 基于需求的设计方法 邮箱注册测试用例 3. 等价类方法 有效等价类和无效等价类 等价类思想设计测试用例步骤 4. 边界值方法 边界值思想设计测试用例步骤 5. 判定表方法…