vscode extension插件開發(fā)

最近公司要使用vscode作為開發(fā)工具钱床,需要對vscode做一些定制功能,比如snippet提示妖啥,內(nèi)容提示霉颠,以及其他插件集成等,為此做了一些調(diào)查荆虱,并做了一定的開發(fā)與支持蒿偎。

官方文檔

https://code.visualstudio.com/docs
上面是vscode官方提供的extension開發(fā)幫助朽们,按照上面的步驟基本上可以做簡單的demo事例
如下主要介紹下自己在開發(fā)中做的幾個簡單功能:

1. Snippet

感覺vscode的snippet功能真的很強大,只要編輯相應(yīng)的json配置文件诉位,在文檔編輯過程中的各種提示應(yīng)有盡有骑脱,在vscode的market上,也可以找到各種后綴格式的文件的配置苍糠。
snippet的配置很簡單叁丧,只需要配置對應(yīng)的json文件就可以了

 {
/*
     // Place your snippets for C++ here. Each snippet is defined under a snippet name and has a prefix, body and 
     // description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
     // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the 
     // same ids are connected.
     // Example:
     "Print to console": {
        "prefix":"log", 
        "body":[
            "console.log('$1');", 
            "$2"
        ], 
        "description":"Log output to console"
    } 
*/
}

snippet可以通過兩種方式添加:

1.1 通過vscode->首選項-->用戶代碼段

通過這種方式等于是通過配置自己本地的代碼片段,而且只能在本機使用岳瞭。

1.2 通過開發(fā)snippet的extension

對于開發(fā)snippet的extension很簡單歹袁,配置好vscode extension的工程結(jié)構(gòu),只需要在package.json文件中的contributes-->snippets即可,配置上自己寫的json文件或者添加從第三方獲取到的json文件即可寝优。

  "contributes": {
    "snippets": [
            {
                "language": "cpp",
                "path": "./snippets/snippets.json"
            }
        ],
  }

通過這種方式条舔,把插件打包發(fā)布以后,可以輕松的共享給自己的小伙伴們乏矾,對于snippet的擴展很方便孟抗。

2. registerCommand

在vscode的插件開發(fā),最基礎(chǔ)的就應(yīng)該算是command了钻心,在功能命令凄硼,右鍵菜單,menu捷沸, keybindings等都和command相關(guān)摊沉,所以在做這些功能之前,首先需要自己注冊一個command進去痒给。

// this method is called when your extension is activated
// your extension is activated the very first time the command is executed
export function activate(context: vscode.ExtensionContext) {
    
    // Use the console to output diagnostic information (console.log) and errors (console.error)
    // This line of code will only be executed once when your extension is activated
    console.log('Congratulations, your extension "demoCmd" is now active!');
    // The command has been defined in the package.json file
    // Now provide the implementation of the command with  registerCommand
    // The commandId parameter must match the command field in package.json
    let demoCmd= vscode.commands.registerCommand('extension.demoCmd', () => {
        // The code you place here will be executed every time your command is executed
    });
    context.subscriptions.push(demoCmd);
}

// this method is called when your extension is deactivated
export function deactivate() {
    
}

這個也是整個插件的入口说墨,上例子中定義了一個extension.demoCmd的cmd,對于上面說的一些定制功能苍柏,都需要通過這個cmd在package.json中配置尼斧。
注:如下的命令和配置都是在package.json中的contributes屬性

2.1 注冊命令

注冊命令與其名稱,注意此處的command必須與上門代碼中的cmd名稱一致试吁。

         "commands": [{
            "command": "extension.demoCmd",
            "title": "demoCmd"
        }],

注冊了這個命令棺棵,就可以通過vscode在F1彈出的窗口中輸入命令,找到自己剛剛注冊的cmd


Paste_Image.png

但是如果添加一個快捷鍵是不是會更方便呢熄捍?

2.2 command添加keybindings
        "keybindings": [{
                        "command": "extension.demoCmd",
                        "key": "ctrl+shift+a",
                        "mac": "ctrl+shift+a",
                        "when": "editorTextFocus"
                    }],

此處注冊一個ctrl+shift+a的快捷鍵調(diào)用我們注冊的cmd烛恤,添加了以后,可以通過快捷鍵試試效果余耽,是不是比在F1中輸入命令找到對應(yīng)的cmd方便多了缚柏。

2.3 command添加menu

注冊了快捷鍵,是方便了宾添,但是對于很多用戶來說船惨,有一個menu按鈕或者有一個右鍵菜單是不是更方便呢柜裸?

"menus": {
      "editor/context": [
        {
          "when": "resourceLangId == cpp",
          "command": "extension.demoCmd",
          "group": "navigation"
        }],
        "editor/title": [{
                "when": "resourceLangId == cpp",
                "command": "extension.demoCmd",
                "group": "navigation"
         }]

如上缕陕,提供了兩種方式添加menu粱锐,
editor/context:鼠標(biāo)右鍵菜單


Paste_Image.png

editor/title:菜單欄按鈕


Paste_Image.png
2.4 setting.json配置提示

剛才說了snippet文件內(nèi)容提示,但是對于插件開發(fā)來說扛邑,很有可能需要用戶配置一些本機的環(huán)境或者參數(shù)之類的變量怜浅,對于這個名稱格式的提示也是很有必要的,省的用戶配置錯誤蔬崩。

"configuration": {
            "type": "object",
            "title": "demoCmd configuration",
            "properties": {
                "demoCmd.encoding": {
                    "type": "string",
                    "default": "utf-8",
                    "description": "default file encoding"
                }
            }
        },

配置了這個恶座,在文件-->首選項-->設(shè)置的編輯頁面中,就會提示我們剛才配置的屬性沥阳。此處對于類型跨琳,默認值,類型校驗都很有作用桐罕,可以方便用戶配置參數(shù)并且減少輸入錯誤率脉让。


Paste_Image.png

3. 一些高階用法

在2. registerCommand中的activate中我們除了registerCommand還可以注冊一些其他的事件.
如下給一個CompletionItemProvider的例子

3.1 CompletionItemProvider

vscode除了最基礎(chǔ)的snippet提示,還有另外一種通過CompletionItemProvider實現(xiàn)的提示功能功炮。

// this method is called when your extension is activated
// your extension is activated the very first time the command is executed
export function activate(context: vscode.ExtensionContext) {

     let demoProvider = new demoProvider();
     let cppPv = vscode.languages.registerCompletionItemProvider("cpp", demoProvider);    
     context.subscriptions.push(cppPv);
}
// this method is called when your extension is deactivated
export function deactivate() {

}
export class demoProvider implements vscode.CompletionItemProvider{
        public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): vscode.CompletionItem[]{

            var completionItems = [];
            var completionItem = new vscode.CompletionItem("aaa");
            completionItem.kind = vscode.CompletionItemKind.Snippet;
            completionItem.detail = "aaa";
            completionItem.filterText = "bbbb";
            completionItem.insertText = new vscode.SnippetString("aaaa$1bbbb$2cccc");
            completionItems.push(completionItem);
            return completionItems;
        }
        public resolveCompletionItem(item: vscode.CompletionItem, token: vscode.CancellationToken): any{
            return item;
        }
        dispose(){

        }
    }

類似的還有CodeActionsProvider溅潜,HoverProvider,CodeLensProvider等薪伏。

3.2 insertSnippet

在vscode的新版本中滚澜,提供了一個insertSnippet方法,用于插入snippet類型格式內(nèi)容嫁怀,通過這種方法插入的可以使用snippet的格式设捐,例如$1這種tab跳轉(zhuǎn)等。

        private editSnippet(text : string ) {
            let editor = vscode.window.activeTextEditor;
            let selection : vscode.Selection = editor.selection;
            let insertPosition = new vscode.Position(selection.active.line, 0);
            editor.insertSnippet(new vscode.SnippetString(text), insertPosition);
        }

注意塘淑,在vscode低版本中挡育,可能不存在這個功能。

3.2 OutputChannel

OutputChannel主要用于打印輸出信息到vscode的輸出控制臺朴爬。

let out:vscode.OutputChannel = vscode.window.createOutputChannel("iAuto3 RunScript");
out.show();
out.appendLine("deom");

類似的還有StatusBarItem即寒,Terminal召噩,TextEditorDecorationType等母赵。

4. 打包發(fā)布

這個就參考官方的發(fā)布方法,再次提示一點具滴,以為如果是公司內(nèi)部開發(fā)凹嘲,有些東西是不能對外提交發(fā)布的,所以可以考慮只打包构韵,通過本地安裝

vsce package

自己打包以后周蹭,把打包完成的*.vsix內(nèi)網(wǎng)發(fā)布出去趋艘,可以讓同事們通過 <b>從VSIX安裝</b>

小結(jié):

隨著web發(fā)展,vscode使用范圍在擴大凶朗,從extensions market市場上也可以發(fā)現(xiàn)瓷胧,各種功能的插件基本都很齊全,特別是snippet這一塊棚愤,cpp搓萧, ruby,react宛畦,angular等都很比較齊全瘸洛,可以很大的提高代碼編碼速度,同時還可以通過各種提示校驗等次和,提高代碼質(zhì)量反肋。


Paste_Image.png

同時vscode extensions 開發(fā)門檻不高,對于公司內(nèi)部用于規(guī)范代碼格式踏施,提高代碼質(zhì)量石蔗,降低代碼學(xué)習(xí)門檻都是非常有用的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末读规,一起剝皮案震驚了整個濱河市抓督,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌束亏,老刑警劉巖铃在,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碍遍,居然都是意外死亡定铜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門怕敬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揣炕,“玉大人,你說我怎么就攤上這事东跪』福” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵虽填,是天一觀的道長丁恭。 經(jīng)常有香客問我,道長斋日,這世上最難降的妖魔是什么牲览? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮恶守,結(jié)果婚禮上第献,老公的妹妹穿的比我還像新娘贡必。我一直安慰自己,他們只是感情好庸毫,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布仔拟。 她就那樣靜靜地躺著,像睡著了一般岔绸。 火紅的嫁衣襯著肌膚如雪理逊。 梳的紋絲不亂的頭發(fā)上橡伞,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天盒揉,我揣著相機與錄音,去河邊找鬼兑徘。 笑死刚盈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挂脑。 我是一名探鬼主播藕漱,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼崭闲!你這毒婦竟也來了肋联?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤刁俭,失蹤者是張志新(化名)和其女友劉穎橄仍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牍戚,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡侮繁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了如孝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宪哩。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖第晰,靈堂內(nèi)的尸體忽然破棺而出锁孟,到底是詐尸還是另有隱情,我是刑警寧澤茁瘦,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布品抽,位于F島的核電站,受9級特大地震影響腹躁,放射性物質(zhì)發(fā)生泄漏桑包。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一纺非、第九天 我趴在偏房一處隱蔽的房頂上張望哑了。 院中可真熱鬧赘方,春花似錦、人聲如沸弱左。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拆火。三九已至跳夭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間们镜,已是汗流浹背币叹。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留模狭,地道東北人颈抚。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像嚼鹉,于是被迫代替她去往敵國和親贩汉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容