在 vscode 为 leetcode 开启 rust 代码提示

本文最后更新于 2024年10月16日 晚上

最近突然又想刷一些 leetcode 题目了,顺便再练一练 rust,好久不写代码已经手生了。之前在 vscode 的 leetcode 插件刷 rust 题目时,基本没有代码提示与补全,很难受。今天搜到一篇解决这个问题的帖子,感觉很有用,虽然没能完全解决我的问题,但是为我打开了思路。

早期的处理办法

早期我是通过 automod 这个库,将所有 leetcode 代码文件都加入一个项目中,好处是确实有补全了,但是一个文件有问题就可能会破坏补全体验,一片飘红。

我先新建了一个本地仓库,用来存放 rust 代码。放置于

1
2
3
cd ~/Documents/Repository/leetcode/
cargo new rust
cargo add automod

然后我们进入到项目文件夹下,在 src 目录下新建一个目录leetcode, 再创建一个 lib.rs 并加入如下内容:

1
2
3
mod leetcode {
automod::dir!("src/leetcode/");
}

最后将 leetcode 插件的 leetcode.workspaceFolder 指定为 ~/Documents/Repository/leetcode/rust/src/leetcode 即可。

目前的解决办法

在参考了掘金的帖子之后才发现还可以直接去修改插件的代码。因此我也打算直接去改插件代码,动态生成一个 lib.rs 并引用对应题目的代码。顺便给模板加上一个空的 struct Solution 以减少 rust-analyzer 的警告,再加一个 test 模块方便本地测试。只要修改 ~/.vscode/extensions/leetcode.vscode-leetcode-0.18.3/out/src/leetCodeExecutor.js 这个文件即可。

注意: 你需要设置文件名为合法的 Rust模块名, 比如我的是这样设置的。

1
2
3
4
5
6
7
"leetcode.filePath": {

"default": {
"folder": "",
"filename": "lt_${id}.${ext}"
}
},

最终我的 patch 为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
diff --git a/leetCodeExecutor.js b/leetCodeExecutor.js
index b90333e..2d31adb 100644
--- a/leetCodeExecutor.js
+++ b/leetCodeExecutor.js
@@ -109,6 +109,28 @@ class LeetCodeExecutor {
});
}
showProblem(problemNode, language, filePath, showDescriptionInComment = false, needTranslation) {
+ let cargocfg = path.join(path.dirname(filePath), "../lib.rs")
+ let name = path.parse(filePath).name
+ const leetcodeRustConfig = `mod leetcode {
+ mod ${name};
+}`;
+ let extra_codes = `
+#[allow(unused)]
+struct Solution;
+
+#[cfg(test)]
+mod test {
+ use super::*;
+
+ #[test]
+ fn testfun() {
+ //assert_eq!(Solution::myfn(x), y);
+ assert!(true)
+
+ }
+}
+`;
+ fse.writeFile(cargocfg, leetcodeRustConfig);
return __awaiter(this, void 0, void 0, function* () {
const templateType = showDescriptionInComment ? "-cx" : "-c";
const cmd = [yield this.getLeetCodeBinaryPath(), "show", problemNode.id, templateType, "-l", language];
@@ -119,6 +141,7 @@ class LeetCodeExecutor {
yield fse.createFile(filePath);
const codeTemplate = yield this.executeCommandWithProgressEx("Fetching problem data...", this.nodeExecutable, cmd);
yield fse.writeFile(filePath, codeTemplate);
+ yield fse.appendFile(filePath, extra_codes)
}
});
}

现在终于可以愉快地刷题啦(虽然我只能对简单题重拳出击)。

参考资料

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

在 vscode 为 leetcode 开启 rust 代码提示
https://blog.askk.cc/2024/08/23/write-rust-in-vscode-leetcode/
作者
sukanka
发布于
2024年8月23日
许可协议