VS Code 插件開(kāi)發(fā)之從 0 到 1

VS Code 插件能做什么

初始化項(xiàng)目

安裝腳手架录别,生成 VS Code 插件項(xiàng)目

# 安裝
yarn global add yo generator-code

# 生成一個(gè)可以立馬開(kāi)發(fā)的項(xiàng)目
yo code
image

進(jìn)入你生成的項(xiàng)目中,按下 F5酱酬,你會(huì)看到一個(gè)插件發(fā)開(kāi)主機(jī)窗口,其中就運(yùn)行著插件云矫。

在命令面板(Ctrl+Shift+P) 中輸入Hello World命令膳沽,并回車,如果你看到了 Hello World 提示彈

窗让禀,恭喜你挑社,你的第一個(gè)簡(jiǎn)單的插件就創(chuàng)建成功了 !

image

How this work

Hello World插件包含了 3 個(gè)部分:

  • 注冊(cè)onCommand 激活事件: onCommand:extension.helloWorld巡揍,所以用戶可以在輸入Hello World命令后激活插件痛阻。
  • 使用contributes.commands 發(fā)布內(nèi)容配置,綁定一個(gè)命令 ID extension.helloWorld腮敌,然后 Hello World命令就可以在命令面板中使用了阱当。
  • 使用commands.registerCommand VS Code API 將一個(gè)函數(shù)綁定到你注冊(cè)的命令 IDextension.helloWorld上。

打開(kāi) src/extension 文件糜工,我們可以看到處理 hello world 命令的函數(shù)

import * as vscode from "vscode";

// 插件激活
export function activate(context: vscode.ExtensionContext) {
  // 注冊(cè)命令弊添,即在命令面板中顯示的命令
  let disposable = vscode.commands.registerCommand("ext.helloWorld", () => {
    // 顯示 hello world 彈窗
    vscode.window.showInformationMessage("Hello World from ext!");
  });

  // 訂閱
  context.subscriptions.push(disposable);
}

export function deactivate() {}

此外,在 package.json 文件中可以看到命令注冊(cè)相關(guān)的配置

{
  "activationEvents": ["onCommand:ext.helloWorld"],
  "contributes": {
    "commands": [
      {
        "command": "ext.helloWorld",
        "title": "Hello World"
      }
    ]
  }
}

簡(jiǎn)單的 Hello World 插件已經(jīng)蘊(yùn)含了開(kāi)發(fā) VS Code 插件的關(guān)鍵點(diǎn):

  • 激活事件:決定插件激活的時(shí)機(jī)
  • 發(fā)布內(nèi)容配置:注冊(cè)插件的能力捌木,如命令油坝,UI,調(diào)試
  • VS Code API: 使用 VS Code API 實(shí)現(xiàn)插件的能力

大體上钮莲,插件就是通過(guò)組合發(fā)布內(nèi)容配置和 VS Code API 擴(kuò)展 VS Code 的功能免钻。

命令

命令會(huì)觸發(fā) VS Code 中注冊(cè)過(guò)的行為,命令是插件與用戶交互的重要渠道崔拥,VS Code 插件的諸多功能都需要結(jié)合命令實(shí)現(xiàn)邏輯极舔。

新建命令

使用 vscode.commands.registerCommand 創(chuàng)建新的命令,并綁定處理邏輯

import * as vscode from "vscode";

export function activate(context: vscode.ExtensionContext) {
  const command = "myExtension.sayHello";

  const commandHandler = (name?: string = "world") => {
    console.log(`Hello ${name}!!!`);
  };

  const cmd = vscode.commands.registerCommand(command, commandHandler);

  context.subscriptions.push(cmd);
}

執(zhí)行命令

執(zhí)行命令的路徑有多種

  • 使用 vscode.commands.executeCommand('commandId', args)
  • 用戶通過(guò)命令面板執(zhí)行
  • 通過(guò)配置綁定命令觸發(fā)執(zhí)行链瓦,如右鍵菜單綁定命令觸發(fā)執(zhí)行

僅通過(guò) registerCommand 注冊(cè)的命令可以通過(guò)executeCommand 執(zhí)行拆魏,但不會(huì)顯示在命令面板中盯桦,需要在 package.json中配置對(duì)應(yīng)的命令配置項(xiàng)(contribution)

{
  "contributes": {
    "commands": [
      {
        "command": "myExtension.sayHello",
        "title": "Say Hello"
      }
    ]
  }
}

命令激活場(chǎng)景

面向用戶的命令需要配置命令激活的場(chǎng)景,否則無(wú)法被觸發(fā)渤刃。

{
  "activationEvents": ["onCommand:myExtension.sayHello"]
}

讓菜單項(xiàng)只顯示在命令面板中

注冊(cè)的命令默認(rèn)顯示在命令面板中拥峦。要想控制命令的可見(jiàn)性,我們提供了一個(gè)commandPalette菜單配置卖子,在這個(gè)配置中略号,你可以定義一個(gè)when控制是否在命令菜單中顯示。

下面的片段只在編輯器中選中了什么東西的時(shí)候才會(huì)在命令面板中顯示出 "Hello World":

{
  "contributes": {
    "menus": {
      "commandPalette": [
        {
          "command": "myExtension.sayHello",
          "when": "editorLangId == markdown"
        }
      ]
    }
  }
}

內(nèi)置命令

VS Code API 也提供了一些內(nèi)置命令洋闽,我們可以調(diào)用這些命令實(shí)現(xiàn)一些系統(tǒng)級(jí)的能力

  • vscode.openFolder 打開(kāi)文件夾
  • vscode.open 打開(kāi)提供的資源玄柠,如 URL,文件等

Built-in Commands

樹(shù)視圖(Tree View)

樹(shù)視圖是 VS Code 中比較常見(jiàn)的功能诫舅,我們常用的資源管理器就是一種樹(shù)視圖羽利。插件可以使用樹(shù)視圖支持簡(jiǎn)單的 UI 操作。

視圖容器與樹(shù)視圖

視圖容器包含了一列視圖(views)刊懈,這些視圖又包含在內(nèi)置的視圖容器中这弧。

目前只可以配置活動(dòng)欄(activitybar),下面的示例展示了活動(dòng)欄中的云開(kāi)發(fā)視圖容器是如何配置的:

  • 配置視圖容器:在package.json中的contributes.viewsContainers 中配置以下字段
    • id: 新視圖容器的名稱
    • title: 展示給用戶的視圖容器名稱虚汛,它會(huì)顯示在視圖容器上方
    • icon: 在活動(dòng)欄中展示的圖標(biāo)
  • 配置樹(shù)視圖:在 package.json中的 contributes.views 中給視圖配置一個(gè) Id 外加一個(gè)名稱
{
  "contributes": {
    "viewsContainers": {
        "activitybar": [
            {
                "id": "tcb",
                "title": "云開(kāi)發(fā) Toolkit",
                "icon": "assets/logo.svg"
            }
        ]
    },
    "views": {
        "tcb": [
            {
                "id": "tcb.views.function",
                "name": "已部署云函數(shù)"
            },
            {
                "id": "tcb.views.help",
                "name": "幫助"
            }
        ]
    }
}
image

動(dòng)態(tài)創(chuàng)建樹(shù)視圖

某些情況下匾浪,樹(shù)視圖可能需要?jiǎng)討B(tài)展示,則可以使用 createTreeView 創(chuàng)建動(dòng)態(tài)的樹(shù)視圖泽疆。FtpTreeDataProvider 需要實(shí)現(xiàn) vscode.TreeDataProvider 定義的方法户矢,

vscode.window.createTreeView("ftpExplorer", {
  treeDataProvider: new FtpTreeDataProvider(),
});

樹(shù)視圖操作

我們可以配置視圖下述位置的操作:

  • view/title: 標(biāo)題位置顯示的操作
  • view/item/context: 每個(gè)視圖項(xiàng)的操作
image

例如

{
  "contributes": {
    "menus": {
      "view/title": [
        {
          "command": "tcb.refresh",
          "group": "navigation"
        }
      ],
      "view/item/context": [
        {
          "command": "tcb.viewFunction",
          "group": "group@order"
        }
      ]
    }
  }
}

發(fā)布插件

當(dāng)完成了一個(gè)高質(zhì)量的插件后,我們可以將它發(fā)布到 VS Code 擴(kuò)展市場(chǎng)殉疼,這樣其他人就可以找到梯浪、下載并使用我們的插件了∑澳龋或者挂洛,我們可以將擴(kuò)展打包為可安裝的 VSIX 格式,直接分享給其他用戶使用眠砾。

安裝 VSCE

VSCE虏劲,即 Visual Studio Code Extensions,是一個(gè)用于打包褒颈、發(fā)布和管理 VS Code 插件的命令行工具柒巫。

# 安裝
npm install -g vsce

# 將插件打包成 .vsix 文件
vsce package

發(fā)布檢查

在發(fā)布插件到市場(chǎng)前,最好檢查一下插件的配置是否符合規(guī)范

  • README:介紹你的插件谷丸,幫助他人更好的了解這個(gè)插件
  • name:插件的名稱堡掏,必須用全小寫(xiě),無(wú)空格的字母組成
  • version:SemVer 版本模式兼容
  • publisher:發(fā)行方名稱
  • displayName:插件市場(chǎng)所顯示的插件名稱
  • icon:插件的 Logo
  • description:簡(jiǎn)單地描述一下你的插件是做什么的
  • keywords:關(guān)鍵字?jǐn)?shù)組刨疼,這樣用戶可以更方便地找到你的插件
  • main:插件入口

發(fā)布

在你檢查完插件信息泉唁,準(zhǔn)好好發(fā)布后鹅龄,你可以使用下面的命令直接將插件發(fā)布到市場(chǎng)中

vsce publish

更新

vsce 支持通過(guò) SemVer 語(yǔ)義標(biāo)識(shí)符:majorminor亭畜,patch 增量更新插件版本號(hào)扮休。例如,你想把插件從 1.0.0 更新到 1.1.0拴鸵,那么加上minor

vsce publish minor

插件 package.json 的 version 會(huì)先更新玷坠,然后才發(fā)布插件

參考文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宝踪,隨后出現(xiàn)的幾起案子侨糟,更是在濱河造成了極大的恐慌,老刑警劉巖瘩燥,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異不同,居然都是意外死亡厉膀,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)二拐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)服鹅,“玉大人,你說(shuō)我怎么就攤上這事百新∑笕恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵饭望,是天一觀的道長(zhǎng)仗哨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)铅辞,這世上最難降的妖魔是什么厌漂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮斟珊,結(jié)果婚禮上苇倡,老公的妹妹穿的比我還像新娘。我一直安慰自己囤踩,他們只是感情好旨椒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著堵漱,像睡著了一般综慎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怔锌,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天寥粹,我揣著相機(jī)與錄音变过,去河邊找鬼。 笑死涝涤,一個(gè)胖子當(dāng)著我的面吹牛媚狰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阔拳,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼崭孤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了糊肠?” 一聲冷哼從身側(cè)響起辨宠,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎货裹,沒(méi)想到半個(gè)月后嗤形,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弧圆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年赋兵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搔预。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霹期,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拯田,到底是詐尸還是另有隱情历造,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布船庇,位于F島的核電站吭产,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏溢十。R本人自食惡果不足惜垮刹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望张弛。 院中可真熱鬧荒典,春花似錦、人聲如沸吞鸭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刻剥。三九已至遮咖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間造虏,已是汗流浹背御吞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工麦箍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陶珠。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓挟裂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親揍诽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诀蓉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348