解决 vscode-leetcode 插件创建的 Rust 文件无代码提示问题

问题发现

用 Rust 写题的时候会遇到代码提示失效的问题,看着不舒服,对于新手来说也很不友好。

在写上面这段代码的时候只有一些通用的提示信息,写完后代码高亮也不太准确。

设置配置文件

观察到在创建 Rust 代码文件的时候,rust-analyzer 插件(以下简称 ra)爆红了:

打开输出窗口,看到报错信息:

提示找不到 rust-project.json 文件。

rust-project.json 是个什么文件呢?实际上,它在 Rust 项目不使用 Cargo 的情况下可以作为 Cargo.toml 的替代品。想要正常使用 ra 代码补全和提示的功能,必须要正确地描述项目结构,包括模块的嵌套和依赖、文件的路径。在 Cargo 中是使用 Cargo.toml 去组织的,不使用 Cargo 的话就要使用 rust-project.json 去配置。参考 ra 官方用户手册,可以写这样一个配置文件:

json 复制代码
{
  "sysroot": "xxx",
  "crates": [
    {
      "root_module": "xxx.rs",
      "edition": "20xx",
      "deps": []
    }
  ]
}
  • sysroot:rustc 会根据该属性去寻找 rust 标准库(例如 std)的位置。 如果不知道这里该填写什么,可以使用 rustc --print sysroot 来获取 sysroot 的值。

  • crates: 描述项目文件的具体信息。

    • root_module:使用相对路径描述位置。也就是主函数的路径。
    • edition:crate 的版本,可选的版本有 2015、2018、2021。但其实作为初学者,使用哪个版本都不会有太大的影响。
    • deps:项目依赖文件。

rust-project.json 配置好,注意 root_module 的值填要运行的文件的绝对路径。把配置文件放在题解代码所在路径下,重新加载一下 vscode 窗口,可以看到出现提示了:

大功告成?并没有。当打开另一个题目的时候,提示又没了。其实结合刚才的 rust-project.json 配置方法已经可以看出,如果想要打开的文件有提示,必须手动指定 root_module。也就是说,打开一个新的 rust 题目文件,就要手动修改一次 rust-project.json,这未免也太麻烦了。

自定义修改插件

既然题目文件是由插件自动生成的,那肯定也可以自动生成一个配置文件。修改的思路就是在每次生成或打开的题目文件名之前,动态地生成配置信息写入 rust-project.json

打开 vscode 插件存放目录,默认是 C:\Users\<用户名>\.vscode\extensions,打开 leetcode.vscode-leetcode-<版本号> 目录。

如何定位到生成或打开题目文件的代码呢?既然是写入,那肯定有 "write" 类似的单词。全局搜索一下 "write":

看起来应该就是在 leetCodeExecutor.js 文件中了。

定位到 leetCodeExecutor.js 文件出现 "write" 的位置:

就是这里了,这段代码的作用就是显示问题描述以及生成或打开题目代码。

添加以下代码:

javascript 复制代码
// 修改rust-project.json的根模块
const leetcodeRustConfig = {
  "sysroot": "<你的sysroot>",
  "crates": [{
    "root_module": filePath,
    "edition": "2021",
    "deps": []
  }]
};
fse.outputJSON("<你的题目代码保存路径>\\rust-project.json", leetcodeRustConfig);

修改后的代码如下:

此时再打开题目就能看到代码提示了。

补充:这个方法对没做过的题目(即未创建过文件 )比较有效,如果是打开已存在的文件需要重新加载一下窗口才能生效。

参考资料

相关推荐
yezipi耶不耶1 小时前
用 Rust 带你了解 TCP 和 UDP
tcp/ip·rust·udp
漫路在线3 小时前
JS逆向-某易云音乐下载器
开发语言·javascript·爬虫·python
BillKu4 小时前
Vue3 Element Plus 对话框加载实现
javascript·vue.js·elementui
初遇你时动了情5 小时前
html js 原生实现web组件、web公共组件、template模版插槽
前端·javascript·html
前端小崔6 小时前
从零开始学习three.js(18):一文详解three.js中的着色器Shader
前端·javascript·学习·3d·webgl·数据可视化·着色器
运维@小兵6 小时前
vue配置子路由,实现点击左侧菜单,内容区域显示不同的内容
前端·javascript·vue.js
GISer_Jing7 小时前
[前端高频]数组转树、数组扁平化、深拷贝、JSON.stringify&JSON.parse等手撕
前端·javascript·json
古拉拉明亮之神7 小时前
Spark处理过程-转换算子
javascript·ajax·spark
勇敢牛牛_8 小时前
使用Rust开发的智能助手系统,支持多模型、知识库和MCP
ai·rust·rag·mcp
岁岁岁平安8 小时前
Vue3学习(组合式API——Watch侦听器、watchEffect()详解)
前端·javascript·vue.js·学习·watch侦听器·组合式api