Language server
Completion, hover, go-to-definition, references, rename, and inlay hints — live in your editor.
Language serverthree tools, one binary
Built for R users who have outgrown RStudio: editor smarts, problem-catching analysis, and one consistent style from a single binary. R has world-class statistics — Roughly brings the IDE-grade tooling other ecosystems already take for granted, fast enough to scale past 300k lines.
Completion, hover, go-to-definition, references, rename, and inlay hints — live in your editor.
Language serverLint diagnostics on by default — plus the first static type checker for R, opt-in.
Type checkerroughly fmt rewrites your whole project to one consistent style, with a --diff mode for CI.
Formatterwrite
One server behind every editor feature — complete a record's fields, hover a name for its inferred signature, jump to where it is bound, rename it everywhere at once. Extensions for VS Code and Zed, plain LSP for the rest.
Language server docs Also: signature help, document and workspace symbols, folding ranges, semantic
highlighting of #: annotations, and format-on-save.
check
roughly check lints out of the box. Switch the type checker on and it
reads your code the way a compiler would — and since inference runs whether or not you
annotate anything, it catches the mistake either way.
# roughly: allow(...) comment. exit 1 fee_rate wants the region, not the amount. Annotations live in #: comments — ordinary comments to R and to every other tool you run. exit 1 numeric bound alone rejects the string. exit 1 Type checker guide Linter rules Type checking is opt-in; lints are not. roughly check reads
.R plus the R chunks of .Rmd, .qmd and
.Rnw files.
ship
roughly fmt is deliberately non-invasive. It fixes spacing, braces and
indentation, and it never splits a line you chose to keep on one line. Run it across
the project, or use --diff in CI.
$ roughly fmt --diff totals.R 1 file would be reformatted, 0 files already formatted $ roughly fmt --diff regions.R Braces go in wherever leaving them out could change what runs. $ roughly fmt --diff options.R Every argument snaps to one indent step. Your line breaks are kept. $ roughly fmt --diff pricing.R Annotations are re-rendered with the type checker's own grammar. Anything it cannot parse is left byte-for-byte alone. Formatter docs --check and --diff exit 1 when a file would change, so CI
stays honest. # fmt: skip and # fmt: off opt code out.
adopt
Nothing about your existing R has to change. Install the VS Code extension in one click — no toolchain required — or grab the CLI and point Roughly at your project.
# install the CLI
cargo install --git https://github.com/felix-andreas/roughly roughly
# format, lint, and type-check
roughly fmt .
roughly check . Grab the VS Code extension from the Marketplace, then tune behavior in configuration.