一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - VSCode插件開發全攻略之跳轉到定義、自動補全、懸停提示功能

VSCode插件開發全攻略之跳轉到定義、自動補全、懸停提示功能

2021-09-03 15:16我是小茗同學 C/C++

這篇文章主要介紹了VSCode插件開發全攻略之跳轉到定義、自動補全、懸停提示,需要的朋友可以參考下

跳轉到定義

跳轉到定義其實很簡單,通過vscode.languages.registerDefinitionProvider注冊一個provider,這個provider如果返回了new vscode.Location()就表示當前光標所在單詞支持跳轉,并且跳轉到對應location。

為了示例更加有意義,我在這里寫了一個支持package.jsondependenciesdevDependencies跳轉到對應依賴包的例子jump-to-definition.js(當然我們這里只是很簡單的實現,沒有考慮特殊情況,直接從node_modules文件夾下面去找):

VSCode插件開發全攻略之跳轉到定義、自動補全、懸停提示功能

代碼如下:

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

/**
 * 查找文件定義的provider,匹配到了就return一個location,否則不做處理
 * 最終效果是,當按住Ctrl鍵時,如果return了一個location,字符串就會變成一個可以點擊的鏈接,否則無任何效果
 * @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('====== 進入 provideDefinition 方法 ======');
 console.log('fileName: ' + fileName); // 當前文件完整路徑
 console.log('workDir: ' + workDir); // 當前文件所在目錄
 console.log('word: ' + word); // 當前光標所在單詞
 console.log('line: ' + line.text); // 當前光標所在行
 console.log('projectPath: ' + projectPath); // 當前工程目錄
 // 只處理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) 表示跳轉到某個文件的第一行第一列
  return new vscode.Location(vscode.Uri.file(destPath), new vscode.Position(0, 0));
  }
 }
 }
}

module.exports = function(context) {
 // 注冊如何實現跳轉到定義,第一個參數表示僅對json文件生效
 context.subscriptions.push(vscode.languages.registerDefinitionProvider(['json'], {
 provideDefinition
 }));
};

注意不要忘了修改activationEvents

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

new vscode.Location接收2個參數,第一個是要跳轉到文件的路徑,第二個是跳轉之后光標所在位置,接收Range或者Position對象,Position對象的初始化接收2個參數,行row和列col。

高亮顯示范圍

這里有一個問題我一直沒找到解決方案,如下圖所示:

VSCode插件開發全攻略之跳轉到定義、自動補全、懸停提示功能

當按住Ctrl跳轉的時候,雖然可以控制跳轉目標位置,但是卻無法控制高亮顯示的范圍,下圖我本應該讓page/video/list.html全部變成藍色的,但是默認卻只能以單詞為粒度變色,這個問題我找了很久官方文檔就是沒找到解決辦法,如果大家有知道的歡迎評論指出。

自動補全

通過vscode.languages.registerCompletionItemProvider方法注冊自動完成實現,接收3個參數:

  • 第一個是要關聯的文件類型;
  • 第二個是一個對象,里面必須包含provideCompletionItems和resolveCompletionItem這2個方法;
  • 第三個是一個可選的觸發提示的字符列表;

這里我們實現這樣一個例子,當輸入this.dependencies.xxx時自動把package.json中的依賴全部帶出來,包括dependencies、devDependencies,就像這樣:

VSCode插件開發全攻略之跳轉到定義、自動補全、懸停提示功能

實現代碼如下:

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

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

 // 只截取到光標位置為止,防止一些特殊情況
 const lineText = line.text.substring(0, position.character);
 // 簡單匹配,只要當前光標前的字符串為`this.dependencies.`都自動帶出所有的依賴
 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);
 })
 }
}

/**
 * 光標選中當前自動補全item時觸發動作,一般情況下無需處理
 * @param {*} item 
 * @param {*} token 
 */
function resolveCompletionItem(item, token) {
 return null;
}

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

懸停提示

從上面的跳轉到定義我們可以看到,雖然我們只是定義了如何調整,到按住Ctrl鍵但是不點擊的時候,vscode默認就會幫我們預覽一部分內容作為提示,除此之外,如果想獲得更多的提示,我們還可以通過vscode.languages.registerHoverProvider命令來實現。

下面我們依然通過package.json中依賴跳轉的例子來演示如何實現一個自定義hover,如下標紅的內容是我們自己實現的,當鼠標停在package.json的dependencies或者devDependencies時,自動顯示對應包的名稱、版本號和許可協議:

VSCode插件開發全攻略之跳轉到定義、自動補全、懸停提示功能

如何實現的呢?也很簡單,我們直接上代碼:

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

/**
 * 鼠標懸停提示,當鼠標停在package.json的dependencies或者devDependencies時,
 * 自動顯示對應包的名稱、版本號和許可協議
 * @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('進入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內容支持markdown語法
  return new vscode.Hover(`* **名稱**:${content.name}\n* **版本**:${content.version}\n* **許可協議**:${content.license}`);
  }
 }
 }
}

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

有些時候某個字段可能本身已經有提示內容了,如果我們仍然給它注冊了hover的實現的話,那么vscode會自動將多個hover內容合并一起顯示。

總結

到此這篇關于VSCode插件開發全攻略之跳轉到定義、自動補全、懸停提示功能的文章就介紹到這了,更多相關VSCode插件開發 跳轉到定義、自動補全、懸停提示內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/liuxianan/p/vscode-plugin-jump-completion-hover.html

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
主站蜘蛛池模板: www.日本免费 | 国产精品林美惠子在线观看 | 亚洲国产精品成 | 99热这里只有精品在线观看 | 四虎精品成人免费影视 | 被强迫调教的高辣小说 | 免费看a片毛片 | tube69xxxxhd日本 | 四虎成人免费视频 | 亚洲午夜久久久久久91 | 天天色国产 | 四虎影视永久免费视频观看 | 亚欧视频在线观看 | 韩国甜性涩爱在线播放 | 午夜久久久久久亚洲国产精品 | 日本欧美大码a在线视频播放 | 放荡女小洁的性日记 | 国产情侣自拍网 | 亚偷熟乱区视频在线观看 | 亚洲国产免费 | 成人国产精品一区二区不卡 | 青青草成人在线 | 动漫美女被褥吸奶漫画漫画 | 国产日本久久久久久久久婷婷 | 韩国三级2020| 午夜免费无码福利视频麻豆 | chinesehdxxx吃奶水| poronovideos极度变态 | 男人猛戳女人下部30分钟 | 掰开逼操| 午夜成私人影院在线观看 | 四虎在线最新地址公告 | 国产精品夜色视频一级区 | 久久免费看少妇高潮A片JA | 国产高清自拍 | 亚洲天堂影院在线观看 | 国产亚洲精品高清在线 | 和日本免费不卡在线v | 王晶三级作品 | 无码骚夜夜精品 | 天选之王漫画顾长歌免费阅读 |