It is a sad state of affairs that this feels necessary, but I ask that if you support or are planning to vote for the reelection of the 45th president of the United States of America, that you not use this plugin.
| Travis CI |
|---|
| |
A collection of sbt plugins for formatting source files. The current version of the plugin is compatible with sbt 1.3.0 and greater. The legacy version, 0.1.6, works with sbt 1.x and sbt 0.13.x.
There are four plugins in the family:
sbt-clang-formatformats c family languages (c/c++/objc) using clang-format.sbt-java-formatformats java source code using google java formater.sbt-scala-formatformats scala source code using scalafmt.sbt-source-formataggregates the first three plugins.sbt-jvm-formataggregates (2) and (3) and provides keys for formatting all of the java and scala sources (including sbt build files).
The latest version is 0.3.1. To use the plugin, add one or more of
addSbtPlugin("com.swoval" % "sbt-clang-format" % "0.3.1")
addSbtPlugin("com.swoval" % "sbt-java-format" % "0.3.1")
addSbtPlugin("com.swoval" % "sbt-jvm-format" % "0.3.1")
addSbtPlugin("com.swoval" % "sbt-scala-format" % "0.3.1")
addSbtPlugin("com.swoval" % "sbt-source-format" % "0.3.1")
to your project/plugins.sbt file.
Each format plugin provides two tasks: one for formatting a source file
and overwriting its contents if they differ and one for checking that the
formatting is correct without overwriting. In the case of sbt-clang-format,
the format task is clangfmt and the check task is clangfmtCheck. Similarly,
the scala and java plugins provide scalafmt, scalafmtCheck, javafmt and
javafmtCheck. When using sbt-jvm-format, in addition to javafmt,
scalafmt, etc, there is also jvmfmt, which formats all of the java and scala
sources in the project for a configuration. The jvmfmtAll task formats all of
the java and scala sources in the Compile and Test tasks as well as the
scala and java sources that comprise the project sbt build.
Formatting is incremental. The plugin will only attempt to format files that
have not been previously formatted or verified as formatted. It also fully
interoperates with the ~ command. For example, running ~javafmt, sbt will
watch for all of the "*.java" files and reformat whenever any are modified.
By default the javafmt source files will be all of the files ending with
*.java in the unmanagedSourceDirectories. The javafmt task is defined both
in the Compile and Test configurations as well as in the project
configuration. Running javafmt will format all of the java source files in
the project while running Test / javafmt or Compile / javafmt will only
format the sources in the respective configurations.
For clangfmt no default sources are specified. Add *.c sources with:
clangfmt / fileInputs += baseDirectory.value.toGlob / "src" / ** / "*.c"
Sources can also be added to javafmt and scalafmt using fileInputs in
the appropriate configs, e.g.
Compile / scalafmt / fileInputs += baseDirectory.value.toGlob / "other" / ** / "*.scala"
The plugin also provides a library for defining a custom formatter for any source file type. To create a custom formatter, add
libraryDependencies += "com.swoval" %% "sbt-source-format-lib" % "0.2.3"
to project/plugins.sbt (or build.sbt for a plugin).
A no-op javascript formatter can be added to a build.sbt file like so:
import com.swoval.format.lib.SourceFormat
import java.nio.file.Files
val jsfmt = taskKey[Unit]("Format js files.")
SourceFormat.settings(
jsfmt,
(path, logger) => new String(Files.readAllBytes(path)),
Def.setting(sourceDirectory.value.toGlob / ** / "*.js" :: Nil)
)In order to use the clangfmt command, the clang-format utility must be
installed. On osx, it can be installed using homebrew: brew install clang-format. On linux, it can be installed with apt: apt-get install clang-format (sudo is probably necessary on most setups).