-
-
Notifications
You must be signed in to change notification settings - Fork 2.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Formatter doesn't have access to filename #3596
Comments
Previously #2942 did implement passing a file path to the formatter, but it was removed since stdin was deemed sufficient. Maybe this use case will change things. |
I have a similar issue too which would be solved if there was a way to pass in the filename to the formatter command. |
I also have this issue with prettier. Not sure how to get it to format correctly |
You can manually specify the parser for prettier to use to avoid needing the file name, see https://prettier.io/docs/en/options.html#parser. E.g.: [[language]]
name = "typescript"
auto-format = true
formatter = { command = "prettier", args = ["--parser", "typescript"] } |
@Anthuang this is hard to use, because the cli programmer know better than you. we can not count on a hard coded config to manual calculate the parser to use. this is bad. |
I got this problem too. I think provide the full path filename to the formatter is very important. some formatters need the full file path to help with location a config in the project ( in neovim we can use for example:
require("formatter").setup {
filetype = {
javascript = {
-- prettier
function()
return {
exe = "prettier",
args = { "--stdin-filepath", vim.api.nvim_buf_get_name(0), "--single-quote" },
stdin = true,
}
end,
},
lua = {
-- stylua
function()
return {
exe = "stylua",
args = { "--search-parent-directories", "--stdin-filepath", vim.api.nvim_buf_get_name(0), "-" },
stdin = true,
}
end,
},
}
} |
Just adding a +1 to this as a Rubocop user. Without a filename, it's impossible to properly configure rules that only apply to (or are only excepted from) certain files and/or directories. |
Add support for a current file placeholder in formatter arguments. This should make it possible to run custom formatters, such as `rome` (Typescript), `rustfmt` (Rust) and more. The changes take inspiration from f7ecf9c and acdce30, but instead of adding a new field to the formatter struct, it works by looking for a predefined placeholder (`{}`), which should be replaced, if found. This should allow for better control over arguments of formatters, allowing both giving it as a standalone arg (`"{}"`) and as part of one (ie `"--src-file={}"`). The placeholder, `{}`, is used since it is common, Rust using it frequently. Closes: helix-editor#3596 Signed-off-by: Filip Dutescu <[email protected]>
Add support for a current file placeholder in formatter arguments. This should make it possible to run custom formatters, such as `rome` (Typescript), `rustfmt` (Rust) and more. The changes take inspiration from f7ecf9c and acdce30, but instead of adding a new field to the formatter struct, it works by looking for a predefined placeholder (`{}`), which should be replaced, if found. This should allow for better control over arguments of formatters, allowing both giving it as a standalone arg (`"{}"`) and as part of one (ie `"--src-file={}"`). The placeholder, `{}`, is used since it is common, Rust using it frequently. Closes: helix-editor#3596 Signed-off-by: Filip Dutescu <[email protected]>
Add support for a current file placeholder in formatter arguments. This should make it possible to run custom formatters, such as `rome` (Typescript), `rustfmt` (Rust) and more. The changes take inspiration from f7ecf9c and acdce30, but instead of adding a new field to the formatter struct, it works by looking for a predefined placeholder (`{}`), which should be replaced, if found. This should allow for better control over arguments of formatters, allowing both giving it as a standalone arg (`"{}"`) and as part of one (ie `"--src-file={}"`). The placeholder, `{}`, is used since it is common, Rust using it frequently. Closes: helix-editor#3596 Signed-off-by: Filip Dutescu <[email protected]>
Add support for a current file placeholder in formatter arguments. This should make it possible to run custom formatters, such as `rome` (Typescript), `rustfmt` (Rust) and more. The changes take inspiration from f7ecf9c and acdce30, but instead of adding a new field to the formatter struct, it works by looking for a predefined placeholder (`{}`), which should be replaced, if found. This should allow for better control over arguments of formatters, allowing both giving it as a standalone arg (`"{}"`) and as part of one (ie `"--src-file={}"`). The placeholder, `{}`, is used since it is common, Rust using it frequently. Closes: helix-editor#3596 Signed-off-by: Filip Dutescu <[email protected]>
|
eslint cannot format without stdin-filename |
I think this might be more generally-solved by #7105 Or, perhaps, a similar approach to that issue: where there is a general value placeholder system, and an initially-fixed set of values we can refer to from within the TOML configuration file, etc |
I've encountered two cases where this would be useful:
|
I'm using this as a workaround. formatter = { command = "sh", args = ["-c", """
file=$(
ps -p "${PPID}" -o "command=" \
| awk '{ print $NF }'
)
exec prettier \
--stdin-filepath="${file}" \
--config-precedence=file-override
"""] } |
@tynanbe that will only work if you ran FWIW, using |
@rcorre, indeed, I haven't tested that use case, but I personally don't use Helix in that way, so not a problem for me 😄 |
still no formatting with stylua, check helix-editor/helix#3596
Usually for
While |
@71GA you can use plain [[language]]
name = "protobuf"
formatter = { command = "clang-format" , args = ["--assume-filename=a.proto"]} It was specifically clang-format-diff (for partially formatted codebases) that I struggled with. |
To address the original issue, it is possible to create a custom language block for a specific set of files. This can be done by adding the following block to your languages.toml file: [[language]]
name = "package.json" # this can be set to any string that doesn't conflict with other language names
scope = "source.json"
roots = ["package.json"]
file-types = ["package.json", "package-lock.json", "composer.json"]
formatter = { command = "npx", args = ["prettier", "--stdin-filepath", "package.json"] }
language-servers = ["vscode-json-language-server"]
auto-format = true
grammar = "json" To get syntax highlighting to work, you also need to copy (or symlink) the This seems like the cleanest workaround for now (to me), but I agree that it would be best if helix supported passing the filename to the formatter. |
I have the same problem in Python with Ruff when trying to sort imports. |
+1 |
This is a mandatory feature, especially when the formatter config file is not at the root. |
@akhansari pestering the maintainers isn’t going to motivate anyone to get it done. If you feel it’s important it might be wise to focus your efforts on writing a PR instead. |
Just got mugged... @zjr It wasn't my intention. I wanted to contribute by giving a feedback as a user and to highlight the importance of this feature for formatters usually based on local config files. Nothing else. And if I had enough time and if I knew rust well, it would have been with pleasure. Could you please give the benefit of doubt next time and not make hasty conclusions. It's toxical for the community. |
Resharper command line tools https://www.jetbrains.com/help/rider/CleanupCode.html and Csharpier https://csharpier.com/docs/CLI Also, a file path or a solution file is required when working with C#. |
from 2022 to now, been almost 2 years, I do not know why this has not been resolved? If the dev team does not support this feature, then just close this issue is better. If does, someone can fire a PR |
Is this the problem I have with lua? I have tried:
|
In cases like this you can often use a fake filename. For example, prettier uses the filename to determine the filetype, but in most cases only really cases about the ending, so you can do (It's not perfect: if the formatter has different rules based on the real path then you can't solve that this way AFAIK.) |
It gives me the error: 2024-07-19T19:10:00.041 helix_view::document [ERROR] Formatter error: error: no files provided |
It's covered under their readme https://github.com/JohnnyMorganz/StyLua?tab=readme-ov-file#usage It should be |
Thank you! So what works is: |
I have another use case for giving access to the filename to the formatter. In Python we can have stub files with the formatter = { command = "bash", args = ["-c", "ruff format --quiet -"] } But since the files are just passed to I'd be willing to give it a shot and open a PR, unless the maintainers do not want this feature implemented? I would love to have just an OK from a maintainer before I start spending time on this :) |
#2942 added
formatter
option, which is very useful.I used it prettier but quickly discovered that I have conflicting formatting between CI and my editor.
This happens because prettier change formatting based on filename, e.g.
package.json
formatted withjson-stringify
but other*.json
files formatted withjson
parser.https://github.com/prettier/prettier/blob/2316e2fecd171335fc00f3ec97b7e46cc8964153/src/language-js/index.js#L81-L94
To solve this use case, prettier provides --stdin-filepath, but I can't use it in helix since there is no way to pass the filename into
fomatter
option.Having a placeholder of some kind would be great, e.g.
$filename
.The text was updated successfully, but these errors were encountered: