想象一下鼠標懸停在一個語句上就會浮現出你的提示信息, 是否是還挺酷的, 說幹就幹,但仍是忍不住吐槽一下官網的例子太粗糙了.javascript
咱們新建hover.js
文件java
const vscode = require('vscode'); const path = require('path'); module.exports = vscode.languages.registerHoverProvider('javascript', { provideHover(document, position, token) { const fileName = document.fileName; const workDir = path.dirname(fileName); const word = document.getText(document.getWordRangeAtPosition(position)); // console.log(1, document) // console.log(2, position) // console.log(3, token) console.log(4, '這個就是懸停的文字', word) // 支持markdown語法 return new vscode.Hover( `### 我就是返回的信息! 1. 第一項: - 第一個元素 - 第二個元素 2. 第二項: - 第一個元素 - 第二個元素 `); } } );
index.js
文件以下node
const vscode = require('vscode'); const message = require('./message.js'); const navigation = require('./navigation.js'); const progress = require('./progress.js'); const hover = require('./hover.js'); function activate(context) { vscode.window.showInformationMessage('插件成功激活!'); context.subscriptions.push(message); context.subscriptions.push(navigation); context.subscriptions.push(progress); context.subscriptions.push(hover); } module.exports = { activate }
provideHover
是不用引用的
node_modules
裏面查找對應的文件了, 而後獲取到他的版本號與更新時間和官網地址, 因此那些在 package.json
中hover出現詳情的插件的原理, 你!懂!了!吧!咱們徹底能夠利用這個快捷查找一些大家公司內部的詞彙的具體含義, 或者某些code與id 表明的含義.git
``文件中配置模板github
"contributes": { "snippets": [ { "language": "javascript", "path": "./snippets/cc.json" // 這裏就是存放模板的文件 } ] },
./snippets/cc.json
內容以下:npm
{ "名字寫在這裏真奇怪, 使公司模板統一": { "prefix": "cc 左側名字", "body": [ "for (xxxxxxxxxxxxxxxxx ${2:item} of ${1:array}) {", "\t$0", "}" ], "description": "我本身定義的cc哦, 厲害吧" } }
prefix
就是快捷選擇欄裏面顯示的名字, 也是你輸入的字符的匹配文字body
裏面是咱們定義的模板體${1:array}
這裏的意思是, 光標在生成模板的時候的所在位置的順序, 當你點擊tab的時候鼠標會依次出如今1,2,3這三個地方厲害吧.這個就只須要兩個配置對象, 而且有一張你的icon圖標.json
"viewsContainers": { "activitybar": [ { "id": "xingqiu", "title": "標題,而且hover顯示", "icon": "./images/星球.png" } ] }, "views": { "xingqiu": [ { "id": "c1", "name": "超脫:踏天" }, { "id": "c2", "name": "超脫:道無涯" }, { "id": "c3", "name": "超脫:道源" }, { "id": "c4", "name": "超脫:永恆" } ] }
xingqiu
只有一個對象則徹底佔領, 多個的話就是平分這裏的面積先把最終的效果圖放在這裏, 咱們按圖索驥.....
api
第一步: 新建tree.js
文件, 在這裏編寫樹形視圖的代碼.數組
module.exports = vscode.window.createTreeView('c1', { treeDataProvider: aNodeWithIdTreeDataProvider(), showCollapseAll: true });
createTreeView
的第一個參數是id, 也就是咱們views
中定義的id.2.aNodeWithIdTreeDataProvider
方法會生成一個'對象', 用來定義與生成tree的展現效果, 接下來咱們會詳細的講.安全
showCollapseAll
選項所有摺疊重點講講aNodeWithIdTreeDataProvider
其中有三個key, 其中兩個這裏重點講一下.
第一個: getChildren
方法, 這裏能夠理解爲獲取數據源, 也就是樹形數據, 可是他的理念是每次點擊會獲取一次子集數據, 好比{ a:{name:'xx'} }
, 那麼點擊a的時候會返回{name:'xx'}
這個對象, 注意:第一次執行是undefined 因此咱們要在第一次執行的時候我咱們定義好的樹形數據傳進來.
上代碼:
const {c1Tree} = require('./treeData'); aNodeWithIdTreeDataProvider(){ getChildren: (el) => { const arr = []; const tree = el || c1Tree; for (let item in tree) { const activeItem = tree[item]; if (typeof activeItem !== 'object') { arr.push(`${item}:${activeItem}`) } else { Object.defineProperty(activeItem, "_cc_key", { get: function () { return item }, enumberable: false }); arr.push(activeItem) } } return arr }, }
./treeData.js
代碼以下, 這只是我當前的格式, 明白了原理你固然能夠定製屬於大家團隊的代碼啦.
const c1Tree = { '1': { '做者': "lulu", '寵物': { '名字': 'cc', '品種':'金毛', '年齡': 6, } }, '2': { '做者': "lulu2", '寵物': { '名字': 'cc2', '品種':'金毛', '年齡': 9, } }, '3': '單獨的字符串' } module.exports = { c1Tree, }
getChildren
返回的是個數組getChildren
返回值的每一項顯示在界面上時, 都會傳遞給getTreeItem
作處理getTreeItem
方便使用的形式, 這裏不作具體的界面輸出操做._cc_key
這樣一個屬性, 這是爲了方便下面取用, 下面講完getTreeItem
我會說一下還有哪些作法.第一個: getTreeItem
方法, 每次用戶點擊一個下拉的項, 都會在這個方法裏面得到這個項的配置.
getTreeItem: (el) => { let treeItem = {}; if (typeof el === 'string') { treeItem = { label: el, collapsibleState: 0, tooltip: "hover: 單純的字符串 ", // id: new Date().getTime() } } else { treeItem = { label: el._cc_key, collapsibleState: 1, tooltip: "hover: 可展開 ", // id: new Date().getTime() } } return treeItem; },
label
界面上顯示的文字collapsibleState
是否可展開, 也就是是否有子集可點擊tooltip
hover上時顯示的提示信息id
註冊一個惟一標識, 這個能夠不寫, 若是寫的話要保證id的惟一性.vscode.TreeItemCollapsibleState.None
就是不可摺疊, 比直接用0更安全.vscode.TreeItemCollapsibleState.Collapsed
可摺疊可展開.第三個: getParent
獲取父級, 可是此次沒用到這個就先不詳細展開了.
完整代碼以下:
const vscode = require('vscode'); const {c1Tree} = require('./treeData'); module.exports = vscode.window.createTreeView('c1', { treeDataProvider: aNodeWithIdTreeDataProvider(), showCollapseAll: true }); function aNodeWithIdTreeDataProvider() { return { getChildren: (el) => { const arr = []; const tree = el || c1Tree; for (let item in tree) { const activeItem = tree[item]; if (typeof activeItem !== 'object') { arr.push(`${item}:${activeItem}`) } else { Object.defineProperty(activeItem, "_cc_key", { get: function () { return item }, enumberable: false }); arr.push(activeItem) } } return arr }, getTreeItem: (el) => { let treeItem = {}; if (typeof el === 'string') { treeItem = { label: el, collapsibleState: 0, tooltip: "hover: 單純的字符串 ", } } else { treeItem = { label: el._cc_key, collapsibleState: 1, tooltip: "hover: 可展開 ", } } return treeItem; }, getParent: () => { return {} } }; }
_cc_key
屬性是由於不想被for in的時候循環出來getChildren
裏面把字符串組裝成 'key: value'的形式, 把對象添加_cc_key
屬性, 由於對象前面的key以後就沒法取到了, 須要這裏放入對象.這樣一個樹形結構就完成了, 是否是總體邏輯感受不是那麼順暢, 我也不知道vscode爲啥這樣設計,奇奇怪怪明明有更好的方法...
1: 首先要有一個帳號, 登陸這裏https://login.live.com/
須要配置一個郵箱, 地區選擇中國.
2: 註冊好後能夠點擊這裏https://aka.ms/SignupAzureDevOps
3: 登陸好你會看到以下圖片, 輸入你的項目名稱與項目簡介, 這裏我選擇public公開.
4: 點擊 create project 會跳到下面的頁面
5: 去配置一個token, 按圖裏的順序點擊
這裏配置的是最寬鬆的條件, 由於這樣纔會沒有那些莫名其妙的錯誤.
6: 這裏咱們就多了一個工程
vsce是「 Visual Studio代碼擴展」的簡稱,是用於打包,發佈和管理VS代碼擴展的命令行工具
之後咱們打包插件與發佈插件都會用到這個小夥子.
npm install -g vsce
打開控制檯, 輸入命令
後面是你登錄者的名字, 這裏建立發佈者
系統會依次讓咱們輸入 名字、郵箱、剛剛獲取的token
這裏我改了下名字, 後面會講這個問題
默認是登陸狀態的, 可是若是之後咱們要切換用戶的話要下面的步驟
接下來咱們登錄一下 vsce login (publisher name) 登錄開發者
還須要輸入一下token
問題: 重複了的話會報下面這個錯, 就須要咱們改一個發佈者名字了
vsce publish
或者 vsce publish -p xxxxxxxxtoken
若是出現報錯
1:
在 package.json
中添加 "publisher": "發佈者的名字",
若是還不行, 咱們能夠在官網添加這個名稱進入團隊
2: 他本身生成的.md文件不是很合格, 咱們先清空
兩分鐘左右就能夠在應用商店搜到了(哈哈,下面的也是我寫的demo)
本身作好的固然要安裝一下試試啦
功能都在一切安好.
這個也是官方比較推薦的發佈方式, 這裏我來演示一下(建立發佈者帳號)
地址是:https://marketplace.visualstudio.com/manage
輸入名字, id會自動相同, 這個id也是惟一的因此要起個好名字.
這裏能夠定義你的圖標了, 而且能夠把相關聯的地址信息寫上, 這樣發佈也挺方便。
在這個網站裏能夠直接配置發佈的信息, 更新的操做以下(拖拽更新):
若是咱們直接在代碼裏發佈是不用手動打包的, 以下狀況須要手動打包。
打包命令 vsce package
會出現如圖vsix
爲後綴的文件。
這個時候咱們就能夠把它拖拽到網站上去更新咱們的包。
想要給別人使用的話以下圖:
而後會彈出文件選擇框, 這樣就能夠實現安裝包安裝了。
其實吧你說它功能強大也對, 可是實際上編輯器就是編輯器, 一些人想要作不少不少功能放在vscode裏面,那還不如直接作個桌面端或者網站, 咱們作插件因該作儘可能方面的功能, 不用過多操做的功能, 更定製化的功能, 這裏的優點是能夠獲取到開發人員當前的編輯狀態, 因此一些與此無關,又略顯繁瑣的工做不建議放在插件裏完成。
此次就是這樣, 但願和你一塊兒進步.