Fork me on GitHub

I've been working on Tutkain, a Sublime Text package for interactive Clojure development, for the past year and a half. Now that Sublime Text 4 ( is out, if you're interested, you can try it out without having to buy a license. Tutkain's website (replete with incomplete documentation) is here: You can use Tutkain to connect to a Clojure, shadow-cljs, or Babashka socket REPL and evaluate code from the editor. Tutkain has support for auto-completion and looking up function and spec-naming keyword information. It also sports a vaguely Cursive-like clojure.test integration. Tutkain is more like Clover, Chlorine, or inf-clojure than Calva or CIDER. It has zero dependencies on both the client (the Sublime Text package) and the server (the Clojure, ClojureScript or Babashka runtime). It uses different channels for evaluations and editor tooling, which means it won't get in your way if you want to do things like start nested REPLs. In general, Tutkain is heavily REPL-oriented. My hope is that you can use it to come up with ways to use the REPL to maximum effect, instead of having to implement bespoke capabilities into Tutkain itself for every imaginable use case. Note that Tutkain is still in alpha, so breaking changes are possible. If you end up trying it out, I'd really appreciate it if you could let me know how it goes. Tutkain (unsurprisingly) hasn't had a lot of users so far, so I could really use another set of eyes on it to iron out the bugs.


Tutkain looks really nice, congratulations!


Thanks, Colin! And thanks also for Cursive, which I used for many years before embarking on this fool's errand. 🙂


I think everyone (including me) underestimates the amount of work in making an editor 🙂


You can say that again, brother. 😛


I’m curious, how do you diff the test results? What does that look like?


I constantly feel like I've bitten off way more than I can chew.


Haha, so do I.


I could probably keep a team of 4 busy for a year on Cursive with no problems.


I have no doubt. I sometimes feel I could almost do that with Tutkain, and it has a fraction of the features. 😛


The clojure.test integration is this really dumb thing at the moment:


Last I heard (several years ago now) PyCharm has a team of 16 (!)


Dear god. Well, that relieves me of some of my inferiority complex. 😛


Of course, they sell like 500k licences or something.


The diffing itself uses ST's built-in diff thing, so it's not very good when the results get medium-to-large.


I see, you’re using pprint. The issue I always have is how to format the data structures so the diff makes sense.


Yes, could probably try to come up with something more clever for that. I'm not sure I want to put in a lot of effort to the clojure.test integration, though. I guess I'm considering going for a more REPL-oriented approach (Stu's transcriptor lib and that kind of thing).


Yeah, fair enough. I still think you’ll want diffs when things don’t match what you expected, though.


Whatever test protocol you’re using.


Yeah, definitely. I'm thinking folks can then either use or something like deep-diff2 if they want to, though.


Maybe first use get-in and select-keys to prune things down etc.


Which is to say: I'm copping out because I don't think I'm smart enough to come up with a really good diffing solution myself. 😛


Haha, that’s something I’m still struggling with, which is why I asked 🙂


Ok, I’d better go, my daughter needs breakfast. Congrats again!


Hehe, well, for what it's worth, I always thought the test result diffing was one of the best parts of Cursive. 🙂


Sure, I need sleep. Thanks!


Great work, @U4ZDX466T! Indeed, by being REPL-oriented it really seems closer to Chlorine and Clover. Great to see more push on trying to use REPL to the maximum effect too 🙂


BTW, @U0567Q30W, I've been using nubank/matcher-combinators for tests, and it's really sweet for the thing you described (if I undestood correctly 😄)


@U3Y18N0UC Thank you! Chlorine/Clover has certainly been an inspiration. 🙂


It's sad that sublime does not support js for plug-ins, otherwise we could reuse the same base library for this plug-in also :)


Heh, I probably would've insisted on writing my own thing anyway. 🙂


@U3Y18N0UC No, it’s more how to show a visual diff of two data structures that’s the problem. At some point I’m going to build something with but I haven’t managed it yet. Cursive’s currently works ok but uses a lot of space.