你好
喜欢插件。 确实注意到我相当确定是一个错误:
我有一个 rustfmt.toml
fn_args_density = "Compressed"
在其中,当我在似乎可以工作的命令行上运行 rustfmt 时,但是当从 VS Code 运行时,它将使用默认的“Tall”行为。 这是插件的 0.2.2 版。
您的 rustfmt.toml 是否适用于最新的 rustfmt-nightly? 我们确实明确地寻找 rustfmt.toml,所以这应该可以工作,但您可能遇到了错误。
看起来确实如此,运行rustup show
表示我每晚都在,然后cargo fmt
会产生正确的结果,而 VS Code 中的格式会撤消它
Rust 版本没有链接到 rustfmt 版本。 尝试运行rustfmt --version
,您应该会看到类似nightly-0.2.2
啊,是的,我的错。 正是如此。 我一定有一个旧版本。 如果我有一个目录覆盖设置来应用它似乎也不适用于运行 rustfmt 裸机,它会在我更新它后抱怨缺少 dll。 不过,使用“rustup run nightly”运行它效果很好。 不过,我原来的问题不存在,两种方式都是一致的。 谢谢!
事实上,我要翻牌了。 他们似乎有分歧。 此代码由 vscode 插件按原样保留:
let mut get_siz = || {
sizer.ind_sample(&mut rng).abs().max(scaler / 30.0).min(scaler / 2.0) as f32
};
长线是> 80 cols。
但是这个:
>rustup run nightly rustfmt src\dungeongen\rooms.rs
>rustup run nightly rustfmt -V
0.2.2-nightly ( )
结果是:
let mut get_siz = || {
sizer
.ind_sample(&mut rng)
.abs()
.max(scaler / 30.0)
.min(scaler / 2.0) as f32
};
使用此配置:
max_width = 80
tab_spaces = 2
fn_args_density = "Compressed"
fn_single_line = true
single_line_if_else_max_width = 70
实际上,在输入完所有内容后,我只是放入了一些随机空格,似乎根本没有格式化,我认为这不是更早发生的,所以我现在不知道为什么会出错。 问题选项卡中没有任何错误。 对不起,糟糕的错误报告。
我有这个问题。
$ rustfmt --version
0.9.0-nightly ( )
当我运行cargo fmt -- --write-mode=overwrite
,它尊重Cargo.toml
并且不会在结构中的字段旁边放置注释。
当我保存在 VS Code 中时,它似乎忽略了rustfmt.toml
。 VS Code 使用哪个版本? 我会假设它与夜间工具链是我的默认工具链相同。
我也有这个问题。 cargo fmt
尊重rustfmt.toml
,但 VSCode Format Document
没有。
我使用的是 macOS 10.12.6
VSCode 版本为 1.17.0
Rust (rls) 版本是 0.3.1
$ cargo fmt -- --version
0.2.8-nightly ( )
我也有同样的问题,rustfmt 忽略 rustfmt.toml
我在这里看到同样的事情,vscode 似乎不尊重rustfmt.toml
而cargo fmt -- --write-mode=overwrite
尊重。
版本:
$ cargo fmt -- --version
0.6.2 ()
@dvdplm您正在使用rustfmt
的旧版本。 如果你想比较 rustfmt 和 rls 的格式,你需要使用rustfmt-nightly
板条箱。
@jonasbb谢谢,我错过了。 然而,即使rustfmt-nightly
在正确的版本中,VSCode 的问题仍然存在。 :/
我在 Eclipse Rust 腐蚀插件中看到了类似的问题。 如果它有帮助,在我的情况下它似乎是由rls
rustfmt
从用户的主目录而不是项目根目录启动rustfmt
尝试加载$HOME/.rustfmt.toml
而不是/path/to/cargo_project/.rustfmt.toml
这应该在 VSCode 方面得到修复,因为我们总是在工作区方面产生 RLS,但是 RLS 本身可能需要考虑 rootUri 而不是 cwd。
我似乎仍然有这个问题(我正在使用rustfmt-nightly
)。
对于它的价值,我仍然看到了这一点,我尝试了rustfmt.toml
和.rustfmt.toml
在 vscode 中启用保存格式化时似乎都没有被 rls 接收。 当我运行cargo +nightly fmt -- --emit=files
一切都按预期工作:指定:。
$ rustfmt --version
rustfmt 1.4.9-nightly (33e3667 2019-10-07)
$ rls --version
rls 1.38.0 (7b0a20b 2019-08-11)
rls-vscode:0.7.0
我不完全确定到底发生了什么,但希望得到一些关于如何解决这个特定问题的指导。
我目前的解决方法是编辑settings.json
:
"rust.rustfmt_path": "~/.cargo/bin/rustfmt"
如果有任何问题,用${env.HOME}
替换~
可能会有所帮助。 在 macOS 上这是有效的。
FWIW,我花了一天时间解决这个问题,并学到了一些东西:
child_process.execSync
的路径是/
/
运行 rustfmt 它不会获取 rustfmt.toml例如:
cd /full/path/to/rust
cat /full/path/to/rust/file.rs | rustfmt
# formatted rust that uses rustfmt.toml
cd /
cat /full/path/to/rust/file.rs | rustfmt
# default formatted rust
我一直在玩这个扩展并将项目目录添加到child_process.execSync
为我解决了这个问题:
function getFormattedString(doc: vscode.TextDocument): string {
+ const documentUri = vscode.Uri.parse(doc.fileName);
+ const workspaceDir = vscode.workspace.getWorkspaceFolder(documentUri);
return child_process.execSync("rustfmt", {
encoding: 'utf-8',
input: doc.getText(),
+ cwd: workspaceDir.uri.fsPath,
}).toString();
}
我意识到这是一个完全不同的项目,但这是搜索结果中出现的内容,所以也许它会对某人有所帮助。
我仍然在 3/21 看到这个。
最有用的评论
对于它的价值,我仍然看到了这一点,我尝试了
rustfmt.toml
和.rustfmt.toml
在 vscode 中启用保存格式化时似乎都没有被 rls 接收。 当我运行cargo +nightly fmt -- --emit=files
一切都按预期工作:指定:。rls-vscode:0.7.0
我不完全确定到底发生了什么,但希望得到一些关于如何解决这个特定问题的指导。