Giter Site home page Giter Site logo

ultra's Introduction

Hi. I haven't been writing software in the last 5 years and various things have changed since then which may mean Ultra no longer works for you. I'm sorry about that, but I'm not going to be able to help. If you're able to fix things, go for it! I'll do my best to accept helpful PRs

Ultra

CircleCI
Hey, you know who has two thumbs and strong opinions? That's right, it's me.

Ultra is a Leiningen plugin for an absolutely kick-ass development environment.

I've written a blog post describing Ultra in greater depth here.

Ultra is the rare piece of essentially "finished" software. I've ironed out most of the bugs, and don't plan on adding much in the future. In other words: it's not unmaintained, it's just done.

Installation

To install Ultra, just add the following to your ~/.lein/profiles.clj

{:user {:plugins [[venantius/ultra "0.6.0"]]}}

Requirements

Lein 2.9.0
JDK 8
Clojure 1.7+

If you want to use something older, see LEGACY_SUPPORT.md

ClojureScript Support

At the moment, Ultra doesn't have ClojureScript support at the REPL. The relevant upstream issue to track work on this is greglook/puget#27; from there, Whidbey will need to be updated, and then Ultra will be able to consume the changes.

Features

For a detailed list of features, check out the wiki. Here's the highlight reel:

A colorized REPL! colorized repl

Syntax-highlighted source! colorized source

Clearer test output! test output demo

Better stacktraces! test stacktrace demo

Configuration

All of the above features are enabled by default, but can be turned off by setting a false flag in your profile. If you wanted Ultra to essentially no-op, your configuration map would look like this:

{:ultra {:repl         false
         :stacktraces  false
         :tests        false}}

REPL Configuration

Ultra uses Whidbey as its pretty-printing engine, and supports all of Whidbey's configuration flags.

{:ultra {:repl {:width 180
                :map-delimiter ""
                :extend-notation true
                :print-meta true
                 ...}}}
:width

Number of characters to try to wrap pretty-printed forms at.

:print-meta

If true, metadata will be printed before values.

:sort-keys

Print maps and sets with ordered keys. Defaults to true, which will sort all collections. If a number, counted collections will be sorted up to the set size. Otherwise, collections are not sorted before printing.

:map-delimiter

The text placed between key-value pairs in a map.

:map-coll-separator

The text placed between a map key and a collection value. The keyword :line will cause line breaks if the whole map does not fit on a single line.

:seq-limit

If set to a positive number, then lists will only render at most the first n elements. This can help prevent unintentional realization of infinite lazy sequences.

Using CIDER alongside Ultra

Projects which extend the Clojure REPL will conflict with each other; a middleware which modifies REPL print output will break the assumption of another middleware expecting unmodified Clojure output. Specifically, Ultra and CIDER collide on certain test result values (#79).

Use either CIDER or Ultra, but not both. Configure cider-jack-in to skip the Leiningen user profile, and therefore skip using Ultra, in .emacs:

; Skip :user section of ~/.lein/profiles.clj when using cider-jack-in.
(setq cider-lein-parameters
      "with-profile -user repl :headless :host localhost")

If you have a lein user profile intended to alter CIDER's behavior, consider these options:

  1. Declare a separate profile and name it in with-profile -user,YOURPROFILE in the Emacs cider-lein-parameters variable.
  2. Configure CIDER's cider-jack-in-lein-plugins variable.

CIDER added variables:

  • cider-lein-parameters in CIDER v0.7.0
  • cider-jack-in-lein-plugins in CIDER v0.11.0

Running project tests may cause the CIDER REPL to hang (#79) when using cider-connect (as opposed to cider-jack-in) with an existing lein repl which is running Ultra.

Contributing

Please open an issue here before submitting pull requests; I prefer to have documentation and consensus that either of our time will be well spent by working on it. When opening an issue -- particularly for bugs -- please refer to CONTRIBUTING.md

Bug fixes and code cleanup are always appreciated and won't get too much pushback; new features will be held to a higher standard - this whole project is something of a massive exercise in ego, after all.

Motivation

...or, why didn't you just put all of this stuff in your ~/.lein/profiles.clj?

In short, my :user profile was starting to become bloated. It was difficult to tell whether plugins were interfering with each other, and my :injections key in particular was starting to look a little unwieldy.

At some point I realized I was up to my neck in alligators and that it was time to push things into a standalone repository.

Special Thanks

Ultra wraps, calls, or draws inspiration from the following libraries, and their owners and authors deserve credit for doing most of the hard work.

License

In some cases, I've borrowed code snippets from libraries above and re-written them. Where that is the case, the Copyright of the original author[s] remains in effect. Any modifications to their code, as well as all original content, is Copyright © 2019 W. David Jarvis.

Distributed under the Eclipse Public License 1.0, the same as Clojure.

ultra's People

Contributors

aeriksson avatar bradjm avatar divergentdave avatar dizzeepascall avatar dm3 avatar emlyn avatar gitter-badger avatar ikitommi avatar jell avatar leonidas-from-xiv avatar oubiwann avatar rduplain avatar tcrayford avatar timothypratley avatar venantius avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ultra's Issues

Warn and inject Ultra 0.3.4 when Clojure version is <1.7.0

After some thinking on the subject I have decided that the current behavior (where Ultra 0.4.0 causes Leiningen to fail hard when the Clojure version is < 1.7.0) is a pretty garbage user experience. I think a better behavior might be to emit a loud warning on Leiningen startup if the Clojure version is below 1.7.0 and then to fall back to version 0.3.4 so that users still get some of the benefits of Ultra.

Make Puget width configurable

This is a request that came out of the Gitter chatroom - it would be nice if Ultra surfaced some of the configuration options for Puget, in particular the print width.

Clojure 1.8 stacktraces problem

> lein test - output not enhanced
> lein repl \ (run-tests) - output enhanced

How can I get your stuff working with lein test? It's more convenient for me than (run-tests)

Glow brings in unnecessary dependencies and namespaces

glow has dependency on hiccup and garden for generating html output, ultra doesn't use this feature.

Ultra uses glow.core namespace to generate ansi output, this namepace requires glow.html which depends on garden.core and hiccup.core. Compiling all these namespaces takes considerable time every time repl process is started.

To test this, I moved the ultra dependency vector from :plugins to :dependencies and ran (time (require 'glow.html)) on repl:

user=> (time (require 'glow.html))
"Elapsed time: 1226.618638 msecs"

user=> (time (require 'glow.html :reload-all))
"Elapsed time: 1419.59313 msecs"
user=> (time (require 'glow.html :reload-all))
"Elapsed time: 1080.967651 msecs"

Running :reload-all also shows how long it takes to compile glow.html and all the namespaces it depends on.

Solution:

  • Use glow.terminal, glow.parse and low.colorschemes directly instead of through glow.core
  • Add exclusion to hiccup and garden on venantius/glow dependency vector

Problem with lighttable

Since I added ultra to ~/.lein/profiles.clj I got following error:

Don't know what's the correlation with ultra, but removing it solves the problem...

Exception in thread "main" java.lang.ClassNotFoundException: lighttable.nrepl.core, compiling:(/private/var/folders/mr/8_72b3r13631y6hwx2d78y20l118w9/T/form-init6025032780506562061.clj:1:1250)
    at clojure.lang.Compiler.analyze(Compiler.java:6464)
    at clojure.lang.Compiler.analyze(Compiler.java:6406)
    at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6646)
    at clojure.lang.Compiler.analyze(Compiler.java:6445)
    at clojure.lang.Compiler.analyze(Compiler.java:6406)
    at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5782)
    at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5217)
    at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3846)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6642)
    at clojure.lang.Compiler.analyze(Compiler.java:6445)
    at clojure.lang.Compiler.eval(Compiler.java:6700)
    at clojure.lang.Compiler.eval(Compiler.java:6693)
    at clojure.lang.Compiler.eval(Compiler.java:6692)
    at clojure.lang.Compiler.load(Compiler.java:7130)
    at clojure.lang.Compiler.loadFile(Compiler.java:7086)
    at clojure.main$load_script.invoke(main.clj:274)
    at clojure.main$init_opt.invoke(main.clj:279)
    at clojure.main$initialize.invoke(main.clj:307)
    at clojure.main$null_opt.invoke(main.clj:342)
    at clojure.main$main.doInvoke(main.clj:420)
    at clojure.lang.RestFn.invoke(RestFn.java:421)
    at clojure.lang.Var.invoke(Var.java:383)
    at clojure.lang.AFn.applyToHelper(AFn.java:156)
    at clojure.lang.Var.applyTo(Var.java:700)
    at clojure.main.main(main.java:37)
Caused by: java.lang.ClassNotFoundException: lighttable.nrepl.core
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at clojure.lang.DynamicClassLoader.findClass(DynamicClassLoader.java:61)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:344)
    at clojure.lang.RT.classForName(RT.java:2065)
    at clojure.lang.Compiler$HostExpr.maybeClass(Compiler.java:978)
    at clojure.lang.Compiler$HostExpr.access$400(Compiler.java:756)
    at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6832)
    at clojure.lang.Compiler.analyze(Compiler.java:6427)
    ... 25 more
clojure.lang.ExceptionInfo: Subprocess failed {:exit-code 1}
    at clojure.core$ex_info.invoke(core.clj:4327)
    at leiningen.core.eval$fn__3532.invoke(eval.clj:226)
    at clojure.lang.MultiFn.invoke(MultiFn.java:231)
    at leiningen.core.eval$eval_in_project.invoke(eval.clj:326)
    at clojure.lang.AFn.applyToHelper(AFn.java:167)
    at clojure.lang.AFn.applyTo(AFn.java:151)
    at clojure.core$apply.invoke(core.clj:619)
    at leiningen.repl$repl.doInvoke(repl.clj:261)
    at clojure.lang.RestFn.invoke(RestFn.java:425)
    at leiningen.light_nrepl$light.doInvoke(light_nrepl.clj:56)
    at clojure.lang.RestFn.invoke(RestFn.java:423)
    at leiningen.light_nrepl$_main.doInvoke(light_nrepl.clj:68)
    at clojure.lang.RestFn.invoke(RestFn.java:397)
    at clojure.lang.AFn.applyToHelper(AFn.java:159)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at leiningen.light_nrepl.main(Unknown Source)

delayed initialization of features for better startup time

love the features, but with my i7 mac book pro, it add's about 1.5sec to initialize the plugin when running any lein-related command. Would it be possible to delay initialization of the features so that it woudn't cause delays when running non-ultra related tasks such as lein uberjar?

without ultra (with lots of other plugins & tunings):

$ time lein run -m clojure.main/main -e "(+ 1 1)"
2
lein run -m clojure.main/main -e "(+ 1 1)"  3.12s user 0.21s system 144% cpu 2.304 total

adding ultra:

$ time lein run -m clojure.main/main -e "(+ 1 1)"
2
lein run -m clojure.main/main -e "(+ 1 1)"  4.62s user 0.26s system 131% cpu 3.722 total

... having totally empty .lein/profiles.clj gives even worse figures:

without:

$ time lein run -m clojure.main/main -e "(+ 1 1)"
2
lein run -m clojure.main/main -e "(+ 1 1)"  1.30s user 0.10s system 134% cpu 1.044 total

with ultra as the only plugin:

$ time lein run -m clojure.main/main -e "(+ 1 1)"
2
lein run -m clojure.main/main -e "(+ 1 1)"  3.38s user 0.18s system 132% cpu 2.682 total

Cannot run 'lein repl'

Hi,

I added the plugin to my Leiningen config and I get the following error when running lein repl:

WARNING: delegate already refers to: #'clojure.core/delegate in namespace: hara.reflect.core.delegate, being replaced by: #'hara.reflect.core.delegate/delegate
WARNING: delegate already refers to: #'clojure.core/delegate in namespace: hara.reflect, being replaced by: #'hara.reflect/delegate
Exception in thread "main" java.lang.IllegalAccessError: in does not exist, compiling:(ultra/reflect.clj:1:1)
    at clojure.lang.Compiler.load(Compiler.java:7142)
    at clojure.lang.RT.loadResourceScript(RT.java:370)
    at clojure.lang.RT.loadResourceScript(RT.java:361)
    at clojure.lang.RT.load(RT.java:440)
    at clojure.lang.RT.load(RT.java:411)
    at clojure.core$load$fn__5066.invoke(core.clj:5641)
    at clojure.core$load.doInvoke(core.clj:5640)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invoke(core.clj:5446)
    at clojure.core$load_lib$fn__5015.invoke(core.clj:5486)
    at clojure.core$load_lib.doInvoke(core.clj:5485)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$load_libs.doInvoke(core.clj:5524)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$require.doInvoke(core.clj:5607)
    at clojure.lang.RestFn.invoke(RestFn.java:512)
    at ultra.hardcore$eval2160$loading__4958__auto____2161.invoke(hardcore.clj:1)
    at ultra.hardcore$eval2160.invoke(hardcore.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6703)
    at clojure.lang.Compiler.eval(Compiler.java:6692)
    at clojure.lang.Compiler.load(Compiler.java:7130)
    at clojure.lang.RT.loadResourceScript(RT.java:370)
    at clojure.lang.RT.loadResourceScript(RT.java:361)
    at clojure.lang.RT.load(RT.java:440)
    at clojure.lang.RT.load(RT.java:411)
    at clojure.core$load$fn__5066.invoke(core.clj:5641)
    at clojure.core$load.doInvoke(core.clj:5640)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invoke(core.clj:5446)
    at clojure.core$load_lib$fn__5015.invoke(core.clj:5486)
    at clojure.core$load_lib.doInvoke(core.clj:5485)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$load_libs.doInvoke(core.clj:5524)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$require.doInvoke(core.clj:5607)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at user$eval2156.invoke(form-init5527870868411767703.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6703)
    at clojure.lang.Compiler.eval(Compiler.java:6692)
    at clojure.lang.Compiler.load(Compiler.java:7130)
    at clojure.lang.Compiler.loadFile(Compiler.java:7086)
    at clojure.main$load_script.invoke(main.clj:274)
    at clojure.main$init_opt.invoke(main.clj:279)
    at clojure.main$initialize.invoke(main.clj:307)
    at clojure.main$null_opt.invoke(main.clj:342)
    at clojure.main$main.doInvoke(main.clj:420)
    at clojure.lang.RestFn.invoke(RestFn.java:421)
    at clojure.lang.Var.invoke(Var.java:383)
    at clojure.lang.AFn.applyToHelper(AFn.java:156)
    at clojure.lang.Var.applyTo(Var.java:700)
    at clojure.main.main(main.java:37)
Caused by: java.lang.IllegalAccessError: in does not exist
    at clojure.core$refer.doInvoke(core.clj:3919)
    at clojure.lang.RestFn.applyTo(RestFn.java:139)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$load_lib.doInvoke(core.clj:5505)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$load_libs.doInvoke(core.clj:5524)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$require.doInvoke(core.clj:5607)
    at clojure.lang.RestFn.invoke(RestFn.java:436)
    at ultra.reflect$eval3795$loading__4958__auto____3796.invoke(reflect.clj:1)
    at ultra.reflect$eval3795.invoke(reflect.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6703)
    at clojure.lang.Compiler.eval(Compiler.java:6692)
    at clojure.lang.Compiler.load(Compiler.java:7130)
    ... 54 more

I'm running Leiningen 2.5.1 on Java 1.8.0-ea Java HotSpot(TM) 64-Bit Server VM on a Mac with OSX 10.10.1.

Looking forward to using the plugin, looks really sweet!

Problem with Alembic

Enabling ultra seems to break alembic. Alembic is used to load library from repl without restarting it. After enabling ultra, I have this error when I try to load a library with alembic:

user=> (require 'alembic.still)
nil
user=> (alembic.still/distill '[enlive "1.1.5"])

              java.io.FileNotFoundException: Could not locate fipp/engine__init.class or fipp/engine.clj on classpath:
    clojure.lang.Compiler$CompilerException: java.io.FileNotFoundException: Could not locate fipp/engine__init.class or fipp/engine.clj on classpath: , compiling:(puget/printer.clj:1:1)
java.lang.reflect.InvocationTargetException:
user=>

Removing alembic from profiles.clj, alembic works again.

Although it does seem that more of ultra's dependency breaks it.

v0.4.1 Possibly confusing dependencies found

When I try to include ultra as:

[venantius/ultra "0.4.1" :exclusions [org.clojure/clojure
                                      hiccup]]

I still get error like

Possibly confusing dependencies found:
[org.clojure/clojure "1.7.0" :exclusions [clj-http com.stuartsierra/component]]
 overrides
[venantius/ultra "0.4.1"] -> [org.clojure/clojure "1.8.0"]

Consider using these exclusions:
[venantius/ultra "0.4.1" :exclusions [org.clojure/clojure]]

[endophile "0.1.2" :exclusions [clj-http com.stuartsierra/component]] -> [hiccup "1.0.3"]
 overrides
[venantius/ultra "0.4.1"] -> [venantius/glow "0.1.3"] -> [hiccup "1.0.5"]

Consider using these exclusions:
[venantius/ultra "0.4.1" :exclusions [hiccup]]

Aborting due to :pedantic? :abort

As if it completely ignored :exclusions.
Interestingly, when I include version 0.4.0 as [venantius/ultra "0.4.0"] I don't even have to put anything into :exclusions and everything works

0.3.4 causes problems with LightTable Instarepl

Hi,

I recently updated to the latest version of ultra and now my LightTable instarepl doesn't come up. I am getting this error:

We couldn't connect.
Looks like there was an issue trying to connect to the project. Here's what we got:
final project: {:compile-path /home/veen/.config/LightTable/plugins/Clojure/runner/resources/target/classes, :group local-client, :global-vars {}, :checkout-deps-shares [:source-paths :test-paths :resource-paths :compile-path #'leiningen.core.classpath/checkout-deps-paths], :ultra {:color-scheme :solarized_dark}, :repl-options {:nrepl-context {:interactive-eval {:renderer whidbey.render/render-str}}, :nrepl-middleware [clojure.tools.nrepl.middleware.render-values/render-values lighttable.nrepl.handler/lighttable-ops

We had a problem like this recently and that was fixed by an update to Ultra I think.

Thomas

Fails with future returned by Datomic.

Hi I've been playing around with ultra and enjoying it a lot. Unfortunately, most of the work I do at the repl is with Datomic and there's presently an issue with handling the deref of the future returned by a datomic transaction. If you include Datomic free in a library, this is a simple reproduce case:

(require '[datomic.api :as d])

(def db-uri "datomic:mem://test")
(d/create-database db-uri)
(def conn (d/connect db-uri))
@(d/transact conn [{:db/id (d/tempid :db.part/user) :db/doc "hello world"}])

Stacktrace:

java.lang.RuntimeException: Unable to convert: class datomic.btset.BTSet to Object[]
                                                                  ...
                                                clojure.core/to-array                core.clj:  333
                                                    clojure.core/sort                core.clj: 2828
                                                                  ...
                                                   clojure.core/apply                core.clj:  626
                                              clojure.core/partial/fn                core.clj: 2468
                                                                  ...
                                           puget.printer/sort-entries             printer.clj:  131
                                            puget.printer/eval2715/fn             printer.clj:  236
                                                                  ...
                               puget.printer/canonize-map/canonize-kv             printer.clj:  253
                                                  clojure.core/map/fn                core.clj: 2559
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                           clojure.core/interleave/fn                core.clj: 3973
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                               clojure.core/drop/step                core.clj: 2646
                                                 clojure.core/drop/fn                core.clj: 2650
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                                  clojure.core/map/fn                core.clj: 2551
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                                   clojure.core/apply                core.clj:  624
                                                  clojure.core/mapcat                core.clj: 2586
                                                                  ...
                                               fipp.printer/serialize             printer.clj:   28
                                                  clojure.core/map/fn                core.clj: 2557
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                                   clojure.core/apply                core.clj:  624
                                                  clojure.core/mapcat                core.clj: 2586
                                                                  ...
                                               fipp.printer/serialize             printer.clj:   28
                                             fipp.printer/eval2406/fn             printer.clj:   67
                                                                  ...
                                               fipp.printer/serialize             printer.clj:   31
                                                  clojure.core/map/fn                core.clj: 2557
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                                   clojure.core/apply                core.clj:  624
                                                  clojure.core/mapcat                core.clj: 2586
                                                                  ...
                                               fipp.printer/serialize             printer.clj:   28
                                             fipp.printer/eval2394/fn             printer.clj:   55
                                                                  ...
                                               fipp.printer/serialize             printer.clj:   31
                                                  clojure.core/map/fn                core.clj: 2557
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                                   clojure.core/apply                core.clj:  624
                                                  clojure.core/mapcat                core.clj: 2586
                                                                  ...
                                               fipp.printer/serialize             printer.clj:   28
                                             fipp.printer/eval2377/fn             printer.clj:   44
                                                                  ...
                                               fipp.printer/serialize             printer.clj:   31
                                                  clojure.core/map/fn                core.clj: 2557
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                                   clojure.core/apply                core.clj:  624
                                                  clojure.core/mapcat                core.clj: 2586
                                                                  ...
                                               fipp.printer/serialize             printer.clj:   28
                                             fipp.printer/eval2377/fn             printer.clj:   44
                                                                  ...
                                               fipp.printer/serialize             printer.clj:   31
                                                  clojure.core/map/fn                core.clj: 2559
                                                                  ...
                                                    clojure.core/next                core.clj:   64
                                           clojure.core/concat/cat/fn                core.clj:  701
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                           clojure.core/concat/cat/fn                core.clj:  694
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                           clojure.core/concat/cat/fn                core.clj:  694
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                           clojure.core/concat/cat/fn                core.clj:  694
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                           clojure.core/concat/cat/fn                core.clj:  694
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                           clojure.core/concat/cat/fn                core.clj:  694
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                               clojure.core/concat/fn                core.clj:  685
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                           clojure.core/concat/cat/fn                core.clj:  694
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                           clojure.core/concat/cat/fn                core.clj:  694
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                           clojure.core/concat/cat/fn                core.clj:  694
                                                                  ...
                                                     clojure.core/seq                core.clj:  133
                                           clojure.core/concat/cat/fn                core.clj:  694
                                                                  ...
                                              clojure.core/chunk-next                core.clj:  667
                                            clojure.core.protocols/fn           protocols.clj:  101
                                          clojure.core.protocols/fn/G           protocols.clj:   19
                                    clojure.core.protocols/seq-reduce           protocols.clj:   31
                                            clojure.core.protocols/fn           protocols.clj:   54
                                          clojure.core.protocols/fn/G           protocols.clj:   13
                      clojure.core.reducers/reducer/reify/coll-reduce            reducers.clj:  112
                      clojure.core.reducers/reducer/reify/coll-reduce            reducers.clj:  112
                      clojure.core.reducers/reducer/reify/coll-reduce            reducers.clj:  112
                                                  clojure.core/reduce                core.clj: 6289
                                              transduce.reducers/each            reducers.clj:   44
                                      fipp.printer/pprint-document/fn             printer.clj:  215
                                         fipp.printer/pprint-document             printer.clj:  209
                                                 puget.printer/pprint             printer.clj:  389
                                          puget.printer/pprint-str/fn             printer.clj:  398
                                             puget.printer/pprint-str             printer.clj:  397
                                            whidbey.render/render-str              render.clj:   15
                                                                  ...
clojure.tools.nrepl.middleware.render-values/wrap-renderer/reify/send       render_values.clj:   35
     clojure.tools.nrepl.middleware.interruptible-eval/evaluate/fn/fn  interruptible_eval.clj:   79

With ultra disabled, the output of the deref is:

{:db-before datomic.db.Db@133188bf, :db-after datomic.db.Db@28cd0b35, :tx-data [#datom[13194139534312 50 #inst "2015-02-20T14:48:52.680-00:00" 13194139534312 true] #datom[17592186045417 62 "hello world" 13194139534312 true]], :tempids {-9223350046623220288 17592186045417}}

Allow Additional ANSI Color Choices

I'm really impressed by this plugin... very very nice. I went to define the custom color scheme and realized that Ultra only allows the default 8 ANSI colors even though the way their escape codes are being looked up it's possible to add bold- in front of each.

If I might suggest, maybe in colorscheme.clj on line 15, the code might read:

(#{:black :red :green :yellow :blue :magenta :cyan :white
   :bold-black :bold-red :bold-gree :bold-yellow :bold-blue :bold-magenta :bold-cyan :bold-white} k))

so that for those among us that want to have the complete 16 ANSI colors, we can use them.

The other alternative I thought of was to allow the :bold modifier in the vector for a color descriptor. Something like;

  :boolean [:bold :cyan]

In any case, it's a great plugin, and thanks for listening.

Fix nREPL initialization to not contend with existing configurations

At the moment, Ultra handles REPL configuration by leveraging Lein's :repl-options :init option and simply assoc-ing in the preferred configuration. This should be changed to either be a macro that doesn't throw away any pre-existing forms, or should be ditched entirely in favor of a more hook-oriented approach in a manner akin to how Ultra's test hooks work.

Play nice with Alembic's load-project

I can't get ultra to play nice with alembic's load-project function.

If I have Ultra in my _.lein/profiles.clj, an FileNotFoundException Could not locate fipp/engine__init.class error pops up, very similar to the one reported here. This is weird, because an initial _cider-jack-in does work.

I tried using previous versions of fipp, and the latest Clojure RC. No dice. Might not be within your control. But thought I would mention it nonetheless.

Could not locate fipp/engine__init.class

Hi!
I've followed the getting started procedure and I'm meeting all the requirements.
If I try to launch lein ring server on o a project, I get this exception (I wasn't getting it before trying ultra):

Exception in thread "main" java.io.FileNotFoundException: Could not locate fipp/engine__init.class or fipp/engine.clj on classpath: , compiling:(puget/printer.clj:1:1)

Better test coverage

The lack of proper test coverage on this project is causing bugs to sneak into releases. This needs to be rectified.

io.aviso/pretty 0.1.23

Pretty has evolve a bit since the 0.1.18 release; some people trying to use newer version of pretty inside utlra are hitting issues.

It would be valuable for ultra to update to the latest version of pretty.

I may be able to provide a PR later in the week.

Add stacktrace hints

I've been thinking about stacktraces a bunch lately, and I think it would be great to have hints for stacktraces the same way Ultra does for collection diffs in tests. In particular, it would be great to have hints for common exceptions. Some particular ones that stand out:

  • Wrong number of args passed to PersistentArrayMap, etc (trying to call a map with no arguments)
  • java.lang.Long cannot be cast to clojure.lang.IFn (trying to call an integer)

Leiningen/REPLy version dependency

I wasn't getting colorized output after adding Ultra to my profile. Turns out it was because I was using Lein 2.3, but I didn't know this was the issue until coming across Whidbey's docs.

Might be worth specifying in Ultra's readme that Whidbey has the following requirement:

The easiest way to use Whidbey is as a Leiningen plugin. Note that this requires Leiningen version 2.4.2 or higher for functionality in REPLy 0.3.1.

ultra doesn't honor custom `print-methods`

With Ultra, using lein repl on Manifold:

user=> (require '[manifold.deferred :as d])
nil
user=> (d/deferred)
#<manifold.deferred.Deferred@674a6631 pending>

w/o ultra:

user=> (require '[manifold.deferred :as d])
nil
user=> (d/deferred)
<< … >>

I didn't take any time to dig into this, I would assume it's relatively straightforward to fix, though. Otherwise, very cool project.

Num comparisons shouldn't care

This should be reported properly

expected: 2
  actual: 1

expected: 1 to be an instance of java.lang.Integer
     was: 1 is an instance of java.lang.Long

Coloring not working

I'm on ubuntu 14.04, Clojure v 1.7.0, my ~/.lein/profiles.clj looks like this:

{:user {:plugins [[venantius/ultra "0.4.0"]]}}

and when I run lein repl I see no colors, however I do see formatting of the text's spacing.

I notice all the screenshots are on macs, I assume this is compatible with linux, any idea what I'm doing wrong?

seems conflict with cemerick/piggieback

It seems conflict with cemerick/piggieback. I create project with

  lein new chestnut foo

but when I add ultra plug in ~/.lein/profiles.clj , then type:

     lein repl
     (run)
     (browser-repl)

error with:

      java.lang.IllegalStateException: Can't change/establish root binding of: *cljs-repl-options* with set
                          ...
     cemerick.piggieback/cljs-repl                   piggieback.clj:  177
                          ...
     datamon.dev/browser-repl                          dev.clj:   19
     datamon.server/eval18995  form-init287435879385036443.clj:    1
                          ...
            clojure.core/eval                         core.clj: 2927

if I remove ultra plug , it's ok

clash with potemkin Vars

There seems to a clash with potemkin Vars with my setup (using Vinyasa):

WARNING: protocol? already refers to: #'clojure.core/protocol? in namespace: potemkin.types, being replaced by: #'potemkin.types/protocol?
WARNING: protocol? already refers to: #'clojure.core/protocol? in namespace: potemkin.collections, being replaced by: #'potemkin.types/protocol?

what if Ultra would inject Vars into custom & configurable namespace like Vinyasa does (defaulting to ./), instead of adding stuff to clojure.core => would separate nicely the things "available in the dev repl" and "available in the installed prod".

thanks for the awesome tool.

Test diff output breaks when comparing different types of maps

Comparing e.g. PersistentArrayMaps to PersistentHashMaps breaks the diff.

As an example, the following test:

(deftest t (testing (is (= {0 0} {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8}))))

gives the following output:

expected: {0 0}
  actual: {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8}

    diff: - {0 0}
          + {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8}

…while:

(deftest t (testing (is (= {0 0} {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9}))))

gives:

expected: {0 0}
  actual: {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9}

expected: {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9} to be an instance of clojure.lang.PersistentArrayMap
     was: {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9} is an instance of clojure.lang.PersistentArrayMap

(the difference here being that map literals are interpreted as either hash maps or array maps depending on the number of elements)

Color scheme not working

Hello,

I'm probably doing something here.
I can't seem to get the repls colour scheme working.

Here is my ~/.lein/profiles.clj
{:user {:plugins [[venantius/ultra "0.4.0"]]}}

The stack trace output formatting is working so it looks like the plugin is being applied.

screen shot 2015-12-25 at 12 29 03 pm

Using terminal.app on Mac osx

Exception when installing

Leiningen 2.5.0 on Java 1.6.0_65 Java HotSpot(TM) 64-Bit Server VM

Updated my profiles.clj with the snippet from the README and got the following exception:

Retrieving org/clojars/brenton/google-diff-match-patch/0.1/google-diff-match-patch-0.1.jar from clojars
Exception in thread "main" java.lang.ClassNotFoundException: jsr166y.ForkJoinPool, compiling:(clojure/core/reducers.clj:56:21)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6651)
    at clojure.lang.Compiler.analyze(Compiler.java:6445)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6632)
    at clojure.lang.Compiler.analyze(Compiler.java:6445)
    at clojure.lang.Compiler.analyze(Compiler.java:6406)
    at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5782)
    at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5217)
    at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3846)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6642)
    at clojure.lang.Compiler.analyze(Compiler.java:6445)
    at clojure.lang.Compiler.analyze(Compiler.java:6406)
    at clojure.lang.Compiler$NewExpr$Parser.parse(Compiler.java:2545)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6644)
    at clojure.lang.Compiler.analyze(Compiler.java:6445)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6632)
    at clojure.lang.Compiler.analyze(Compiler.java:6445)
    at clojure.lang.Compiler.access$100(Compiler.java:38)
    at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:538)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6644)
    at clojure.lang.Compiler.analyze(Compiler.java:6445)
    at clojure.lang.Compiler.analyze(Compiler.java:6406)
    at clojure.lang.Compiler.eval(Compiler.java:6707)
    at clojure.lang.Compiler.eval(Compiler.java:6692)
    at clojure.lang.Compiler.eval(Compiler.java:6693)
    at clojure.lang.Compiler.load(Compiler.java:7130)
    at clojure.lang.RT.loadResourceScript(RT.java:370)
    at clojure.lang.RT.loadResourceScript(RT.java:361)
    at clojure.lang.RT.load(RT.java:440)
    at clojure.lang.RT.load(RT.java:411)
    at clojure.core$load$fn__5066.invoke(core.clj:5641)
    at clojure.core$load.doInvoke(core.clj:5640)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invoke(core.clj:5446)
    at clojure.core$load_lib$fn__5015.invoke(core.clj:5486)
    at clojure.core$load_lib.doInvoke(core.clj:5485)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$load_libs.doInvoke(core.clj:5524)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$require.doInvoke(core.clj:5607)
    at clojure.lang.RestFn.invoke(RestFn.java:457)
    at fipp.printer$eval20687$loading__4958__auto____20688.invoke(printer.clj:1)
    at fipp.printer$eval20687.invoke(printer.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6703)
    at clojure.lang.Compiler.eval(Compiler.java:6692)
    at clojure.lang.Compiler.load(Compiler.java:7130)
    at clojure.lang.RT.loadResourceScript(RT.java:370)
    at clojure.lang.RT.loadResourceScript(RT.java:361)
    at clojure.lang.RT.load(RT.java:440)
    at clojure.lang.RT.load(RT.java:411)
    at clojure.core$load$fn__5066.invoke(core.clj:5641)
    at clojure.core$load.doInvoke(core.clj:5640)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invoke(core.clj:5446)
    at clojure.core$load_lib$fn__5015.invoke(core.clj:5486)
    at clojure.core$load_lib.doInvoke(core.clj:5485)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$load_libs.doInvoke(core.clj:5524)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$require.doInvoke(core.clj:5607)
    at clojure.lang.RestFn.invoke(RestFn.java:436)
    at puget.printer$eval20681$loading__4958__auto____20682.invoke(printer.clj:1)
    at puget.printer$eval20681.invoke(printer.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6703)
    at clojure.lang.Compiler.eval(Compiler.java:6692)
    at clojure.lang.Compiler.load(Compiler.java:7130)
    at clojure.lang.RT.loadResourceScript(RT.java:370)
    at clojure.lang.RT.loadResourceScript(RT.java:361)
    at clojure.lang.RT.load(RT.java:440)
    at clojure.lang.RT.load(RT.java:411)
    at clojure.core$load$fn__5066.invoke(core.clj:5641)
    at clojure.core$load.doInvoke(core.clj:5640)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invoke(core.clj:5446)
    at clojure.core$load_lib$fn__5015.invoke(core.clj:5486)
    at clojure.core$load_lib.doInvoke(core.clj:5485)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$load_libs.doInvoke(core.clj:5524)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$require.doInvoke(core.clj:5607)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at whidbey.render$eval20675$loading__4958__auto____20676.invoke(render.clj:1)
    at whidbey.render$eval20675.invoke(render.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6703)
    at clojure.lang.Compiler.eval(Compiler.java:6692)
    at clojure.lang.Compiler.load(Compiler.java:7130)
    at clojure.lang.RT.loadResourceScript(RT.java:370)
    at clojure.lang.RT.loadResourceScript(RT.java:361)
    at clojure.lang.RT.load(RT.java:440)
    at clojure.lang.RT.load(RT.java:411)
    at clojure.core$load$fn__5066.invoke(core.clj:5641)
    at clojure.core$load.doInvoke(core.clj:5640)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invoke(core.clj:5446)
    at clojure.core$load_lib$fn__5015.invoke(core.clj:5486)
    at clojure.core$load_lib.doInvoke(core.clj:5485)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$load_libs.doInvoke(core.clj:5524)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$require.doInvoke(core.clj:5607)
    at clojure.lang.RestFn.invoke(RestFn.java:482)
    at ultra.colorscheme$eval20655$loading__4958__auto____20656.invoke(colorscheme.clj:1)
    at ultra.colorscheme$eval20655.invoke(colorscheme.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6703)
    at clojure.lang.Compiler.eval(Compiler.java:6692)
    at clojure.lang.Compiler.load(Compiler.java:7130)
    at clojure.lang.RT.loadResourceScript(RT.java:370)
    at clojure.lang.RT.loadResourceScript(RT.java:361)
    at clojure.lang.RT.load(RT.java:440)
    at clojure.lang.RT.load(RT.java:411)
    at clojure.core$load$fn__5066.invoke(core.clj:5641)
    at clojure.core$load.doInvoke(core.clj:5640)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invoke(core.clj:5446)
    at clojure.core$load_lib$fn__5015.invoke(core.clj:5486)
    at clojure.core$load_lib.doInvoke(core.clj:5485)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$load_libs.doInvoke(core.clj:5524)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$require.doInvoke(core.clj:5607)
    at clojure.lang.RestFn.invoke(RestFn.java:512)
    at ultra.hardcore$eval20649$loading__4958__auto____20650.invoke(hardcore.clj:1)
    at ultra.hardcore$eval20649.invoke(hardcore.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6703)
    at clojure.lang.Compiler.eval(Compiler.java:6692)
    at clojure.lang.Compiler.load(Compiler.java:7130)
    at clojure.lang.RT.loadResourceScript(RT.java:370)
    at clojure.lang.RT.loadResourceScript(RT.java:361)
    at clojure.lang.RT.load(RT.java:440)
    at clojure.lang.RT.load(RT.java:411)
    at clojure.core$load$fn__5066.invoke(core.clj:5641)
    at clojure.core$load.doInvoke(core.clj:5640)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invoke(core.clj:5446)
    at clojure.core$load_lib$fn__5015.invoke(core.clj:5486)
    at clojure.core$load_lib.doInvoke(core.clj:5485)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$load_libs.doInvoke(core.clj:5524)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invoke(core.clj:626)
    at clojure.core$require.doInvoke(core.clj:5607)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at bigcommerce_middleware.core$eval20645.invoke(form-init7218153782553134255.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6703)
    at clojure.lang.Compiler.eval(Compiler.java:6692)
    at clojure.lang.Compiler.load(Compiler.java:7130)
    at clojure.lang.Compiler.loadFile(Compiler.java:7086)
    at clojure.main$load_script.invoke(main.clj:274)
    at clojure.main$init_opt.invoke(main.clj:279)
    at clojure.main$initialize.invoke(main.clj:307)
    at clojure.main$null_opt.invoke(main.clj:342)
    at clojure.main$main.doInvoke(main.clj:420)
    at clojure.lang.RestFn.invoke(RestFn.java:421)
    at clojure.lang.Var.invoke(Var.java:383)
    at clojure.lang.AFn.applyToHelper(AFn.java:156)
    at clojure.lang.Var.applyTo(Var.java:700)
    at clojure.main.main(main.java:37)
Caused by: java.lang.ClassNotFoundException: jsr166y.ForkJoinPool
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at clojure.lang.DynamicClassLoader.findClass(DynamicClassLoader.java:61)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:249)
    at clojure.lang.RT.classForName(RT.java:2065)
    at clojure.lang.Compiler$HostExpr.maybeClass(Compiler.java:978)
    at clojure.lang.Compiler$HostExpr.access$400(Compiler.java:756)
    at clojure.lang.Compiler$NewExpr$Parser.parse(Compiler.java:2540)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6644)
    ... 166 more

NPE during compilation with ultra plugin in profiles

I added ultra 0.1.9 plugin into profiles.clj and started to get NPE. Then removed it and compilation went without a glitch.

WARNING: protocol? already refers to: #'clojure.core/protocol? in namespace: potemkin.types, being replaced by: #'potemkin.types/protocol?
java.lang.NullPointerException, compiling:(potemkin.clj:1:1)

Issue with CIDER, the Clojure Interactive Development Environment for Emacs

It seems Ultra causes CIDER to report the following incompatibility:

WARNING: The following required nREPL ops are not supported: 
apropos classpath complete eldoc info inspect-start inspect-refresh inspect-pop inspect-push inspect-    reset macroexpand ns-list ns-vars resource stacktrace toggle-trace-var toggle-trace-ns undef
Please, install (or update) cider-nrepl 0.9.0-SNAPSHOT and restart CIDER

See originally reported issue clojure-emacs/cider#961

Proper test loading

It seems that tests haven't been working properly since 0.2.1, which I feel a little embarrassed about not noticing sooner. This is related to #26.

In short, tests currently look like this:
screen shot 2015-03-14 at 5 44 36 pm

instead of what they should look like, which is this:

screen shot 2015-03-14 at 5 44 56 pm

Friendlier README Regarding Plugin Integration

Hi,

Thanks for the great lein plugin, it is extremely useful.

When I tried installing it I followed the readme and added

{:user {:plugins [[venantius/ultra "0.4.0"]]}}

But couldn't see any colors in the REPL. It took me a while to figure out the default color scheme has no colors and I have to set the color scheme with:

:ultra {:color-scheme :solarized_dark}

Did I miss the documentation regarding it? Maybe it is worth stating in a more visible place so others won't have the same problem.

Support for clojure 1.7.0-alpha2

Hello! When I try to run lein repl with clojure 1.7.0-alpha2 project, I get this message before repl starts:

Boxed math warning, clojure/data/codec/base64.clj:26:31 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_inc(java.lang.Object).
Boxed math warning, clojure/data/codec/base64.clj:255:16 - call: public static java.lang.Number clojure.lang.Numbers.remainder(java.lang.Object,long).
Boxed math warning, clojure/data/codec/base64.clj:255:9 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).

And none of ultra features works :(

Colorized `source`

At the moment the source function just does a general pretty-print, giving us the following:

screen shot 2015-02-04 at 4 19 05 pm

This should be patched to provide a syntax-highlighted printing of the source in question.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.