- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
|
{
"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文件内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
<!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的源码解析及其插件开发相关的详细说明,由于目前掌握的比较分散不够系统,暂时延后讲解.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://www.cnblogs.com/youcong/p/10294758.html 。
最后此篇关于VsCode插件开发之插件初步通信的方法步骤的文章就讲到这里了,如果你想了解更多关于VsCode插件开发之插件初步通信的方法步骤的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是在项目中使用 keras 的新手。我一直在我的模型中使用generator。 我真的很困惑我应该输入什么值 1) In fit_generator : steps_per_epoch & vali
假设我们有如下情况: A has to give $10 to B. B has to give $20 to C. C has to give $10 to D. 现在这种情况可以简化为: A lo
我正在尝试对特定列(在工作表“OA”中)进行相对引用,我需要在 110 的步骤中检索新工作表中的单元格内容 例如, =OA!$AB217 =OA!$AB327 =OA!$AB437 与其在每个单元格中
我的 PowerShell 控制台启动时间很慢(总是等待超过 5 秒),并且希望获得有关故障排除步骤的建议,以找出瓶颈可能在哪里? 我已经阅读了关于运行脚本的内容,-NoProfile防止模块等加载很
我在 NativeScript 应用程序中使用 slider 小部件,我想知道是否有步骤属性。在我的例子中,小部件代表金钱,我希望以 5 美元的增量滑动。 我查看了文档,但找不到任何对这种情况有帮助的
我在 NativeScript 应用程序中使用 slider 小部件,我想知道是否有步骤属性。在我的例子中,小部件代表金钱,我希望以 5 美元的增量滑动。 我查看了文档,但找不到任何对这种情况有帮助的
这是我的code : &n
为什么 (2) c.ERR(模棱两可)?第一个方法参数 - char ('a') 被扩展为 float => 匹配。 如果找到匹配项,是否无需继续执行第 2 步(装箱/拆箱)或第 3 步(尝试可变参数
我有一个函数,它处理一个包含 6100 个列表项的列表。当列表只有 300 个项目时,该代码可以正常工作。但是立即与 6100 崩溃。有没有一种方法可以遍历这 6100 个项目,一次说 30 个,然后
1.制作PHP安装程序的原理 其实PHP程序的安装原理无非就是将数据库结构和内容导入到相应的数据库中,从这个过程中重新配置连接数据库的参数和文件,为了保证不被别人恶意使用安装文件,当安装
我创建了一个类似于 primeNG page 的步骤组件我想把他放在一个 dynamic dialog 里面但在应用它之后,“第 1 步”和“第 2 步”不会呈现。 查看代码,我发现关键部分是我们打开
我在理解描述的 MixColumns 步骤时遇到问题 here . 我知道扩散,这一切都是有道理的,因为它指出每列都被视为多项式并乘以 GF(2^8) 的模。 但是..乘以GF(2 ^ 8)。尽管域仍
根据我对 TeamCity 工作原理的观察,我注意到在所有步骤执行完毕后评估构建失败条件。这很烦人,因为如果满足任何构建失败条件,我不能有一个不会执行的步骤。 我不是指常见的构建失败条件,例如“至少一
基于这篇试图在我的环境中测试管道代码的帖子。但它给出了以下错误消息。如何修复他的管道代码? ERROR: Unable to find project for artifact copy: test
我参与了一个项目,需要向我的一位同事提供生产数据的子集(日期范围),以进行故障排除。我想将经过清理的生产数据子集插入新的数据库表中我的同事可以访问。请提出实现此目标的最佳方法。 最佳答案 最简单的方法
我有这样的场景: 鉴于我去这个页面 当我输入 cucumber 时 然后我点击 然后我应该看到文字 我不应该看到这条线 如果我运行这个场景,它将执行所有 5 个步骤。但是我想跳过第4步(然后我应该看到
是否有任何功能可以避免 m 文件的绘图输出? 我的意思是我在文件的开头放置了一个函数(如 clc),然后所有绘图函数都被阻止。 最佳答案 您可以使用自己的(嵌套在您的函数内或同一目录中)重载内置绘图函
我是小 cucumber 语言的新手,这在我看来是非常基本的问题,但我找不到答案。 我知道可以在 Gherking 中编写多行步骤参数,如下所示: Given a blog post named "R
即使其中一个步骤失败,有没有办法继续执行 Cucumber Steps。在我当前的设置中,当一个步骤失败时, cucumber 会跳过剩余的步骤......我想知道是否有某种方法可以设置 cucumb
start-step-stop 码是一种数据压缩技术,用于压缩相对较小的数字。 该代码的工作原理如下:它具有三个参数,start、step 和 stop。 Start 确定用于计算前几个数字的位数。
我是一名优秀的程序员,十分优秀!