Those few recipes illustrate the logic of using bacon, and may serve as inspiration for your own practices.
Tell me about your recipes so that I may share them there.
Jump to location in neovim
With the nvim-bacon plugin, you can navigate between errors and warnings without leaving nvim, just hitting a key.
Open your lib's doc
Let's first assume your bacon.toml
file has been generated by a recent version of bacon.
Then you can launch bacon on its default task, then when you want to check the doc, hit the d key: as soon as the doc compiles, it's opened in your browser and bacon switches back to the previous job.
If you want to complete an old bacon.toml
file, or just understand how it works, here's the relevant configuration:
The job:
[jobs.doc-open]
command = ["cargo", "doc", "--color", "always", "--no-deps", "--open"]
need_stdout = false
on_success = "back" # so that we don't open the browser at each change
And the key binding:
[keybindings]
d = "job:doc-open"
Configure Clippy lints
Jobs in the bacon.toml
file are specific to your projects, there's no reason not to adapt them for its specificities.
You may for example want to tune the clippy rules:
[jobs.clippy]
command = [
"cargo", "clippy",
"--color", "always",
"--",
"-A", "clippy::collapsible_else_if",
"-A", "clippy::collapsible_if",
"-A", "clippy::field_reassign_with_default",
"-A", "clippy::match_like_matches_macro",
]
need_stdout = false
You may also add some modifiers on spot sessions, eg
bacon clippy -- -W clippy::pedantic
Note that bacon doesn't need to be killed and relaunched when you change the job config.
Check for other platforms
You may define specific jobs for specific targets:
[jobs.check-win]
command = ["cargo", "check", "--target", "x86_64-pc-windows-gnu", "--color", "always"]
An habit I suggest: use alt keybindings for alternative platforms:
[keybindings]
alt-w = "job:check-win"
Run binaries and examples
If you configure a cargo run
job, you'll get the usual warnings and errors until there's none, at which point you'll have the output of your binary (assuming its terminal output is interesting).
[jobs.exs]
command = ["cargo", "run", "--example", "simple", "--color", "always"]
allow_warnings = true
need_stdout = true
You may add on_success = "back"
if you don't want the executable to run again on changes.
The allow_warnings = true
line tells bacon to run the executable even when there are warnings. The excutable's output would come below warnings.
Some libraries and programs test whether they run in a TTY and remove style in such case. Most usually, those applications provide a way to bypass this test with a launch argument. Depending on the desired output, you would have to add a setting to the run job, for example (more on this):
command = ["cargo", "run", "--color", "always", "--", "--color", "yes"]
Long running programs
If your program never stops (e.g. a server), you may set background = false
to have the output of cargo run
immediately displayed instead of waiting for the program's end.
If you want your program to restart at every change, use on_change_strategy = "kill_then_restart"
.
You may also want to change the way your program is killed if it should release resources.
In this case, you can replace the standard interrupution by specifying your own kill
command.
Combining all those changes would give you something like this:
[jobs.webserver]
command = ["cargo", "run", "--color", "always", "--", "--serve"]
need_stdout = true
background = false
on_change_strategy = "kill_then_restart"
kill = ["kill", "-s", "INT"]
Of course you don't have to take them all, depending on your precise case.
Variable arguments
Launch arguments after the --
aren't interpreted by bacon but sent unchanged to the job commands.
This may be useful to add an argument only for one run without changing the bacon.toml
file.
For example
bacon -- --target x86_64-pc-windows-gnu
Be careful that some programs already require --
so you may have to double it.
For example, to run cargo test
with a single thread, you'll need
bacon test -- -- --test-threads=1
Another use case, a job which needs a complementary argument:
[jobs.ex]
command = ["cargo", "run", "--color", "always", "--example"]
need_stdout = true
You would call it with
bacon ex -- example4578