This is a plugin for Leiningen which changes the REPL to pretty-print results with Puget.
Internally, Whidbey reaches into nREPL
to replace the default pr-values
rendering middleware. See the
history for more on the motivations and implementation details
behind this project.
To use Whidbey, add it to the :plugins
vector in your user
or system
profile. Note that this requires Leiningen version 2.5.1 or higher for profile
and plugin functionality.
Whidbey passes rendering options into Puget from the :whidbey
key in the
profile map:
:whidbey {:width 180
:map-delimiter ""
:extend-notation true
:print-meta true
:color-scheme {:delimiter [:blue]
:tag [:bold :red]
...}
...}
See the puget.printer
namespace for the available configuration.
Additionally, Whidbey adds some convenience tagged-literal extensions for binary
data and URIs. The extensions update the default-data-readers
var to support
round-tripping the tagged representations:
=> (java.net.URI. "http://github.com/greglook")
#whidbey/uri "http://github.com/greglook"
=> (.getBytes "foo bar baz")
#whidbey/bin "Zm9vIGJhciBiYXo="
=> #whidbey/bin "b25lIG1vcmUgdGltZSwgbXVzaWNzIGdvdCBtZSBmZWVsaW5nIHNvIGZyZWU="
#whidbey/bin "b25lIG1vcmUgdGltZSwgbXVzaWNzIGdvdCBtZSBmZWVsaW5nIHNvIGZyZWU="
This is controlled by the :extend-notation
option. Other type extensions can
be added by providing a :tag-types
map. This should map type symbols to a map
with a tag symbol key pointing to a formatting function. When the type is
encountered, it will be rendered as a tagged literal with a form from calling
the formatter on the value.
For example, to render class values as tagged types, you can add this to your
:whidbey
config:
:tag-types {java.lang.Class {'class #(symbol (.getName %))}}}
If the type name or the formatter function are not available at load time, you can quote them to suppress evaluation until those types are printed.
Sometimes, there are types which Puget has trouble rendering. These can be
excluded from pretty-printing by adding their symbol to the :escape-types
set
in the options. These types will be rendered with the normal Clojure printer.
If you want to use these types' print-method
instead, set the
:print-fallback
option to :print
:
:whidbey {:print-fallback :print
:escape-types #{'datomic.db.Db 'datomic.btset.BTSet ...}
...}
Whidbey may also conflict with other REPL customizations. If you experience errors, you can check how the profiles are being merged using the lein-pprint or lein-cprint plugins:
$ lein with-profile +whidbey/repl cprint :repl-options
This is free and unencumbered software released into the public domain. See the UNLICENSE file for more information.