We can't find the internet
Attempting to reconnect
Something went wrong!
Attempting to reconnect
Analysis Summary
Worth Noting
Positive elements
- This video provides a detailed technical walkthrough of how to integrate Clojure LSP and REPL features into the IntelliJ environment using new open-source tools.
Influence Dimensions
How are these scored?About this analysis
Knowing about these techniques makes them visible, not powerless. The ones that work best on you are the ones that match beliefs you already hold.
This analysis is a tool for your own thinking — what you do with it is up to you.
Related content covering similar topics.
Transcript
Hi. Uh so hello everyone. Uh so yeah my name is Arthur. Uh I am a proud father of LA. Uh I love meeting people and talking uh and also a magic the gathering player. So please reach out to me to talk about other things than closure. Uh also am software engineer at newbank focusing on uh developer tools and developer experience. uh and uh I am member of the inner service commons foundation uh and also uh organizer of the closure Brazilian community. So if you are a Portuguese speaker I'll be happy to have you there. Okay. Uh so uh today uh I'll talk about the closure intelligj and closure repo intelligj. They are two uh free and opensource plugins uh to add support for closure uh on IntelliJ. uh they are made by me and uh Eric Dalo uh and I start with the motivation right uh so why to create a ID plugin uh so first thing is like you get a little bit of context so at newbank we use uh closure lp for those who doesn't know closure is the language server for closure and it uses a lot of other libraries to provide uh some canonical ical uh ways to define guidelines. So it use celljmt to format ensure that your code is formatted. Uh cellj condo to do uh statical analysis of your code. Uh uh cellj depend there is a library to ensure that uh you can put rules about which namespace can depend on other name space. So this way you can uh ensure that your code base is following architecture uh design that you want. Uh also we have a lot of custom linkters both on closure SP and CJ condo uh to avoid like crashes and bugs uh for things that we already know. Uh and also we put all of this together in a common config place. There is like a a repository with all of those configurations. So every repository just needs to uh add this other project as a dependency and since those libraries use the source path of the project to get the configuration it already uh got all of this. So it's a way to keep the consistent between all the projects that you have in your uh company. Uh if you want to know more about this there is a talk from Erici in the uh 2023 uh co uh is a whole talk just talking about this and how we use this is the closure SP12 should link them all but it's just to give a context like why uh so I am an intelligj user also use v code but I was missing uh all those features uh when I was working uh in intelligj and also there is another motivation that I I was waiting too long to have my own closure pet project right so I want to learn new things and like work with a different domain uh that was I was not working my daily job and also new challenge and wa there is a lot of challenge when you are talking about intelligj API and working with those kind of things uh Okay. So, uh a little bit about the plugins. They are mostly reading closure that are a little bit about Java and cotling that we are not able to get rid of. Uh is a Gradle project. It was the first time that I was working with a Gradle project uh using Closure. Uh I discovered the closure fund. There is a plugin uh to uh Gradle projects to have the closure tasks there. And also uh both plugins uh they use another library that is cellj for intelligj that we created with a lot of abstractions about what we learn while developing those two plugins. So if you want to create a new plugin for intelligj uh please take a look to these libraries like a lot of utilus functions and uh some helper functions to avoid like a lot of boiler plate. Nice. So talking about the features that uh already have there I just want to highlight some of them. So most uh LSP features are already there. So format slurp barf refactor and a lot of others. Uh there is already local and remote ripple uh inline evolve uh call hierarchy uh custo actions and also ripple in the dev environment. I will show to you all of them. So just to to highlight. So uh let's go to the Intelligj. Uh let me know if it's good like to read uh here. Uh so for those who are not familiar with the IntelliJ so to run uh something uh like a ripple in IntelliJ it uses something called configurations. So uh you need to create a configuration to run them. So the closure repo plugins uh provide the local and remote here. So uh here an example of a local one. Uh like I can select the project if I I'm working with more than one I can select the one that I want. Uh and the type here is grad because the project is grad but can be line closure and so on. And also you have like the remote so you can just select the host the port or you can read from the ripple file. it gets automatically from there. Right? So to run you can just uh click to run it will start and I hope that demo gods will help me today. So uh it is starting here and it shows like what is the common that it run uh and now I can uh I have a a repo working here same that you probably use it uh in most of the the places. Okay. So just to show and also I can go to the uh to the file and uh evaluate a code and we have the inline evaluation here. Okay. So it's the pretty same uh experience that you have uh in other places uh showing a lot a little bit. So uh closure SP showed to me all the reference that I have from this function and also it showed that I have two reference and five reference in tests. So it's good to understand uh and it showed here to me also to take a look that this function does not have any test for it. So it's something that I need to work on. Uh so let's show another uh features. So let's say that we have this code that is this uh some collection here. Uh as I mentioned I can just evaluate the code to show it here. Uh but there is like other options that we can do. Uh so I can just uh open the context action. So I can just say to sort the the items that I have. Also, if I don't want like this vector, uh I can just change it to be a set. Uh and I already have like CJ Condo sent to me say to me that oh you have a duplicate set of the of the elements. So this is pretty useful and what those kind of things that I uh was missing to have like them uh pretty standardized. Uh another thing is that uh I can go here and say dev name con. So uh it's already gray. So because the name is already refers to closure core name. So oh maybe we want to change this uh to be this audience. Uh and then I can just say uh the famous hello uh so hello uh all the ends. Okay. and night show. So let's say that I want to do this uh uppercase. Uh I can just was the slurp that we have in other places. Uh and then it got me this green squiggle just say oh you you didn't set the war on reflection. So I don't know if you work it with interoperability. So it's good to have this uh the war on reflection. So uh it helps you. So I like is something that uh I already have with the closure LCP. Uh another thing that is useful. So you can just go here and say this code is not good. So I want to do like thread list all and it just changed to me uh the code. But also I can just say please rewind this because I didn't like and it go backs to this. So it's pretty nice to have this things when you are working. Uh another feature that I want to show is that uh let me just move this. Uh I will load the file here and uh okay. So I can go here in the evolve action and just uh here is how I open the the actions on IntelliJ and I say just uh I can open the call hierarchy key. So it will show to me uh every function that is calling this function in my project. But also I can just do the opposite and say oh which functions my function uh is calling. So this is a pretty nice feature also to to have uh and uh also I want to show uh something that is the custom code actions that I mention it. So you can put inside your project inside the CLJ repo intelligj a file. Uh so this file is basically a configuration where you can just uh put like some actions and some codes to be executed. Uh so you can put bind shortcuts to them. So you can go like in a place where you have the code open the and find the hello world action. So if I press it and run uh it just run the custom code action that is print len hello world. So you can see that it's printed here. Uh this is like just a quick example but it's really powerful when you have like a shared code base and things that you usually do and need to run on ripple you can do that. So thinking about this and also inspired by Calva uh you can configure this in your project also in your user configuration in your machine. So every project has uh and a nice thing that uh Calva has and we also added is that let's say that I have a library and I want to expose with my library some cool comments that people usually do uh to be easier for them. So here just yesterday I uh I watched a workshop about clay and I just made it here. So uh I create so my library does not do anything. It's just an example. So but I create this celljrepple intellig exports and I put the config at the end there. So I just say that this is the name uh and do this like require the clay API and do the clay make for a single form uh and also uh for the current file you can also do this. So what could what happen is that I can go here uh and say uh clay uh run this single form to me make and it will just open uh the notebook that they do and uh open with the result here. It's pretty nice but also I can do this for the uh entire file. So the current file and it just evaluate all the things here and show to me. So uh this is pretty nice. Guys, I would like to test this with Civas repository to check how it works. Uh, but it's a really powerful thing. Uh, the last feature that I want to share here, uh, I will connect with the the remote. Uh, so I just stop it and I'll play here. So I am already connected in a remote. Uh, so let's go back here and uh, sorry. Okay. So I'm just uh load the the file. So let's show it to you. So I loaded the file and it shows to me a loaded file and the the all the path right. Uh so the ripple that I'm connected is an internal ripple. So when you build the plug-in locally in the development environment uh when you use it inside the intelligj we just run a ripple inside the intelligj. So I am connected to the ripple of my plug-in inside the intelligj. So what I do is that so this is the function that loads the file in the ripple. So I will change here to say hey closurians I loaded the file. Okay. So I will evaluate the the fun at the cursor. And now if I just load the file you can see hey closurian. So uh this is pretty probably most of you know the power of the ripple. So uh developing a tool for your development environment and be able to hack while you are developing is pretty nice. So uh it's a good experience and both the closure repo intelligj and the closure intelligj both have this uh this feature. So it's pretty nice to uh to work with this and like easier also to understand and uh hack your own environment. Nice. Uh so uh yeah I show most of the features here and uh just to uh this is just like some prints so if the demo goes wrong I can I have them. So challenges and learnings. Uh so the first challenge is the intelligent API. Uh it's really hard the documentation they change and do breaking changes a lot. So it's pretty hard to follow. Uh and also they expect a lot of classes, right? Uh so I have to work we have to work like a lot of geni proxy proxy plus and it's really hard to understand this and have documentations and good examples. So was pretty hard to make it happens. Uh but I learned a lot. Uh there is a lot of interoperability and as I mentioned uh we have one single jar that runs in every uh IntelligJ versions. We decided to do this but since they have breaking changes uh I need to do some reflections to say hey does this method exist or this method exist but this is the signature because they change the signature because they want uh so was pretty nice also work with cider ando and midor was the first time that I was like in the other side like take a look to the protocol uh it's pretty Nice. Also, there's a library called CISL. I don't know if you know it, but was my first time. Also is a library to use like the Java swing AIS uh build them. So all the configurations that I show is built with this uh library and also tests uh was really hard to do like test the closure is pretty okay like we know how to do that but I just want to show uh something that we made that is like uh like this uh repo without test. So let's me get some zoom here. Uh and so this is just like I create a fixture for my project. Uh here I just create a file that is a deps EDN. I create a project. Uh and then I say open the fixture the deps file in your project. Uh so I can get like the closure rep or closure running. And then I just create like a configuration as I mentioned right. uh I put the project name and the the type of it uh and then I just execute the configuration. I wait the console UI to be ready. Uh then I just go there and say uh wait to be like the user prompt expecting. Uh then I just say oh now try to evaluate this on the console. uh and then check if the content is like the the sum of one and one the result two and then it's expecting the user to get to put the prompt again. So this is a a big challenge and also really good to to see. So uh that's it. Thank you and like I welcome you to try it and also contribute because they are open source and really enclosure. So uh that's it. Thank you all. >> [applause]
Video description
IntelliJ is a popular IDE used by many developers, and now it has open-source options for Clojure development! We’ve created two open-source plugins written in Clojure: - IntelliJ Clojure LSP, which brings the full power of Clojure LSP into IntelliJ—just like what users of VSCode and Emacs enjoy—making it easier to maintain consistent tooling across different editors. - IntelliJ Clojure REPL, which brings the REPL-driven development experience into the IntelliJ environment. In this talk, I'll share about: - features that LSP can provide to you and your projects; - how to configure, execute and interact with REPL; - create code snippets to be executed as shortcuts (and export inside your libs!); - and more.. Both projects are open-source and written in Clojure, offering the community access to the source code and the opportunity to contribute and hack your own development environment. Biography Arthur Fücher is a programmer who loves meeting new people and having great conversations. He's the proud father of Laura and a passionate Magic: The Gathering player. Arthur is the organizer and host of the Clojure BR community, where he works to grow the Clojure ecosystem by sharing content in Portuguese. He's also a member of the InnerSource Commons Foundation. He has been working with Clojure for the past six years at Nubank, across a variety of business domains, and is currently focused on improving Developer Experience. Recorded Nov 13, 2025 at Clojure/Conj 2025 in Charlotte, NC.