当前位置:   article > 正文

VSCode C/C++无法跳转到定义、自动补全、悬停提示功能_c/c++:edit configurations(json)

c/c++:edit configurations(json)

无法跳转

第一步

首先这个C/C++ 这个插件你要有

 

第二步

打开 Extension settings,查看是否为default

 

注意:这个时候前面的伏笔就来了,如果你装了 clang,你将无法把 C_Cpp:Intelli Sense Engine 开关设置为 Default,它会强制给你关掉,导致你配置不了 C/C++:Edit Configurations(JSON),也就不能进行调试跳转。

​  【解决方法】很简单,在插件栏里将 clangd 卸载、重启即可。

第三步

重启vscode 查看是否能跳转

第五步:

如果还不行

下载这个https://sourceforge.net/projects/mingw/ 安装gcc 与 g++

不会安装gcc 与 g++ 你自己去百度吧

重启电脑 打开vscode 即可跳转

修改代码-跳转到定义

跳转到定义其实很简单,通过vscode.languages.registerDefinitionProvider注册一个provider,这个provider如果返回了new vscode.Location()就表示当前光标所在单词支持跳转,并且跳转到对应location。

为了示例更加有意义,我在这里写了一个支持package.jsondependenciesdevDependencies跳转到对应依赖包的例子jump-to-definition.js(当然我们这里只是很简单的实现,没有考虑特殊情况,直接从node_modules文件夹下面去找):

代码如下:

  1. /**
  2. * 跳转到定义示例,本示例支持package.json中dependencies、devDependencies跳转到对应依赖包。
  3. */
  4. const vscode = require('vscode');
  5. const path = require('path');
  6. const fs = require('fs');
  7. const util = require('./util');
  8. /**
  9. * 查找文件定义的provider,匹配到了就return一个location,否则不做处理
  10. * 最终效果是,当按住Ctrl键时,如果return了一个location,字符串就会变成一个可以点击的链接,否则无任何效果
  11. * @param {*} document
  12. * @param {*} position
  13. * @param {*} token
  14. */
  15. function provideDefinition(document, position, token) {
  16. const fileName = document.fileName;
  17. const workDir = path.dirname(fileName);
  18. const word = document.getText(document.getWordRangeAtPosition(position));
  19. const line = document.lineAt(position);
  20. const projectPath = util.getProjectPath(document);
  21. console.log('====== 进入 provideDefinition 方法 ======');
  22. console.log('fileName: ' + fileName); // 当前文件完整路径
  23. console.log('workDir: ' + workDir); // 当前文件所在目录
  24. console.log('word: ' + word); // 当前光标所在单词
  25. console.log('line: ' + line.text); // 当前光标所在行
  26. console.log('projectPath: ' + projectPath); // 当前工程目录
  27. // 只处理package.json文件
  28. if (/\/package\.json$/.test(fileName)) {
  29. console.log(word, line.text);
  30. const json = document.getText();
  31. if (new RegExp(`"(dependencies|devDependencies)":\\s*?\\{[\\s\\S]*?${word.replace(/\//g, '\\/')}[\\s\\S]*?\\}`, 'gm').test(json)) {
  32. let destPath = `${workDir}/node_modules/${word.replace(/"/g, '')}/package.json`;
  33. if (fs.existsSync(destPath)) {
  34. // new vscode.Position(0, 0) 表示跳转到某个文件的第一行第一列
  35. return new vscode.Location(vscode.Uri.file(destPath), new vscode.Position(0, 0));
  36. }
  37. }
  38. }
  39. }
  40. module.exports = function(context) {
  41. // 注册如何实现跳转到定义,第一个参数表示仅对json文件生效
  42. context.subscriptions.push(vscode.languages.registerDefinitionProvider(['json'], {
  43. provideDefinition
  44. }));
  45. };
  46. 注意不要忘了修改activationEvents:
  47. "activationEvents": [
  48. "onLanguage:json"
  49. ],

new vscode.Location接收2个参数,第一个是要跳转到文件的路径,第二个是跳转之后光标所在位置,接收Range或者Position对象,Position对象的初始化接收2个参数,行row和列col。

高亮显示范围

这里有一个问题我一直没找到解决方案,如下图所示:

 

当按住Ctrl跳转的时候,虽然可以控制跳转目标位置,但是却无法控制高亮显示的范围,下图我本应该让page/video/list.html全部变成蓝色的,但是默认却只能以单词为粒度变色,这个问题我找了很久官方文档就是没找到解决办法,如果大家有知道的欢迎评论指出。

自动补全

通过vscode.languages.registerCompletionItemProvider方法注册自动完成实现,接收3个参数:

  •  第一个是要关联的文件类型;
  •  第二个是一个对象,里面必须包含provideCompletionItems和resolveCompletionItem这2个方法;
  •  第三个是一个可选的触发提示的字符列表;

这里我们实现这样一个例子,当输入this.dependencies.xxx时自动把package.json中的依赖全部带出来,包括dependencies、devDependencies,就像这样:

 实现代码如下:

  1. const vscode = require('vscode');
  2. const util = require('./util');
  3. /**
  4. * 自动提示实现,这里模拟一个很简单的操作
  5. * 当输入 this.dependencies.xxx时自动把package.json中的依赖带出来
  6. * 当然这个例子没啥实际意义,仅仅是为了演示如何实现功能
  7. * @param {*} document
  8. * @param {*} position
  9. * @param {*} token
  10. * @param {*} context
  11. */
  12. function provideCompletionItems(document, position, token, context) {
  13. const line = document.lineAt(position);
  14. const projectPath = util.getProjectPath(document);
  15. // 只截取到光标位置为止,防止一些特殊情况
  16. const lineText = line.text.substring(0, position.character);
  17. // 简单匹配,只要当前光标前的字符串为`this.dependencies.`都自动带出所有的依赖
  18. if(/(^|=| )\w+\.dependencies\.$/g.test(lineText)) {
  19. const json = require(`${projectPath}/package.json`);
  20. const dependencies = Object.keys(json.dependencies || {}).concat(Object.keys(json.devDependencies || {}));
  21. return dependencies.map(dep => {
  22. // vscode.CompletionItemKind 表示提示的类型
  23. return new vscode.CompletionItem(dep, vscode.CompletionItemKind.Field);
  24. })
  25. }
  26. }
  27. /**
  28. * 光标选中当前自动补全item时触发动作,一般情况下无需处理
  29. * @param {*} item
  30. * @param {*} token
  31. */
  32. function resolveCompletionItem(item, token) {
  33. return null;
  34. }
  35. module.exports = function(context) {
  36. // 注册代码建议提示,只有当按下“.”时才触发
  37. context.subscriptions.push(vscode.languages.registerCompletionItemProvider('javascript', {
  38. provideCompletionItems,
  39. resolveCompletionItem
  40. }, '.'));
  41. };

悬停提示

从上面的跳转到定义我们可以看到,虽然我们只是定义了如何调整,到按住Ctrl键但是不点击的时候,vscode默认就会帮我们预览一部分内容作为提示,除此之外,如果想获得更多的提示,我们还可以通过vscode.languages.registerHoverProvider命令来实现。

下面我们依然通过package.json中依赖跳转的例子来演示如何实现一个自定义hover,如下标红的内容是我们自己实现的,当鼠标停在package.json的dependencies或者devDependencies时,自动显示对应包的名称、版本号和许可协议:

 

如何实现的呢?也很简单,我们直接上代码:

  1. const vscode = require('vscode');
  2. const path = require('path');
  3. const fs = require('fs');
  4. /**
  5. * 鼠标悬停提示,当鼠标停在package.json的dependencies或者devDependencies时,
  6. * 自动显示对应包的名称、版本号和许可协议
  7. * @param {*} document
  8. * @param {*} position
  9. * @param {*} token
  10. */
  11. function provideHover(document, position, token) {
  12. const fileName = document.fileName;
  13. const workDir = path.dirname(fileName);
  14. const word = document.getText(document.getWordRangeAtPosition(position));
  15. if (/\/package\.json$/.test(fileName)) {
  16. console.log('进入provideHover方法');
  17. const json = document.getText();
  18. if (new RegExp(`"(dependencies|devDependencies)":\\s*?\\{[\\s\\S]*?${word.replace(/\//g, '\\/')}[\\s\\S]*?\\}`, 'gm').test(json)) {
  19. let destPath = `${workDir}/node_modules/${word.replace(/"/g, '')}/package.json`;
  20. if (fs.existsSync(destPath)) {
  21. const content = require(destPath);
  22. console.log('hover已生效');
  23. // hover内容支持markdown语法
  24. return new vscode.Hover(`* **名称**:${content.name}\n* **版本**:${content.version}\n* **许可协议**:${content.license}`);
  25. }
  26. }
  27. }
  28. }
  29. module.exports = function(context) {
  30. // 注册鼠标悬停提示
  31. context.subscriptions.push(vscode.languages.registerHoverProvider('json', {
  32. provideHover
  33. }));
  34. };

有些时候某个字段可能本身已经有提示内容了,如果我们仍然给它注册了hover的实现的话,那么vscode会自动将多个hover内容合并一起显示。

总结

到此这篇关于VSCode插件开发全攻略之跳转到定义、自动补全、悬停提示功能的文章就介绍到这了!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/294234
推荐阅读
相关标签
  

闽ICP备14008679号