学习vscode插件开发,学会package.json和extension.ts文件后,就可以轻松的进行VSCode插件开发啦!
{
// 插件的名字,必须全部小写且不能有空格
"name": "cat-extension",
// 用于显示在应用市场的名称,支持中文
"displayName": "cat_extension",
// 对于插件的描述
"description": "cat extension",
// 版本号
"version": "0.0.1",
// 表示插件最低支持的vscode版本
"engines": {
"vscode": "^1.68.0"
},
// 插件应用市场分类
"categories": [
"Other"
],
// 插件的图标
"icon":"",
// 扩展的激活事件的数组,就是这个插件可以被哪些事件激活
"activationEvents": [
"onCommand:cat-extension.helloWorld"
],
// 插件的主入口
"main": "./dist/extension.js",
// 插件的配置项
"contributes": {
"commands": [{
"command": "cat-extension.helloWorld",
"title": "Hello World"
}]
},
"scripts": {
"vscode:prepublish": "npm run package",
"compile": "webpack",
"watch": "webpack --watch",
"package": "webpack --mode production --devtool hidden-source-map",
"compile-tests": "tsc -p . --outDir out",
"watch-tests": "tsc -p . -w --outDir out",
"pretest": "npm run compile-tests && npm run compile && npm run lint",
"lint": "eslint src --ext ts",
"test": "node ./out/test/runTest.js"
},
// 开发依赖
"devDependencies": {
"@types/vscode": "^1.68.0",
"@types/glob": "^7.2.0",
"@types/mocha": "^9.1.1",
"@types/node": "16.x",
"@typescript-eslint/eslint-plugin": "^5.27.0",
"@typescript-eslint/parser": "^5.27.0",
"eslint": "^8.16.0",
"glob": "^8.0.3",
"mocha": "^10.0.0",
"typescript": "^4.7.2",
"ts-loader": "^9.3.0",
"webpack": "^5.72.1",
"webpack-cli": "^4.9.2",
"@vscode/test-electron": "^2.1.3"
}
}
插件的激活事件数组,在什么情况下插件会被激活,当激活事件发生时,插件将被激活。
每当打开解析为特定语言的文件时,就会触发激活事件
"activationEvents": [
// 可以声明多种语言
"onLanguage:javascript",
"onLanguage:json",
"onLanguage:python",
],
每次调用命令时,就会触发激活事件
"activationEvents": [
"onCommand:test-extension.helloWorld"
],
还需要在contributes进行配置
"contributes": {
"commands": [{
// 与激活事件中onCommand指令相对应
"command": "test-extension.helloWorld",
//激活插件的命令
"title": "Hello World"
}]
},
在启动调试会话之前,会触发激活事件
"activationEvents": [
"onDebug"
]
每当打开文件夹并且该文件夹包含至少一个与glob模式匹配的文件时,会激活事件
"activationEvents": [
"workspaceContains:**/.editorconfig"
]
以协议(scheme)打开文件或文件夹时触发激活事件。通常是file-协议,也可以用自定义的文件供应器函数替换掉,比如ftp、ssh。
"activationEvents": [
"onFileSystem:sftp"
]
只要在VSCode侧边栏中展开指定ID的视图时,就会触发激活事件
"activationEvents": [
"onView:nodeDependencies"
]
只要打开该插件的系统范围URI,就会触发激活事件。这个URI协议需要带上vscode或者vscode-insiders协议。
"activationEvents": [
"onUri"
]
vscode需要恢复匹配到viewType的webview视图时触发
"activationEvents": [
"onWebviewPanel:catCoding"
]
当VSCode启动时,插件就会被激活
"activationEvents": [
"*"
]
暴露给用户的配置,用户可以从”用户设置“和”工作区设置“中修改暴露的选项。
可以通过vscode.workspace.getConfiguration(“title”)来读取配置
"contributes": {
"configuration": {
"type": "object",
"title": "TypeScript configuration",
"properties": {
"typescript.useCodeSnippetsOnMethodSuggest": {
"type": "boolean",
"default": false,
"description": "Complete functions with their parameter signature."
},
"typescript.tsdk": {
"type": ["string", "null"],
"default": null,
"description": "Specifies the folder path containing the tsserver and lib*.d.ts files to use."
}
}
}
}
为特定的语言配置编译器的默认值,修改这个配置会覆盖编译器已经为语言提供的默认配置
"contributes": {
"configurationDefaults": {
// 修改markdown语言的默认配置
"[markdown]": {
"editor.wordWrap": "on",
"editor.quickSuggestions": false
}
}
}
设置命令标题和命令体,然后这个命令会显示在命令面板中。
category可以设置前缀,在命令面板中会以分类显示
"contributes": {
"commands": [{
"command": "extension.sayHello",
"title": "Hello World",// 在命令面板中显示的命令
"category": "Hello"
}]
}
1、为编译器或者文件管理器设置命令的菜单项,即当点击菜单项时会触发命令。
2、至少包含两个属性:
3、group:定义了菜单的分组,navigation值不同于普通的group值。
4、可以配置菜单项的地方有:
5、示例:当打开文件为markdown类型时,在编译器标题栏添加菜单项。
"contributes": {
"commands": [{
"command": "extensionts.helloWorld",
"title": "Hello World"
}],
"menus": {
// 在哪里添加菜单项
"editor/title": [{
// 何时触发
"when":"resourceLangId == markdown",
// 要触发的命令
"command": "extensiondemo.helloWorld",
// 分组
"group": "navigation"
}]
}
}
菜单项可以通过组来分类,具体的分类不再阐述。
设置快捷键
"contributes": {
"keybindings": [{
// 要执行的命令
"command": "extension.sayHello",
// 在Windows和Linux下
"key": "ctrl+f1",
// 在mac下
"mac": "cmd+f1",
"when": "editorTextFocus"
}]
}
配置一门语言,引入一门新的语言或者加强VS Code已有的语言支持。
...
"contributes": {
"languages": [{
"id": "python",
"extensions": [ ".py" ],
// 包含这门语言的可读性
"aliases": [ "Python", "py" ],
"filenames": [ ... ],
"firstLine": "^#!/.*\\bpython[0-9.-]*\\b",
// 语言配置文件的路径
"configuration": "./language-configuration.json"
}]
}
配置VS Code的调试器
"contributes": {
"debuggers": [{
// 用于加载配置的调试器唯一标识
"type": "node",
// 会在UI中显示的调试器名称
"label": "Node Debug",
// 调试适配的路径
"program": "./out/node/nodeDebug.js",
// 如果调试适配器的路径是不可执行程序,那么就会用到这个运行时
"runtime": "node",
"languages": ["javascript", "typescript", "javascriptreact", "typescriptreact"],
// 调试器的启动配置参数
"configurationAttributes": {
"launch": {
"required": [ "program" ],
"properties": {
"program": {
"type": "string",
"description": "The program to debug."
}
}
}
},
// 列出初始化lanuch.json需要加载的配置
"initialConfigurations": [{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceFolder}/app.js"
}],
// 列出编译器launch.json文件可以提供的加载配置智能提示
"configurationSnippets": [
{
"label": "Node.js: Attach Configuration",
"description": "A new configuration for attaching to a running node program.",
"body": {
"type": "node",
"request": "attach",
"name": "${2:Attach to Port}",
"port": 9229
}
}
],
// 引入替代变量,并绑定到调试器插件实现的命令上
"variables": {
"PickProcess": "extension.node-debug.pickNodeProcess"
}
}]
}
通常调试器插件会有contributes.breakpoints入口,插件可以设置哪些语言可以设置断点
"contributes": {
"breakpoints": [
{
"language": "javascript"
},
{
"language": "javascriptreact"
}
]
}
为一门语言配置TextMate语法,必须提供应用语法的language,Text Mate的scopeName确定了语法和文件路径
"contributes": {
"grammars": [{
"language": "markdown",
"scopeName": "text.html.markdown",
"path": "./syntaxes/markdown.tmLanguage.json",
"embeddedLanguages": {
"meta.embedded.block.frontmatter": "yaml",
...
}
}]
}
为VS Code添加Text Mate主题,必须添加label来指定主题
"contributes": {
"themes": [{
"label": "Monokai",
"uiTheme": "vs-dark",
"path": "./themes/Monokai.tmTheme"
}]
}
为语言添加代码片段,language是语言标识符,path是VSCode代码片段格式的代码片段文件的相对路径
"contributes": {
"snippets": [{
"language": "go",
"path": "./snippets/go.json"
}]
}
view属性为VSCode添加视图
viewsContainers配置自定义视图的视图容器
"contributes": {
"viewsContainers": {
//activitybar:配置活动栏
"activitybar": [
{
"id": "package-explorer",
"title": "Package Explorer",
"icon": "resources/package-explorer.svg"
}
]
},
"views": {
"package-explorer": [
{
"id": "package-dependencies",
"name": "Dependencies"
}
]
}
}
状态栏的编译器装饰器,定义之后可以通过workspace.colorCustomization自定义颜色
"contributes": {
"colors": [{
"id": "superstatus.error",
"description": "Color for error message in the status bar.",
"defaults": {
"dark": "errorForeground",
"light": "errorForeground",
"highContrast": "#010203"
}
}]
}