Vscode-rust: rustfmt.toml 不受尊重?

创建于 2017-08-23  ·  18评论  ·  资料来源: rust-lang/vscode-rust

你好

喜欢插件。 确实注意到我相当确定是一个错误:

我有一个 rustfmt.toml

fn_args_density = "Compressed"

在其中,当我在似乎可以工作的命令行上运行 rustfmt 时,但是当从 VS Code 运行时,它将使用默认的“Tall”行为。 这是插件的 0.2.2 版。

最有用的评论

对于它的价值,我仍然看到了这一点,我尝试了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

我不完全确定到底发生了什么,但希望得到一些关于如何解决这个特定问题的指导。

所有18条评论

您的 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.tomlcargo 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。

打开https://github.com/rust-lang/rls/issues/1418进行跟踪。

我似乎仍然有这个问题(我正在使用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,我花了一天时间解决这个问题,并学到了一些东西:

  • 一个 vscode 扩展认为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 看到这个。

此页面是否有帮助?
0 / 5 - 0 等级