VsCode插件开发之插件初步通信的方法步骤

参考了Egret Wing,想像Egret Wing那样在上方titlebar最右边上面增加一个menu(这个menu相对于一个按钮,当点击这个按钮时会出现一个window弹框,这个window弹框里就包含相关的表单信息以供登录或者注册使用。我是以这个作为参考模板的。但是目前进展并不是很顺。于是我通过插件的方式暂时性解决了这个问题。但是觉得还不是想要的那样。

Egret Wing是这样的,如图所示:

不得不承认一点Egret Wing改造的挺不错的,不愧是对VsCode进行魔改。

今天先说一下通过插件通信。

我主要参考的是一个叫小茗同学的插件开发,并改造其插件来达到我的目的。

这个小茗同学我觉得他写的插件开发,我觉得不是特别详细全面,当然,参考意义还是有的。

他的插件开发目录如下:

他的插件github地址为:https://github.com/sxei/vscode-plugin-demo.git

他的插件可以在VsCode插件扩展中搜到(搜到后安装,然后直接在下载成功的插件的基础上改造),例如:

那么说说我是如何改造它的呢?

我主要改造它这么几个地方?

一个是图标,另外一个修改它的html界面(主要是修改custom-welcome.html),同时我要和还改了package.json文件。

插件开发可以用TypeScript,也可以用JavaScript。

如果是用TypeScript的话,通常扩展脚本文件是extension.ts形式存在,如果是JavaScript,则是以extension.js的形式存在。

在此我想强调的是改他人插件或者自己编写插件,以ts为例,主要把握也就两个文件,一个是extension.ts,另一个就是package.json。

如何从0开发以插件的相关视频,感兴趣的可以看看,感觉还是有一定的启发的:https://v.qq.com/x/page/k08220bdz3s.htmlb

我改造后的插件代码,放在我的个人github上,大家可以将其下载下来放入,如下两个文件中(任意一个都行):

注意:

.vscode文件夹:官方插件下载好默认放入的目录。

.vscode-oss-dev:下载源码,自己编译,下载插件放置的目录。

自己编译的不知道由于什么原因不能直接联网通信搜索一些应用市场下载的插件。

通常情况下(以.vscode-oss-dev为例),git clone下来我的插件地址,然后将其移植到这个目录就能看到对应的效果,效果图如下:

我的VsCode插件地址为:https://github.com/youcong1996/study_simple_demo/tree/vscode-plugin-communication

将其克隆下来放入.vscode或者.vscode-oss-dev中的extensions目录下即可起作用。

另外有一点要强调的是,如果是vscode非自己编译的,需要重启一下vscode,如果是自己编译的话,监听需要暂时中断重新输入(yarn watch)。

接下来说说我修改的三个地方。

1.修改package.json(包含图标一起说了及其点击登录的同时展示对应的左侧栏sidebar)

{
  "name": "vscode-plugin-demo",
  "displayName": "vscode-plugin-demo",
  "description": "VSCode插件demo",
  "keywords": [
    "vscode",
    "plugin",
    "demo"
  ],
  "version": "1.0.3",
  "publisher": "sxei",
  "engines": {
    "vscode": "^1.27.0"
  },
  "categories": [
    "Other"
  ],
  "icon": "images/icon.png",
  "activationEvents": [
    "*"
  ],
  "main": "./src/extension",
  "contributes": {
    "configuration": {
      "type": "object",
      "title": "Code插件demo",
      "properties": {
        "vscodePluginDemo.yourName": {
          "type": "string",
          "default": "guest",
          "description": "你的名字"
        },
        "vscodePluginDemo.showTip": {
          "type": "boolean",
          "default": true,
          "description": "启动时显示自定义欢迎页"
        }
      }
    },
    "commands": [
      {
        "command": "extension.sayHello",
        "title": "Hello,小茗同学"
      },
      {
        "command": "extension.demo.getCurrentFilePath",
        "title": "获取当前文件(夹)路径"
      },
      {
        "command": "extension.demo.testMenuShow",
        "title": "这个菜单仅在JS文件中出现",
        "icon": {
          "light": "./images/tool-light.svg",
          "dark": "./images/tool-light.svg"
        }
      },
      {
        "command": "extension.demo.openWebview",
        "title": "打开WebView"
      },
      {
        "command": "extension.demo.showWelcome",
        "title": "显示自定义欢迎页"
      }
    ],
    "keybindings": [
      {
        "command": "extension.sayHello",
        "key": "ctrl+f10",
        "mac": "cmd+f10",
        "when": "editorTextFocus"
      },
      {
        "command": "extension.demo.openWebview",
        "key": "ctrl+f9",
        "mac": "cmd+f9",
        "when": "editorTextFocus"
      }
    ],
    "menus": {
      "editor/context": [
        {
          "when": "editorFocus",
          "command": "extension.sayHello",
          "group": "navigation@6"
        },
        {
          "when": "editorFocus",
          "command": "extension.demo.getCurrentFilePath",
          "group": "navigation@5"
        },
        {
          "when": "editorFocus && resourceLangId == javascript",
          "command": "extension.demo.testMenuShow",
          "group": "z_commands"
        },
        {
          "command": "extension.demo.openWebview",
          "group": "navigation"
        }
      ],
      "editor/title": [
        {
          "when": "editorFocus && resourceLangId == javascript",
          "command": "extension.demo.testMenuShow",
          "group": "navigation"
        }
      ],
      "editor/title/context": [
        {
          "when": "resourceLangId == javascript",
          "command": "extension.demo.testMenuShow",
          "group": "navigation"
        }
      ],
      "explorer/context": [
        {
          "command": "extension.demo.getCurrentFilePath",
          "group": "navigation"
        },
        {
          "command": "extension.demo.openWebview",
          "group": "navigation"
        }
      ]
    },
    "snippets": [
      {
        "language": "javascript",
        "path": "./snippets/javascript.json"
      },
      {
        "language": "html",
        "path": "./snippets/html.json"
      }
    ],
    "viewsContainers": {
      "activitybar": [
        {
          "id": "beautifulGirl",
          "title": "测试",
          "icon": "images/beautifulGirl.svg"
        }
      ]
    },
    "views": {
      "beautifulGirl": [
        {
          "id": "测试001",
          "name": "test"
        },
        {
          "id": "测试002",
          "name": "test"
        },
        {
          "id": "测试003",
          "name": "test"
        }
      ]
    },
    "iconThemes": [
      {
        "id": "testIconTheme",
        "label": "测试图标主题",
        "path": "./theme/icon-theme.json"
      }
    ]
  },
  "scripts": {
    "postinstall": "node ./node_modules/vscode/bin/install",
    "test": "node ./node_modules/vscode/bin/test"
  },
  "devDependencies": {
    "typescript": "^2.6.1",
    "vscode": "^1.1.6",
    "eslint": "^4.11.0",
    "@types/node": "^7.0.43",
    "@types/mocha": "^2.2.42"
  },
  "license": "SEE LICENSE IN LICENSE.txt",
  "bugs": {
    "url": "https://github.com/sxei/vscode-plugin-demo/issues"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/sxei/vscode-plugin-demo"
  },
  "homepage": "https://github.com/sxei/vscode-plugin-demo/blob/master/README.md",
  "__metadata": {
    "id": "ac2b7b16-d87f-4e51-87a8-37011e8aa713",
    "publisherId": "cdd0fc1d-3acf-4250-a09b-95545e29bdbc",
    "publisherDisplayName": "小茗同学"
  }
}

在package.json我也就修改了这么几个地方,一个是views(这个view通常主要用于展示左侧的sidebar视图),一个是viewsContainers(我主要修改beautifulGirl.svg)。

修改后的效果分别如下所示:

2.通信(修改custom-welcome.html)

通信我目前采用最原始的javascript的ajax请求,其实jQuery及其vue.js的异步通信也是可以的。

这个custom-welcome.html你可以理解成它就是一个webview。

custom-welcome.html文件内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>自定义欢迎页</title>
  <link rel="stylesheet" href="../../lib/bootstrap-3.3.1/css/bootstrap.min.css" rel="external nofollow" >
  <link rel="stylesheet" href="../../lib/layui/css/layui.css" rel="external nofollow" >
  <style>
    html, body, #app {
      height: 100%;
    }
    ::-webkit-scrollbar {
      width: 10px;
      height: 10px
    }

    ::-webkit-scrollbar-track {
      border-radius: 10px;
      background-color: #d8dce5
    }

    ::-webkit-scrollbar-thumb {
      border-radius: 5px;
      background-color: #adadad
    }

    ::-webkit-scrollbar-thumb:hover {
      background-color: #929292
    }

    ::-webkit-scrollbar-thumb:active {
      background-color: #666363
    }

    ::-webkit-scrollbar-corner {
      background-color: #535353
    }

    ::-webkit-scrollbar-resizer {
      background-color: #ff6e00
    }
    .page-title {
      margin-bottom: 20px;
    }

    .control-label {
      font-weight: normal;
    }

    .btn-primary {
      background-color: #1890ff;
      border-color: #1890ff;
      outline: none;
    }

    .btn-primary:focus,
    .btn-primary:hover {
      background-color: #40a9ff;
      border-color: #40a9ff;
      outline: none;
    }

    .btn-primary.active,
    .btn-primary:active {
      background-color: #096dd9;
      border-color: #096dd9;
      color: #fff;
      outline: none;
    }
  </style>
</head>

<body>
  <div id="app" class="container-fluid">
    <h3 class="page-title">自定义欢迎页</h3>
    <p class="alert alert-success" style="width: 300px;">{{userName}},{{time}}好!
    <span id="info"></span>
    </p>
    <form class="form-horizontal">
      <div class="form-group">
        <div class="col-sm-6">
          <div id="form">
            <form>
              <p>用户名:<input type="text" id="userName" style="color:black;"/></p>
              <p>密  码  :<input type="password" id="password" style="color:black;"/></p>
              <p>            <input type="button" style="color:black;" value="提交" onclick="test()"/>
            <input type="button" value="打开" onclick="openLogin()"/>
             </form>
          </div>
          <div class="checkbox">
            <label>
              <input type="checkbox" v-model="show"> 启动时显示自定义欢迎页
                
              <input type="button" onclick="register()" value="退出"/>
            </label>
          </div>
        </div>
      </div>
    </form>

  </div>
  <script src="../../lib/jquery/jquery.min.js"></script>
  <script src="../../lib/bootstrap-3.3.1/js/bootstrap.min.js"></script>
  <script src="../../lib/vue-2.5.17/vue.js"></script>
  <script src="../../src/view/custom-welcome.js"></script>
  <script src="../../lib/layui/layui.js"></script>
  <script src="../../lib/layer/layer-v3.1.1/layer/mobile/layer.js"></script>
  <script>
  function openLogin(){
    layui.use('layer', function(){
     var layer = layui.layer;

     layer.open({
        type: 2,
        title: 'Login',
        fix: false,
        maxmin: true,
        shadeClose: true,
        shade: 0.8,
        area: ['500px', '500px'],
        content: 'login.html',
        end: function () {
          location.reload();
        }
      });
    });
  }

  function test(){
      var userName = document.getElementById("userName").value;

      if(userName != null && userName != undefined){
      var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
        $("#info").html("登录成功");
        $("#form").hide();

        console.log('test:'+xhr.status);
        console.log(xhr.responseText);
        } else {
        console.log("请求成功:" + xhr.status);
        }
        }
        };
        xhr.open("POST", "http://www.test.com/test-web/sysUser/getUserCodeByInfo?userCode=2", true);
        xhr.send(null);

      }else{
        layui.use('layer', function(){

        var layer = layui.layer;

        layer.msg('userName为必填项');
        });
      }

      }
  function register(){
    $("#info").html("");
    $("#form").show();
  }

  </script>
</body>

</html>

这个html在浏览器上看到的效果如下所示:

目前这仅仅是一个很初级的(蹩脚通信),后续我将会继续补充对VsCode的源码解析及其插件开发相关的详细说明,由于目前掌握的比较分散不够系统,暂时延后讲解。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vscode extension插件开发详解

    最近公司要使用vscode作为开发工具,需要对vscode做一些定制功能,比如snippet提示,内容提示,以及其他插件集成等,为此做了一些调查,并做了一定的开发与支持. 官方文档 https://code.visualstudio.com/docs 上面是vscode官方提供的extension开发帮助,按照上面的步骤基本上可以做简单的demo事例 如下主要介绍下自己在开发中做的几个简单功能: 1. Snippet 感觉vscode的snippet功能真的很强大,只要编辑相应的json配置文件

  • VSCode下好用的Python插件及配置

    MS Python插件. 这是微软官方的Python插件,已经自带很多功能.下面是插件功能描述,其中部分内容我做了翻译. a)        Linting (Prospector, Pylint, pycodestyle, Flake8, pylama, pydocstyle, mypy with config files and plugins)静态代码扫描(可以理解为代码语法和格式错误提示,支持多种linter) b)       Intellisense (autocompletion

  • 推荐VSCode 上特别好用的 Vue 插件之vetur

    Vue自从发布以来就一直受到前端开发人员的热爱,而除了一些本身优秀的特征之外,还有就是丰富的插件和工具的支持和更新.虽然现在的编辑器需要安装相应的plugins才能进行Vue组件化开发,但是越来越多优秀的plugins都提供了强大的支持.比如VSCode下面的Vetur就是这样一款必备的Vue开发工具.下面就开始介绍一下它的一些功能吧 Github仓库:Vetur 官方文档:Vetur文档 语法高亮 Vetur支持.vue文件的语法高亮显示,除了支持template模板以外,还支持大多数主流的前

  • vsCode安装使用教程和插件安装方法

    vsCode安装使用教程vsCode是什么vsCode安装vsCode汉化vsCode常用命令说明vsCode左边图标说明vsCode基本使用前端常用插件在vosCode中显示html界面 vsCode是什么 Visual Studio Code (简称 VS Code / VSC) 是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮.智能代码补全.自定义热键.括号匹配.代码片段.代码对比 Diff.GIT 等特性,支持插件扩展,并针对网页开发和云端应用开发做了优化.软

  • VsCode插件整理(小结)

    1.VsCode官方插件地址: https://marketplace.visualstudio.com/vscode http://code.visualstudio.com/docs 官网下载地址:http://code.visualstudio.com/ 2.使用方法,可以在官网中搜索需要的插件或者在VsCode的""扩展""中搜索需要的插件 添加方法使用Ctrl+P, 输入 ext install xxxx ,搜索要安装的插件,点击安装按钮即可 3.常用插件

  • 详解vscode中vue代码颜色插件

    vue提示插件[Vscode] 编者寄语:vscode的确是前端开发中很好的工具,安装颜色插件,从视觉上是美的享受.曾经的我遇到了vscode代码全是灰色,黑色的困惑,后来整理找到方法,整理这篇,以下高亮插件,建议大家都安装了. 在VSCode Marketplace 搜素Vue 出现关于语法高亮的插件有 vue,vue-beautify,vue-color,VueHelper,vertur等等.比较了下载数量可以了解到,vetur 是目前比较好的语法高亮插件,我们来安装一下吧. vscode提

  • VsCode插件开发之插件初步通信的方法步骤

    参考了Egret Wing,想像Egret Wing那样在上方titlebar最右边上面增加一个menu(这个menu相对于一个按钮,当点击这个按钮时会出现一个window弹框,这个window弹框里就包含相关的表单信息以供登录或者注册使用.我是以这个作为参考模板的.但是目前进展并不是很顺.于是我通过插件的方式暂时性解决了这个问题.但是觉得还不是想要的那样. Egret Wing是这样的,如图所示: 不得不承认一点Egret Wing改造的挺不错的,不愧是对VsCode进行魔改. 今天先说一下通

  • vscode调试container中的程序的方法步骤

    在写cmu14-445的project时,我希望在本地vscode编辑代码,然后在docker中编译和测试代码.但是如果测试出了问题,直接在本地调试就变得麻烦了.所以希望利用vscode进行远程调试. 参考官方文档,利用ssh + pipeTransport来完成,下面是我的launch.json和tasks.json最后的样子. { // Use IntelliSense to learn about possible attributes. // Hover to view descript

  • Vue项目vscode 安装eslint插件的方法(代码自动修复)

    ESlint:是用来统一JavaScript代码风格的工具,不包含css.html等. 方法和步骤: 通常情况下vue项目都会添加eslint组件,我们可以查看webpack的配置文件package.json查看,也可以查看工程下是否有.eslintrc.js和.eslintignore查看到eslint是否开启. 当我们编写不符合eslint规范的代码时,启动项目会报错,比如 这个时候可以安装vscode eslint插件,就可以自动检测不符合规范的代码.打开vscode左侧扩展面板,搜索es

  • MacOS中 VSCode 安装 GO 插件失败问题的快速解决方法

    问题重现 Installing golang.org/x/tools/cmd/guru FAILED Installing golang.org/x/tools/cmd/gorename FAILED Installing golang.org/x/lint/golint FAILED Installing github.com/stamblerre/gocode FAILED 4 tools failed to install. VS COde 打开 .go 文件会自动安装插件,但是出现了一些

  • VSCode安装Django插件后实现html语法提示的方法步骤

    目录 1 VSCode中默认html语法提示 2 第一种方法:直接修改“设置”中的相关选项 3 第二种方法:在setting.json文件中配置 总结 1 VSCode中默认html语法提示 VSCode(1.64)默认安装完成后自动添加HTML语法提示,但是在安装Django插件后,Django项目文件中的html文件自动语法提示就变为django-html语法,原先的html语法提示就没有了. 2 第一种方法:直接修改“设置”中的相关选项 Django插件安装后为恢复html原有语法提示并保

  • VSCode插件开发全攻略之命令、菜单、快捷键

    命令 我们在前面HelloWord章节中已经提到了命令写法,这里再重温一下. context.subscriptions.push(vscode.commands.registerCommand('extension.sayHello', () => { vscode.window.showInformationMessage('您执行了extension.sayHello命令!'); })); 然后在清单文件声明: "commands": [ { "command&q

  • VSCode插件开发全攻略之打包、发布、升级的详细教程

    一.发布方式 插件开发完了,如何发布出去分享给他人呢?主要有3种方法: 方法一:直接把文件夹发给别人,让别人找到vscode的插件存放目录并放进去,然后重启vscode,一般不推荐: 方法二:打包成vsix插件,然后发送给别人安装,如果你的插件涉及机密不方便发布到应用市场,可以尝试采用这种方式: 方法三:注册开发者账号,发布到官网应用市场,这个发布和npm一样是不需要审核的. 二.本地打包 无论是本地打包还是发布到应用市场都需要借助vsce这个工具. 安装: npm i vsce -g 打包成v

  • VSCode 配置React Native开发环境的方法

    本文介绍了VSCode 配置React Native开发环境的方法,分享给大家,具体如下: 1.安装VSCode 2.安装插件 按F1 并输入 ext install 并回车, 或者使用 输入react-native安装React Native Tools 假定你已经在设备上安装了react native, 如果没有安装,请使用npm install -g react-native-cli安装 或者按照官方文档操作 新建一个RN工程 并使用VSCode打开 安装完成后 按F1可以看到命令里多了很

  • 用vscode开发vue应用的方法步骤

    现在用VSCode开发Vue.js应用几乎已经是前端的标配了,但很多时候我们看到的代码混乱不堪,作为一个前端工程师,单引号双引号乱用,一段有分号一段没有分号,有的地方有逗号有的地方没有逗号,空格回车都对不齐,还说自己做事认真,这不是开玩笑的事情. 我们今天从头开始,完整地讲述一下一个重度代码洁癖患者该如何用vscode开发vue,以及如何把一个已经可以宣判死刑的全身各种格式错误几万条的项目整容成标准美女. 从安装开始 为了准确起见,我们把vscode里所有插件全部禁用,把用户设置清空,以让它尽可

  • ubunt18.04LTS+vscode+anaconda3下的python+C++调试方法

    1.安装背景 最近想放弃windows编程环境,转到linux.原因就一个字:潮 从格式化所有硬盘,到安装win10/ubuntu18.04双系统,其中的痛苦,我想只有经历过的人才会知道. 在这里,我还是提一些安装双系统的几点建议吧: ① 先装win10,我是使用老毛桃在线安装的专业版 ② 装ubuntu很烦人,本以为通过教程(先下载iso,再制作启动u盘,再修改bios中的u盘优先启动方式)就可以了,最终无果.我只好用实验室同学已经制作好的ubuntu 启动盘进行安装,结果开启出现了gnru,

随机推荐