vscode 自定义编辑器(看完即入门)

前言

最近在研究如何开发自定义编辑器,看了下vscode官方给出的例子,总感觉小猫画板的例子用来入门多少是有点繁琐了。所以,在这里我准备了一个无比简单的my-editor的例子,绝对是有手就会!!!

前置条件

如何创建vscode extension是简单且必要的知识,可以参考官方文档

简单来说就是,

  1. 安装yo generator-code
css 复制代码
npm install --global yo generator-code
  1. 在目标文件里
css 复制代码
yo code

接下来会显示如下的这些信息! 在这里我们选择第一个选项,并简单的给extension命名就行。我的例子里就叫my-editor,随后一路回车就可以了

  1. 用vscode打开my-editor文件夹,可以看到里面的结构如下

其中,我们主要关注的就是src文件夹和package.json

  1. 简单的看下此时的效果叭

在src/extension.ts文件里按下F5,然后vscode会编译和运行这个extension,同时会唤起一个新的vscode窗体,ctrl+shift+p,选择hello world命令,就能看到如下图一般的效果

提示:注意看下自己的vscode版本和package.json里面的版本是不是一致,不一致的话就把package.json里面的版本改成你现在用的vscode的版本,要不然会看不到效果。

自定义编辑器

  1. 在package.json中的contributes里加上customEditors
json 复制代码
 "contributes": {
    "commands": [
      {
        "command": "my-editor.helloWorld",
        "title": "Hello World"
      }
    ],
    "customEditors": [
      {
        "viewType": "demo.my",
        "displayName": "custom editor demo",
        "selector": [
          {
            "filenamePattern": "*.my"
          }
        ]
      }
    ]
  },
  1. 在src文件夹里新建webview文件夹,并在里新建myEditor.ts
ts 复制代码
import * as vscode from 'vscode';


export class MyEditorProvider implements vscode.CustomTextEditorProvider {

	public static register(context: vscode.ExtensionContext): vscode.Disposable {
		const provider = new MyEditorProvider(context);
		const providerRegistration = vscode.window.registerCustomEditorProvider(MyEditorProvider.viewType, provider);
		return providerRegistration;
	}

	private static readonly viewType = 'demo.my';
	constructor(
		private readonly context: vscode.ExtensionContext
	) { }

	public async resolveCustomTextEditor(
		document: vscode.TextDocument,
		webviewPanel: vscode.WebviewPanel,
		_token: vscode.CancellationToken
	): Promise<void> {
		// Setup initial content for the webview
		webviewPanel.webview.options = {
			enableScripts: true,
		};
		webviewPanel.webview.html = this.getHtmlForWebview(webviewPanel.webview);

		function updateWebview() {
			webviewPanel.webview.postMessage({
				type: 'update',
				text: document.getText(),
			});
		}

		const changeDocumentSubscription = vscode.workspace.onDidChangeTextDocument(e => {
			if (e.document.uri.toString() === document.uri.toString()) {
				updateWebview();
			}
		});

		// Make sure we get rid of the listener when our editor is closed.
		webviewPanel.onDidDispose(() => {
			changeDocumentSubscription.dispose();
		});

		// Receive message from the webview.
		
		updateWebview();
	}

	/**
	 * Get the static html used for the editor webviews.
	 */
	private getHtmlForWebview(webview: vscode.Webview): string {
		
		return /* html */`
		<html lang="en">
		<head>
    		<meta charset="UTF-8">
    		<meta name="viewport" content="width=device-width, initial-scale=1.0">
    		<title>my editor demo</title>
		</head>
		<body>
		<h1>Hi!my custom editor!</h1>
		</html>
			`;
	}
}
  1. 在extension.ts里面引用
ts 复制代码
import { MyEditorProvider } from './webview/myEditor'
...
...
context.subscriptions.push(MyEditorProvider.register(context));
  1. 现在,我们可以执行npm run complie命令编译我们的代码,编译完成后在任意的*.ts文件里按下F5唤起调试的extension,最后新建demo.my就能看到如下的效果
  1. 打包

直接在terminal中输入vsce package(要把README.md里的内容全部删除,然后随便写点什么,要不然不能打包)

最后

这个示例很简单,看完就能入门了。接下来要如何定义自己的editor长什么样,那就是html+css+js的活了,各位自己加油。附上微软官方的教程以及代码

相关推荐
前端_yu小白3 分钟前
leaflet实现点位聚合
前端·javascript
懒羊羊我小弟3 分钟前
Webpack 基础入门
前端·webpack·rust·node.js·es6
Smile_Gently2 小时前
前端:最简单封装nmp插件(组件)过程。
前端·javascript·vue.js·elementui·vue
luckycoke9 小时前
小程序立体轮播
前端·css·小程序
一 乐9 小时前
高校体育场管理系统系统|体育场管理系统小程序设计与实现(源码+数据库+文档)
前端·javascript·数据库·spring boot·高校体育馆系统
懒羊羊我小弟9 小时前
常用Webpack Loader汇总介绍
前端·webpack·node.js
祈澈菇凉9 小时前
ES6模块的异步加载是如何实现的?
前端·javascript·es6
我爱学习_zwj9 小时前
4.从零开始学会Vue--{{组件通信}}
前端·javascript·vue.js·笔记·前端框架
顾比魁9 小时前
XSS盲打:当攻击者“盲狙”管理员
前端·网络安全·xss
黑客老李9 小时前
新手小白如何挖掘cnvd通用漏洞之存储xss漏洞(利用xss钓鱼)
java·运维·服务器·前端·xss