欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

VSCode插件開(kāi)發(fā)全攻略之跳轉(zhuǎn)到定義、自動(dòng)補(bǔ)全、懸停提示功能

 更新時(shí)間:2020年05月07日 15:07:35   作者:我是小茗同學(xué)  
這篇文章主要介紹了VSCode插件開(kāi)發(fā)全攻略之跳轉(zhuǎn)到定義、自動(dòng)補(bǔ)全、懸停提示,需要的朋友可以參考下

跳轉(zhuǎn)到定義

跳轉(zhuǎn)到定義其實(shí)很簡(jiǎn)單,通過(guò)vscode.languages.registerDefinitionProvider注冊(cè)一個(gè)provider,這個(gè)provider如果返回了new vscode.Location()就表示當(dāng)前光標(biāo)所在單詞支持跳轉(zhuǎn),并且跳轉(zhuǎn)到對(duì)應(yīng)location。

為了示例更加有意義,我在這里寫(xiě)了一個(gè)支持package.jsondependencies、devDependencies跳轉(zhuǎn)到對(duì)應(yīng)依賴包的例子jump-to-definition.js(當(dāng)然我們這里只是很簡(jiǎn)單的實(shí)現(xiàn),沒(méi)有考慮特殊情況,直接從node_modules文件夾下面去找):

代碼如下:

/**
 * 跳轉(zhuǎn)到定義示例,本示例支持package.json中dependencies、devDependencies跳轉(zhuǎn)到對(duì)應(yīng)依賴包。
 */
const vscode = require('vscode');
const path = require('path');
const fs = require('fs');
const util = require('./util');

/**
 * 查找文件定義的provider,匹配到了就return一個(gè)location,否則不做處理
 * 最終效果是,當(dāng)按住Ctrl鍵時(shí),如果return了一個(gè)location,字符串就會(huì)變成一個(gè)可以點(diǎn)擊的鏈接,否則無(wú)任何效果
 * @param {*} document 
 * @param {*} position 
 * @param {*} token 
 */
function provideDefinition(document, position, token) {
 const fileName = document.fileName;
 const workDir = path.dirname(fileName);
 const word = document.getText(document.getWordRangeAtPosition(position));
 const line = document.lineAt(position);
 const projectPath = util.getProjectPath(document);

 console.log('====== 進(jìn)入 provideDefinition 方法 ======');
 console.log('fileName: ' + fileName); // 當(dāng)前文件完整路徑
 console.log('workDir: ' + workDir); // 當(dāng)前文件所在目錄
 console.log('word: ' + word); // 當(dāng)前光標(biāo)所在單詞
 console.log('line: ' + line.text); // 當(dāng)前光標(biāo)所在行
 console.log('projectPath: ' + projectPath); // 當(dāng)前工程目錄
 // 只處理package.json文件
 if (/\/package\.json$/.test(fileName)) {
 console.log(word, line.text);
 const json = document.getText();
 if (new RegExp(`"(dependencies|devDependencies)":\\s*?\\{[\\s\\S]*?${word.replace(/\//g, '\\/')}[\\s\\S]*?\\}`, 'gm').test(json)) {
  let destPath = `${workDir}/node_modules/${word.replace(/"/g, '')}/package.json`;
  if (fs.existsSync(destPath)) {
  // new vscode.Position(0, 0) 表示跳轉(zhuǎn)到某個(gè)文件的第一行第一列
  return new vscode.Location(vscode.Uri.file(destPath), new vscode.Position(0, 0));
  }
 }
 }
}

module.exports = function(context) {
 // 注冊(cè)如何實(shí)現(xiàn)跳轉(zhuǎn)到定義,第一個(gè)參數(shù)表示僅對(duì)json文件生效
 context.subscriptions.push(vscode.languages.registerDefinitionProvider(['json'], {
 provideDefinition
 }));
};

注意不要忘了修改activationEvents

"activationEvents": [
 "onLanguage:json"
],

new vscode.Location接收2個(gè)參數(shù),第一個(gè)是要跳轉(zhuǎn)到文件的路徑,第二個(gè)是跳轉(zhuǎn)之后光標(biāo)所在位置,接收Range或者Position對(duì)象,Position對(duì)象的初始化接收2個(gè)參數(shù),行row和列col。

高亮顯示范圍

這里有一個(gè)問(wèn)題我一直沒(méi)找到解決方案,如下圖所示:

當(dāng)按住Ctrl跳轉(zhuǎn)的時(shí)候,雖然可以控制跳轉(zhuǎn)目標(biāo)位置,但是卻無(wú)法控制高亮顯示的范圍,下圖我本應(yīng)該讓page/video/list.html全部變成藍(lán)色的,但是默認(rèn)卻只能以單詞為粒度變色,這個(gè)問(wèn)題我找了很久官方文檔就是沒(méi)找到解決辦法,如果大家有知道的歡迎評(píng)論指出。

自動(dòng)補(bǔ)全

通過(guò)vscode.languages.registerCompletionItemProvider方法注冊(cè)自動(dòng)完成實(shí)現(xiàn),接收3個(gè)參數(shù):

  • 第一個(gè)是要關(guān)聯(lián)的文件類型;
  • 第二個(gè)是一個(gè)對(duì)象,里面必須包含provideCompletionItems和resolveCompletionItem這2個(gè)方法;
  • 第三個(gè)是一個(gè)可選的觸發(fā)提示的字符列表;

這里我們實(shí)現(xiàn)這樣一個(gè)例子,當(dāng)輸入this.dependencies.xxx時(shí)自動(dòng)把package.json中的依賴全部帶出來(lái),包括dependencies、devDependencies,就像這樣:

實(shí)現(xiàn)代碼如下:

const vscode = require('vscode');
const util = require('./util');

/**
 * 自動(dòng)提示實(shí)現(xiàn),這里模擬一個(gè)很簡(jiǎn)單的操作
 * 當(dāng)輸入 this.dependencies.xxx時(shí)自動(dòng)把package.json中的依賴帶出來(lái)
 * 當(dāng)然這個(gè)例子沒(méi)啥實(shí)際意義,僅僅是為了演示如何實(shí)現(xiàn)功能
 * @param {*} document 
 * @param {*} position 
 * @param {*} token 
 * @param {*} context 
 */
function provideCompletionItems(document, position, token, context) {
 const line = document.lineAt(position);
 const projectPath = util.getProjectPath(document);

 // 只截取到光標(biāo)位置為止,防止一些特殊情況
 const lineText = line.text.substring(0, position.character);
 // 簡(jiǎn)單匹配,只要當(dāng)前光標(biāo)前的字符串為`this.dependencies.`都自動(dòng)帶出所有的依賴
 if(/(^|=| )\w+\.dependencies\.$/g.test(lineText)) {
 const json = require(`${projectPath}/package.json`);
 const dependencies = Object.keys(json.dependencies || {}).concat(Object.keys(json.devDependencies || {}));
 return dependencies.map(dep => {
  // vscode.CompletionItemKind 表示提示的類型
  return new vscode.CompletionItem(dep, vscode.CompletionItemKind.Field);
 })
 }
}

/**
 * 光標(biāo)選中當(dāng)前自動(dòng)補(bǔ)全item時(shí)觸發(fā)動(dòng)作,一般情況下無(wú)需處理
 * @param {*} item 
 * @param {*} token 
 */
function resolveCompletionItem(item, token) {
 return null;
}

module.exports = function(context) {
 // 注冊(cè)代碼建議提示,只有當(dāng)按下“.”時(shí)才觸發(fā)
 context.subscriptions.push(vscode.languages.registerCompletionItemProvider('javascript', {
 provideCompletionItems,
 resolveCompletionItem
 }, '.'));
};

懸停提示

從上面的跳轉(zhuǎn)到定義我們可以看到,雖然我們只是定義了如何調(diào)整,到按住Ctrl鍵但是不點(diǎn)擊的時(shí)候,vscode默認(rèn)就會(huì)幫我們預(yù)覽一部分內(nèi)容作為提示,除此之外,如果想獲得更多的提示,我們還可以通過(guò)vscode.languages.registerHoverProvider命令來(lái)實(shí)現(xiàn)。

下面我們依然通過(guò)package.json中依賴跳轉(zhuǎn)的例子來(lái)演示如何實(shí)現(xiàn)一個(gè)自定義hover,如下標(biāo)紅的內(nèi)容是我們自己實(shí)現(xiàn)的,當(dāng)鼠標(biāo)停在package.json的dependencies或者devDependencies時(shí),自動(dòng)顯示對(duì)應(yīng)包的名稱、版本號(hào)和許可協(xié)議:

如何實(shí)現(xiàn)的呢?也很簡(jiǎn)單,我們直接上代碼:

const vscode = require('vscode');
const path = require('path');
const fs = require('fs');

/**
 * 鼠標(biāo)懸停提示,當(dāng)鼠標(biāo)停在package.json的dependencies或者devDependencies時(shí),
 * 自動(dòng)顯示對(duì)應(yīng)包的名稱、版本號(hào)和許可協(xié)議
 * @param {*} document 
 * @param {*} position 
 * @param {*} token 
 */
function provideHover(document, position, token) {
 const fileName = document.fileName;
 const workDir = path.dirname(fileName);
 const word = document.getText(document.getWordRangeAtPosition(position));

 if (/\/package\.json$/.test(fileName)) {
 console.log('進(jìn)入provideHover方法');
 const json = document.getText();
 if (new RegExp(`"(dependencies|devDependencies)":\\s*?\\{[\\s\\S]*?${word.replace(/\//g, '\\/')}[\\s\\S]*?\\}`, 'gm').test(json)) {
  let destPath = `${workDir}/node_modules/${word.replace(/"/g, '')}/package.json`;
  if (fs.existsSync(destPath)) {
  const content = require(destPath);
  console.log('hover已生效');
  // hover內(nèi)容支持markdown語(yǔ)法
  return new vscode.Hover(`* **名稱**:${content.name}\n* **版本**:${content.version}\n* **許可協(xié)議**:${content.license}`);
  }
 }
 }
}

module.exports = function(context) {
 // 注冊(cè)鼠標(biāo)懸停提示
 context.subscriptions.push(vscode.languages.registerHoverProvider('json', {
 provideHover
 }));
};

有些時(shí)候某個(gè)字段可能本身已經(jīng)有提示內(nèi)容了,如果我們?nèi)匀唤o它注冊(cè)了hover的實(shí)現(xiàn)的話,那么vscode會(huì)自動(dòng)將多個(gè)hover內(nèi)容合并一起顯示。

總結(jié)

到此這篇關(guān)于VSCode插件開(kāi)發(fā)全攻略之跳轉(zhuǎn)到定義、自動(dòng)補(bǔ)全、懸停提示功能的文章就介紹到這了,更多相關(guān)VSCode插件開(kāi)發(fā) 跳轉(zhuǎn)到定義、自動(dòng)補(bǔ)全、懸停提示內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實(shí)現(xiàn)公司人事管理系統(tǒng)

    C++實(shí)現(xiàn)公司人事管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)公司人事管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • ??C++11系列學(xué)習(xí)之Lambda表達(dá)式

    ??C++11系列學(xué)習(xí)之Lambda表達(dá)式

    這篇文章主要介紹了??C++11系列學(xué)習(xí)之Lambda表達(dá)式,C++11終于也引入了lambda表達(dá)式,lambda最早來(lái)源于函數(shù)式編程,現(xiàn)代語(yǔ)言慢慢都引入了這個(gè)語(yǔ)法,下文關(guān)于??C++11Lambda表達(dá)式相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • VC判斷進(jìn)程是否具有administrator權(quán)限的方法

    VC判斷進(jìn)程是否具有administrator權(quán)限的方法

    這篇文章主要介紹了VC判斷進(jìn)程是否具有administrator權(quán)限的方法,在Windows應(yīng)用程序設(shè)計(jì)中具有一定的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • opencv實(shí)現(xiàn)角點(diǎn)檢測(cè)

    opencv實(shí)現(xiàn)角點(diǎn)檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)角點(diǎn)檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語(yǔ)言中對(duì)數(shù)組賦值的三種形式

    C語(yǔ)言中對(duì)數(shù)組賦值的三種形式

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中對(duì)數(shù)組賦值的3種形式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 原碼, 反碼與補(bǔ)碼基礎(chǔ)知識(shí)詳細(xì)介紹

    原碼, 反碼與補(bǔ)碼基礎(chǔ)知識(shí)詳細(xì)介紹

    這篇文章講解了計(jì)算機(jī)的原碼, 反碼和補(bǔ)碼. 并且進(jìn)行了深入探求了為何要使用反碼和補(bǔ)碼, 以及更進(jìn)一步的論證了為何可以用反碼, 補(bǔ)碼的加法計(jì)算原碼的減法,需要的朋友可以參考下
    2016-12-12
  • C語(yǔ)言連續(xù)生成隨機(jī)數(shù)的實(shí)現(xiàn)方法

    C語(yǔ)言連續(xù)生成隨機(jī)數(shù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了C語(yǔ)言連續(xù)生成隨機(jī)數(shù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C++排序算法之冒泡排序解析

    C++排序算法之冒泡排序解析

    這篇文章主要介紹了C++排序算法之冒泡排序解析,從左到右,相鄰兩數(shù)兩兩比較,若下標(biāo)小的數(shù)大于下標(biāo)大的數(shù)則交換,將最大的數(shù)放在數(shù)組的最后一位,,再次遍歷數(shù)組,將第二大的數(shù),放在數(shù)組倒數(shù)第二的位置,以此類推,直到數(shù)組有序需要的朋友可以參考下
    2023-10-10
  • 通過(guò)GDB學(xué)習(xí)C語(yǔ)言的講解

    通過(guò)GDB學(xué)習(xí)C語(yǔ)言的講解

    今天小編就為大家分享一篇關(guān)于通過(guò)GDB學(xué)習(xí)C語(yǔ)言的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • 一文帶你搞懂C語(yǔ)言動(dòng)態(tài)內(nèi)存管理

    一文帶你搞懂C語(yǔ)言動(dòng)態(tài)內(nèi)存管理

    動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存。本文將通過(guò)幾個(gè)示例帶大家深入了解一下C語(yǔ)言的動(dòng)態(tài)內(nèi)存管理,需要的可以參考一下
    2022-11-11

最新評(píng)論