VSCode插件开发笔记 3

前言

笔者正在学习开发一款VSCode插件,文章为学习所做的笔记,供学习使用。

1. 命令的写法

  • extension.js中可以定义想要执行的命令。
    以下为直观阅读,将代码合成了一句展示。
function activate(context) {
  context.subscriptions.push(vscode.commands.registerCommand('extension.sayHello', () => {
    vscode.window.showInformationMessage('您执行了extension.sayHello命令!');
  }));
}

注册命令的API:vscode.commands.registerCommand
执行后返回一个 Disposable 对象。
所有注册类的 API 执行后都需要将返回结果放到 context.subscriptions中。

  • 在清单文件声明注册的命令
"commands": [
    {
        "command": "extension.sayHello",
        "title": "Hello World"
    },
]

1.1 回调函数的可选参数

回调函数接收一个可选参数 uri

  • 当从资源管理器中右键执行命令时会把当前选中资源路径 uri 作为参数传过;
  • 当从编辑器中右键菜单执行时则会将当前打开文件路径 URI 传过去;
  • 当直接按 Ctrl+Shift+P 执行命令时,这个参数为空;

示例:

context.subscriptions.push(vscode.commands.registerCommand('extension.demo.getCurrentFilePath', (uri) => {
    vscode.window.showInformationMessage(`当前文件(夹)路径是:${uri ? uri.path : '空'}`);
}));

package.json 如下:

    "menus": {
            "editor/context": [
                {
                    "when": "editorFocus",
                    "command": "extension.demo.getCurrentFilePath",
                    "group": "navigation"
                }
            ],
            "explorer/context": [
                {
                    "command": "extension.demo.getCurrentFilePath",
                    "group": "navigation"
                }
            ]
        }
    }

1.2 编辑器命令

注册普通命令的API:vscode.commands.registerCommand
注册文本编辑器命令:vscode.commands.registerTextEditorCommand,仅在编辑器被激活时调用才生效,此外,这个命令可以访问到当前活动编辑器 textEditor

// 编辑器命令
context.subscriptions.push(vscode.commands.registerTextEditorCommand('extension.testEditorCommand', (textEditor, edit) => {
    console.log('您正在执行编辑器命令!');
    console.log(textEditor, edit);
}));

1.3 获取所有的命令

// 获取所有命令
vscode.commands.getCommands().then(allCommands => {
    console.log('所有命令:', allCommands);
});

getCommands 接收一个参数表示是否过滤内部命令,默认否。
另外一种方法是直接打开快捷键设置,就能看到所有命令列表。

1.4 执行命令和复杂的命令

VSCode api的一个习惯设计:很多命令都是返回一个类似于 PromiseThenable 对象。

使用代码执行某个命令:

vscode.commands.executeCommand('命令', 'params1', 'params2', ...).then(result => {
    console.log('命令结果', result);
});

复杂命令,就是指一些需要特殊参数并且通常有返回值、执行一些诸如跳转到定义、执行代码高亮等特殊操作、这类命令有几十个。复杂命令列表参阅

示例:在VS代码中打开新文件夹

let uri = Uri.file('/some/path/to/folder');
commands.executeCommand('vscode.openFolder', uri).then(sucess => {
    console.log(success);
});

2. 菜单

一个菜单项的完整配置如下:

"contributes": {
    "menus": {
        "editor/title": [{
            "when": "resourceLangId == markdown",
            "command": "markdown.showPreview",
            "alt": "markdown.showPreviewToSide",
            "group": "navigation"
        }]
    }
}
  • editor/titlekey 值,定义这个菜单出现在哪里;
  • when 控制菜单什么时候出现;
  • command 定义菜单被点击后要执行什么操作;
  • alt 定义备用命令,按住alt键打开菜单时将执行对应命令;
  • group定义菜单分组;

图标在 commands 里面配置,lightdark 分别对应浅色和深色主题,如果不配置图标则直接显示文字:

"commands": [
    {
        "command": "extension.demo.testMenuShow",
        "title": "这个菜单仅在JS文件中出现",
        "icon": {
            "light": "./images/tool-light.svg",
            "dark": "./images/tool-light.svg"
        }
    }
]

2.1 关于when

通过可选的when语句,VS Code可以很好地控制什么时候显示菜单项。

  • resourceLangId == javascript:当编辑的文件是js文件时;
  • resourceFilename == test.js:当当前打开文件名是test.js时;
  • isLinuxisMacisWindows:判断当前操作系统;
  • editorFocus:编辑器具有焦点时;
  • editorHasSelection:编辑器中有文本被选中时;
  • view == someViewId:当当前视图ID等于 someViewId 时;
    等等等
    多个条件可以通过与或非进行组合。有关when语句的更多完整语法请参考官方文档

2.2 关于alt

没有按下 alt 键时,点击右键菜单执行的是 command 对应的命令,而按下了 alt 键后执行的是 alt 对应的命令。

2.3 关于group

组间排序

控制菜单的分组和排序。不同的菜单拥有不同的默认分组。

  1. editor/context 的默认组:
  • navigation 放在这个组的永远排在最前面;
  • 1_modification 更改组;
  • 9_cutcopypaste 编辑组
  • z_commands 最后一个默认组,其中包含用于打开命令选项板的条目。
    navigation是强制放在最前面,其它分组都是按照0-9、a-z的顺序排列的。
  1. explorer/context 的默认组:
  • navigation- 放在这个组的永远排在最前面;
  • 2_workspace- 与工作空间操作相关的命令。
  • 3_compare- 与差异编辑器中的文件比较相关的命令。
  • 4_search- 与在搜索视图中搜索相关的命令。
  • 5_cutcopypaste- 与剪切,复制和粘贴文件相关的命令。
  • 7_modification- 与修改文件相关的命令。
  1. 编辑器选项卡上下文菜单的默认组:
  • 1_close- 与关闭编辑器相关的命令。
  • 3_preview- 与固定编辑器相关的命令。
  1. 在editor/title有这些默认组:
  • 1_diff- 与使用差异编辑器相关的命令。
  • 3_open - 与打开编辑器相关的命令。
  • 5_close- 与关闭编辑器相关的命令。
组内排序

默认同一个组的顺序取决于菜单名称,如想自定义排序,可以在组后面通过 @<number> 的方式来自定义顺序。

"editor/context": [
    {
        "when": "editorFocus",
        "command": "extension.sayHello",
        // 强制放在navigation组的第2个
        "group": "navigation@2"
    },
    {
        "when": "editorFocus",
        "command": "extension.demo.getCurrentFilePath",
        // 强制放在navigation组的第1个
        "group": "navigation@1"
    }
]

3. 快捷键

设置快捷键:

"contributes": {
    "keybindings": [{
        // 指定快捷键执行的操作
        "command": "extension.sayHello",
        // windows下快捷键
        "key": "ctrl+f10",
        // mac下快捷键
        "mac": "cmd+f10",
        // 快捷键何时生效
        "when": "editorTextFocus"
    }]
}

参考

  1. VSCode插件开发全攻略(四)命令、菜单、快捷键
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 之前一直觉得插件开发很难,迟迟不敢接触,但每次看到或者用别人开发的插件时,又非常羡慕,这次刚好有个项目开需要开发 ...
    vermouth_Fee阅读 617评论 0 0
  • 初次尝试了一下vscode插件开发,写了一个前端工具箱作为日常方便使用,记录一下 在vscode插件里面搜索:前端...
    程序员poetry阅读 4,522评论 2 1
  • 1.概览 1.1 vscode插件可以做什么 vscode编辑器是可高度自定义的,我们使用vscode插件几乎可以...
    雪山飞狐_91ae阅读 51,930评论 4 40
  • 最近打算给xmake写一些IDE和编辑器的集成插件,发现vscode的编辑器插件比较容易上手的,就先研究了下vsc...
    waruqi阅读 1,732评论 0 49
  • 前言 在我们使用vscode开发中,经常使用很多好用的vscode插件,那你有没有试着自己实现一个自己的vscod...
    两行代码三个Bug阅读 2,479评论 0 1