API changes
-
new R option
styler.cache_root
(defaulting to"styler"
) that determines the sub-directory under the {R.cache} cache directory that {styler} uses. Non- default caches won't be cleaned up by {styler}. We suggest"styler-perm"
(also used by {precommit}). -
stylerignore markers are now interpreted as regular expressions instead of comments that must match exactly. This allows to specify multiple markers in one regular expression for
styler.ignore_start
andstyler.ignore_stop
, e.g. to use markers for lintr and styler on the same line, you can useoptions(styler.ignore_start = "nolint start|styler: off"
:# nolint start, styler: off 1 +1 # nolint end # styler: on
As a consequence of this approach, the defaults for
styler.ignore_start
andstyler.ignore_stop
omit the#
(#849).
Other changes
.onLoad()
method no longer broken with {cli} >= 3.1 (#893).- Piped function without brackets
substitute(x %>% y)
don't get()
added anymore for one level deep (not more yet, see #889), as this can change outcome of the code (#876). - rules that add tokens don't break stylerignore sequences anymore (#891).
- Function calls containing
+
should no longer give any error on styling when there are comments and line breaks under certain circumstances (#905). - Add vignette on distributing style guide (#846, #861).
- Alignment detection respects stylerignore (#850).
Warning: Unknown or uninitialised column:
was fixed (#885).- Unaligned expressions with quoted key (e.g.
c("x" = 2)
) are now correctly detected (#881). - function calls with unequal number of token on different lines are no longer deemed aligned if there are arbitrary spaces around the tokens on the lines with most tokens (#902).
- ensure a trailing blank line also if the input is cached (#867).
- Preserve trailing blank line in roxygen examples to simplify concatenation of examples (#880).
- added guarantee that styled code is parsable (#892).
- An error is now thrown on styling if input unicode characters can't be correctly parsed for Windows and R < 4.2 (#883).
- Fix argument name
filetype
in Example forstyle_dir()
(#855).
Infrastructure
- Remove dependency on {xfun} (#866).
- Bump minimal R requirement to 3.4 in line with the tidyverse, which allowed to remove the dependency at {backports} and some exception handling.
- rename default branch to main (#859).
- the built package size has been reduced by ~50% by listing
*-in_tree
files in.Rbuildignore
(#879). - Enable pre-commit.ci (#843).
- use pre-commit via GitHub Actions (#872).
- terminate running jobs on new push to save resources (#888).
- Use the {touchstone} GitHub Action instead of the literal script (#889).
- upgrade R CMD check Github Actions to use
v2
.
- clean up cache files older than one week (#842).
-
Files with
.Rmarkdown
extension are now recognized as an R markdown files instyle_file()
and friends (#824). -
Don't break line before comments in pipes (#822).
-
Ordinary comments (starting with
#
) that break a roxygen code example block (starting with#'
) are now recognized and preserved (#830). -
@examplesIf
conditions longer than one line after styling throw an error for compatibility with {roxygen2} (#833). -
R Markdown chunk headers are no longer required to be parsable R code (#832).
-
Break the line between
%>%
and{
inside and outside function calls (#825). -
Add language server to third-party integration vignette (#835).
-
improved test setup with fixtures and similar (#798).
We'd like to thank all people who helped making this release possible:
@bersbersbers, @eutwt, @IndrajeetPatil, @j-mammen, @jennybc, @JohannesNE, @jonkeane, @lorenzwalthert, and @MichaelChirico.
-
Code with left alignment after
=
in function calls is now recognized as aligned and won't be reformatted (#774, #777).# already detected previously call( x = 12345, y2 = 17 ) # newly detected call( x = 12345, y2 = 17 )
-
Similarly, left aligned after comma is now detected (#785, #786).
# previously detected call( x = 12345, "It's old", y2 = 17, "before" ) tribble( ~x, ~y, "another", 1:3, "b", 1211234 ) # newly detected call( x = 2, p = "another", y = "hhjkjkbew", x = 3 ) tribble( ~x, ~y, "another", 1:3, "b", 1211234 )
Also see
vignette("detect-alignment")
.
- The base R pipe as introduced in R 4.1.0 is now styled the same way the magrittr pipe is (#803).
- code chunks with explicit
tidy = FALSE
in an Rmd or Rnw code header are not styled anymore. This can be handy when the code can't be parsed, e.g. within a learnr tutorial (#790). #>
is recognized as an output marker and no space is added after#
(#771).
- No curly braces are added to else statements if they are within a pipe, as this can change evaluation logic of code involving the magrittr dot in rare cases (#816).
- Line breaks between
}
andelse
are removed (#793). - In function calls, code after
= #\n
is indented correctly (#814). - Multi-expressions containing multiple assignments no longer remove line breaks if they are not causing blank lines (#809).
exclude_dirs
instyle_pkg()
is now properly respected if it is a sub-directory of a directory that is scheduled for styling (e.g.test/testthat/some/dir
) (#811).- The user is not prompted anymore to confirm the creation of a permanent cache as R.cache >= 0.15.0 uses a standard location in line with CRAN policies (#819).
- R code chunks in nested non-R chunks in R markdown don't yield an error anymore when document is styled, chunks are still not styled (#788, #794).
cache_activate()
andcache_deactivate()
now respect the R optionstyler.quiet
(#797).multi_line
attribute in parse table is now integer, not boolean (#782).- The style guide used in Addin is verified when set via R option (#789).
- Improve pkgdown author URLs (#775).
- Upgrade touchstone infra (#799, #805).
- Don't test on R 3.3 anymore as tidyverse supports only four previous releases (#804).
- Update Github Actions workflow (#810).
We’d like to thank everyone who has furthered the development of the latest release of styler through their contributions in issues and pull requests:
@ardydavari, @gadenbuie, @IndrajeetPatil, @jasonhan-vassar, @laresbernardo, @lorenzwalthert, @MichaelChirico, @Moohan, @njtierney, @pat-s, @psychelzh, @pvalders, @RoyalTS, and @russHyde.
- fix interaction between cache and
base_indention
. This also fixes the Addin for styling a selection with base indention repeatedly (#764). - add more examples to
styler_*
helpfiles (#762). - hexadecimal integers now preserve the trailing
L
when styled (#761). - add a pre-push hook to make sure news bullets are added to each PR (#765).
Thanks to everyone who contributed to this release:
@krlmlr, @lorenzwalthert, and @renkun-ken.
new
-
style_file()
and friends gain argumentdry
to control if changes should be applied to files or not (#634). -
style_file()
and friends gain argumentbase_indention
(defaulting to 0) to control by how much the output code is indented (#649, #692). The Addin for styling a selection picks that up, e.g. you can style a function body and indention is preserved (#725). -
added an option for disabling all communication when using the package (
styler.quiet
) (#640). -
scope
intidyverse_style()
can now be specified with higher granularity throughI()
, e.g.I(c('spaces', 'tokens'))
allows us to style spaces and tokens without styling line breaks and indention. Previously, only a string was allowed and all less invasive scopes were included, e.g. if you wanted to style tokens, you had to always also style spaces, indention, line breaks as well (#705, #707). -
added an option (
styler.test_dir_writeable
) that changes test behavior to not directly modify test files in the current directory (#548). -
New argument
transformers_drop
increate_style_guide()
to be populated with new helper functionspecify_transformers_drop()
for specifying conditions under which transformers are not going to be used and can therefore be omitted without effecting the result of styling (#711).
deprecated
- The environment variable
save_after_styling
is deprecated in favor of the R optionstyler.save_after_styling
to control if a file is saved after styling with the RStudio Addin. Note than in RStudio >= 1.3.0, you can auto-save edits in general (Code -> Saving -> Auto-Save), e.g. on idle editor or focus loss, so this feature becomes less relevant (#631, #726).
-
styler is now distributed under the MIT license (#751).
-
Documentation overhaul: New README, new "Get started" pkgdown page, new vignettes on
strict = FALSE
,Adoption
renamed toThird-party integrations
(#741), adding search to pkgdown (#623), group functions in pkgdown reference page (#625), minor other doc improvements (#643, #618, #614, #677, #651, #667, #672, #687, #752, #754). -
@exampleIsf
roxygen tag for conditional examples is now supported (#743). -
blank lines in function calls and headers are now removed, for the former only when there are no comments before or after the blank line (#629, #630, #635, #723).
-
speed improvements: 15% faster on new code, 70% on repeated styling of compliant code (The latter is not so relevant because it was almost instantaneous already). Most relevant contributions were #679, #691, #681, #711, #739.
-
#<<
is now recognized as the xaringan marker and no space is added after#
(#700).
-
style_dir()
andstyle_pkg()
now apply directory exclusion recursively withexclude_dirs
(#676). -
switch()
now has line breaks after every argument to match the tidyverse style guide (#722, #727). -
unary
+
before a function call does not give an error anymore, as before version 1.3.0 (#697). -
certain combinations of
stylerignore
markers and cached expressions now don't give an error anymore (#738). -
cache is now correctly invalidated when style guide arguments change (#647).
-
empty lines are now removed between pipes and assignments (#645, #710).
-
multiple
@examples
roxygen tags in a code block of#'
are no longer squashed (#748). -
roxygen code examples starting on the same line as the
@examples
tag are no longer moved to the next line (#748). -
always strip trailing spaces and make cache insensitive to it (#626).
-
style_text()
can now style all input thatis.character()
, not just if it inherits from classescharacter
,utf8
orvertical
(#693). -
logical operators within square braces are now moved from the start of a line to the end of the previous line (#709).
-
spaces are now removed before
[
and[[
(#713). -
The internal
create_tree()
only used in testing of styler now works when the cache is activated (#688). -
simplification of internals (#692).
-
switched from travis and AppVeyor to GitHub Actions (#653, #660).
-
Added basic continuous benchmarking with lorenzwalthert/touchstone (#674, #684, #698).
-
include
test-*
files in styling pre-commit hook (#724).
Thanks to all the people who made this release possible:
@assignUser, @ColmanHumphrey, @davidchall, @espinielli, @giko45, @hadley, @IndrajeetPatil, @intiben, @jamespeapen, @jthomasmock, @Kalaschnik, @kevinushey, @krlmlr, @lcolladotor, @MichaelChirico, @michaelquinn32, @mine-cetinkaya-rundel, @pat-s, @PMassicotte, @QuLogic, @renkun-ken, @RichardJActon, @seed-of-apricot, @select-id-from-users, @SimonDedman, @stefanoborini, @swsoyee, and @Winterstorm-j.
Release upon request by the CRAN team.
- Add search and reference sections to pkgdown webpage (#623, #625).
- various fixes to handle special cases for caching and stylerignore and their interaction (#611, #610, #609, #607, #602, #600).
- also test on macOS (#604).
- skip timing tests on CRAN as requested by CRAN team because they did not pass on all machines (#603).
Emergency release. In case multiple expressions are on one line and only some of them are cached, styler can remove code. To reach this state, some of the expressions must have been styled previously alone and the cache must be active. Example:
library(styler)
cache_activate()
#> Using cache 1.3.0 at ~/.Rcache/styler/1.3.0.
style_text("1")
#> 1
style_text("1 # comment")
#> # comment
This is obviously detrimental. We have added additional tests and fixed the
problem (#593, #595), but we want repeat the warning from ?style_file
that all
style APIs apart from style_text()
overwrite code and that styler can only
check the AST remains valid with scope < "tokens"
. So use this if you are
conservative. Or deactivate the cache with deactivate_cache()
until it has
fully matured.
We thank the people who have contributed to this release:
@ellessenne and @renkun-ken.
-
style_pkg()
andstyle_dir()
gain a new argumentexclude_dirs
to exclude directories from styling, by defaultrenv
andpackrat
. Note that the defaults won't change the behavior ofstyle_pkg()
because it does anyways does not style these directories and they were set for consistency. -
style_file()
and friends now strip./
in file paths returned invisibly, i.e../script.R
becomesscript.R
(#568).
-
ignore certain lines using
# styler: off
and#styler: on
or custom markers, see?stylerignore
(#560). -
styler caches results of styling, so applying styler to code it has styled before will be instantaneous. This brings large speed boosts in many situations, e.g. when
style_pkg()
is run but only a few files have changed since the last styling or when using the styler pre-commit hook. Because styler caches by expression, you will also get speed boosts in large files with many expressions when you only change a few of them. See?caching
for details (#538, #578). -
create_style_guide()
gains two argumentsstyle_guide_name
andstyle_guide_version
that are carried as meta data, in particular to version third-party style guides and ensure the proper functioning of caching. This change is completely invisible to users who don't create and distribute their own style guide liketidyverse_style()
(#572).
-
lines are now broken after
+
inggplot2
calls forstrict = TRUE
(#569). -
function documentation now contains many more line breaks due to roxygen2 update to version 7.0.1 (#566).
-
spaces next to the braces in subsetting expressions
[
and[[
are now removed (#580). -
Adapt to changes in the R parser to make styler pass R CMD check again. (#583).
Thanks to all contributors involved, in particular @colearendt, @davidski, @IndrajeetPatil, @pat-s, and @programming-wizard.
-
style_file()
now correctly styles multiple files from different directories. We no longer display the file name of the styled file, but the absolute path. This is also reflected in the invisible return value of the function (#522). -
style_file()
and friends do not write content back to a file when styling does not cause any changes in the file. This means the modification date of styled files is only changed when the content is changed (#532).
-
Aligned function calls are detected and remain unchanged if they match the styler definition for aligned function calls (#537).
-
curly-curly (
{{
) syntactic sugar introduced with rlang 0.4.0 is now explicitly handled, where previously it was just treated as two consecutive curly braces (#528). -
style_pkg()
,style_dir()
and the Addins can now style.Rprofile
, and hidden files are now also styled (#530).
-
Roxygen code examples: leverage
roxygen2
for correct escaping of expressions that contain\
, in particular indontrun{}
and friends, allow quoted braces that are not matched (#729). -
Brace expressions in function calls are formatted in a less compact way to improve readability. Typical use case:
tryCatch()
(#543). -
Arguments in function declarations in a context which is indented multiple times should now be correct. This typically affects
R6::R6Class()
(#546). -
Escape characters in roxygen code examples are now correctly escaped (#512).
-
Special characters such as
\n
in strings are now preserved in text and not turned into literal values like a line break (#554). -
Style selection Addin now preserves line break when the last line selected is an entire line (#520).
-
Style file Addin can now properly handle cancelling (#511).
-
The body of a multi-line function declaration is now indented correctly for
strict = FALSE
and also wrapped in curly braces forstrict = TRUE
(#536). -
Advice for contributors in
CONTRIBUTING.md
was updated (#508).
- styler is now available through the pre-commit hook
style-files
in https://github.com/lorenzwalthert/pre-commit-hooks.
Thanks to all contributors involved, in particular
@Banana1530, @batpigandme, @cpsievert, @ellessenne, @Emiller88, @hadley, @IndrajeetPatil, @krlmlr, @lorenzwalthert, @lwjohnst86, @michaelquinn32, @mine-cetinkaya-rundel, @Moohan, @nxskok, @oliverbeagley, @pat-s, @reddy-ia, and @russHyde
This is primarily a maintenance release upon the request of the CRAN team (#490).
-
Users can now control style configurations for styler Addins (#463, #500), using the
Set style
Addin. See?styler::styler_addins
for details. -
return()
is now always put in braces and put on a new line when used in a conditional statement (#492). -
%>%
almost always causes a line break now forstrict = TRUE
(#503).
-
style_pkg()
now also styles the "demo" directory by default (#453). -
multi-line strings are now styled more consistently (#459).
-
indention in roxygen code example styling (#455) and EOF spacing (#469) was fixed.
-
indention for for loop edge case (#457) and comments in pipe chain (#482) were fixed.
-
line-break styling around comma is improved (#479).
-
bug that can cause an error when the variable
text
in any name space before styler on the search path was defined and did not have length 1 is fixed (#484). -
slightly confusing warning about empty strings caused with roxygen code examples and Rmd was removed.
-
right apostrophe to let package pass R CMD Check in strict Latin-1 locale was removed (#490, reason for release).
Since it's never been mentioned in the release notes, we also mention here where else you can use styler functionality:
-
usethis::use_tidy_style()
styles your project according to the tidyverse style guide. -
reprex::reprex(style = TRUE)
to prettify reprex code before printing. To permanently usestyle = TRUE
without specifying it every time, you can add the following line to your.Rprofile
(viausethis::edit_r_profile()
):options(reprex.styler = TRUE)
. -
you can pretty-print your R code in RMarkdown reports without having styler modifying the source. This feature is implemented as a code chunk option in knitr. use
tidy = "styler"
in the header of a code chunks (e.g.```{r name-of-the-chunk, tidy = "styler"}
), orknitr::opts_chunk$set(tidy = "styler")
at the top of your RMarkdown script. -
pretty-printing of drake workflow data frames with
drake::drake_plan_source()
. -
Adding styler as a fixer to the ale Plug-in for VIM.
Thanks to all contributors involved, in particular @ArthurPERE, @hadley, @igordot, @IndrajeetPatil, @jackwasey, @jcrodriguez1989, @jennybc, @jonmcalder, @katrinleinweber, @krlmlr, @lorenzwalthert, @michaelquinn32, @msberends, @raynamharris, @riccardoporreca, @rjake, @Robinlovelace, @skirmer, @thalesmello, @tobiasgerstenberg, @tvatter, @wdearden, @wmayner, and @yech1990.
This release introduces new features and is fully backward-compatible. It also adapts to changes in the R parser committed into R devel (#419).
-
styler can now style roxygen code examples in the source code of package (#332) as well as Rnw files (#431).
-
the print method for the output of
style_text()
(print.vertical()
) now returns syntax-highlighted code by default, controllable via the optionstyler.colored_print.vertical
(#417). -
the README was redesigned (#413).
-
semi-colon expression that contained multiple assignments was fixed (#404).
-
cursor position is remembered for styling via Addin (#416).
-
adapt spacing around tilde for multi-token expressions(#424) and brace edge case (#425).
-
only add brackets to piped function call if RHS is a symbol (#422).
-
increase coverage again to over 90% (#412).
-
move rule that turns single quotes into double quotes to token modifier in `tidyverse_style_guide() (#406).
-
remove line-breaks before commas (#405).
-
removed package dependency enc in favor of xfun (#442).
Thanks to all contributors for patches, issues and the like: @jonmcalder, @krlmlr, @IndrajeetPatil, @kalibera, @Hasnep, @kiranmaiganji, @dirkschumacher, @ClaytonJY, @wlandau, @maurolepore
This is a maintenance release without any breaking API changes.
-
Fixed indention for named multi-line function calls (#372).
-
Non-R code chunks in
.Rmd
files are now respected and won't get styled (#386).
-
Fixing an edge case in which, if very long strings were present in the code, tokens could be replaced with wrong text (#384).
-
Spacing around tilde in formulas depends now on whether there is a LHS in the formula (#379).
-
Spaces are now also added around
EQ_SUB
(=
) (#380). -
Added
CONTRIBUTING.md
to outline guidelines for contributing to styler. -
More informative error messages for parsing problems (#401, #400).
-
Improved documentation (#387).
Thanks to all contributors for patches, issues and the like: @katrinleinweber, @krlmlr, @dchiu911, @ramnathv, @aedobbyn, @Bio7, @tonytonov, @samhinshaw, @fny, @vnijs, @martin-mfg, @NGaffney, @dchiu911.
This is a maintenance release without any breaking API changes.
-
Removed implicit
dplyr
dependency viapurrr:::map_dfr()
(thanks @jimhester, #324). -
Added required minimal version dependency for purr (
>= 0.2.3
) (#338). -
We rely on the tibble package which was optimized for speed in
v1.4.2
so styler should run ~2x as fast (#348). For that reason, styler now depends ontibble >= 1.4.2
. -
In the dependency
enc
, a bug was fixed that removed/changed non-ASCII characters. Hence, styler now depends onenc >= 0.2
(#348).
-
We're now recognizing and respecting more DSLs used in R comments: rplumber (
#*
, #306), shebang#/!
(#345), knitr chunk headers for spinning (#+
/#-
, #362). -
Named arguments can stay on the first line if call is multi-line (#318).
-
No space anymore with
tidyverse_style()
after!!
since withrlang 0.2
,!!
now binds tighter (#322), spacing around~
(#316), no space anymore around^
(#308). -
Code chunks in Rmd documents that don't use the R engine are no longer formatted (#313).
-
Various bug fixes and edge case improvements.
Thanks to all contributors for patches, issues and the like: @devSJR, @klrmlr, @yutannihilation, @samhinshaw, @martin-mfg, @jjramsey, @RMHogervorst, @wlandau, @llrs, @aaronrudkin, @crew102, @jkgrain, @jennybc, @joranE.
Initial release.
These are functions used to style code. They style a directory, a whole package, a file or a string.
style_dir(path = ".",
..., style = tidyverse_style, transformers = style(...),
filetype = "R", recursive = TRUE, exclude_files = NULL
)
style_pkg(pkg = ".",
..., style = tidyverse_style, transformers = style(...), filetype = "R",
exclude_files = "R/RcppExports.R"
)
style_file(path,
..., style = tidyverse_style, transformers = style(...)
)
style_text(text, ..., style = tidyverse_style, transformers = style(...))
These functions are the style guides implemented.
tidyverse_style(
scope = "tokens",
strict = TRUE,
indent_by = 2,
start_comments_with_one_space = FALSE,
reindention = tidyverse_reindention(),
math_token_spacing = tidyverse_math_token_spacing()
)
tidyverse_reindention()
tidyverse_math_token_spacing())
This function is used to create a style guide.
create_style_guide(
initialize = default_style_guide_attributes,
line_break = NULL,
space = NULL,
token = NULL,
indention = NULL,
use_raw_indention = FALSE,
reindention = tidyverse_reindention()
)
These are helper functions used to specify the style guides in use.
specify_math_token_spacing(
zero = NULL,
one = c("'+'", "'-'", "'*'", "'/'", "'^'")
)
specify_reindention(
regex_pattern = NULL,
indention = 0,
comments_only = TRUE
)
initialize_default_attributes(pd_flat)