Metosin’s Favorite Editors
At Metosin we have a diverse group of Clojurians. Some of them have strong opinions regarding their favorite IDE, some of them are less passionate. It's a joy to read the Metosin slack regarding these discussions. One day I realized that it might be a nice idea to let our blog readers and library users to have a peak inside our Metosin office in the form of informal interviews regarding various topics. The first topic I chose is: What is your favourite IDE / editor setup, and why. So let's start our walk on the Metosin virtual office and interview Metosinians! When reading further remember that these guys really like to pull one's leg - interpretations are your own responsibility.
- Kari: So Matti, which editors have you been using in the Lisp world?
- Matti: For Clojure mostly Emacs. In the early days I used to use some version of SLIME or the Superior Lisp Interaction Mode for Emacs. That was natural as I was using it for Common Lisp too, or primarily, and it happened to have some kind of support for Clojure. From there I moved onto using nrepl.el that later became CIDER which I'm using still. I've tried to use other editors like Vim, Kakoune, and VSCode for programming lisps but in the end I have always gravitated back to Emacs. It just seems to work for me ... at least as far as lisps are concerned.
- Kari: How about visual aid while editing, font, ligature, theme? Any favorites in the Emacs world?
- Matti: I use JuliaMono throughout my system and I'm pretty happy with it. No ligatures as they are more of a distraction and look really bad when they are off. Likewise heavy syntax coloring is a distraction for me. I use my custom color theme that is very monochromatic and distinguishes just between comments, literals, and the rest of the code; barely.
- Kari: And then the standard question: paredit or parinfer?
- Matti: Paredit.
- Kari: And one extra question for you, Matti. I remember that you are also a keyboard enthusiastic like me. Have you already found a perfect keyboard?
- Matti: No but successors tend to be improvements over their predecessors. Currently I use a external 40% Planck keyboard with highly customized firmware as my daily driver.
- Kimmo: I use mostly Emacs, but Fork.app for patch selection & commits, push/pull/rebase happen in the terminal and in Emacs. Long time Postico user for PostgreSQL work, Keynote for presentations. During my time at University, I was avid Linux & Emacs fan (Latex/Beamer yay), but for the past ~15 years, I've been a Mac user.
- Kari: Have you tried IntelliJ IDEA or have you always been an Emacs user?
- Kimmo: Eclipse was the goto-tool during Java era, IntelliJ Idea fly by but didn't really stick with me, Clojure brought me back to Emacs.
- Kari: How about the editor support with Emacs+Cider, are you happy about that?
- Kimmo: Current state is pretty good, getting a ClojureScript repl running in Cider isn't a hurdle any more.
- Kari: How about visual aids like font, highlighting, ligature, theme etc. Are they important to you?
- Kimmo: I haven't gone into font tuning yet, but have used the dark deeper-blue theme in Emacs, finding that dark background suits me best.
- Kari: And finally: paredit or parinfer?
- Kimmo: Paredit, of course (smiling).
- Kari: Did you say that you are a bit clumsy with your tools? Damn man, you are considered as one of the Clojure wizards of this company. I'd really like to hear what you mean with that.
- Pauli: Considered by whom (smiling)? Anyway, I just want to do programming (and Computer Science-y things). Editors, builds and devops should just work and get out of the way. Often that seems like a distant dream in these days of Atom, Webpack and Kubernetes (sigh). I use Cursive for Clojure at work because it works out of the box and jumping to documentation and definitions is very convenient. For everything else I use (Neo)vim... and Make (laughing). Stuff that is always available, barely changes and does not make your computer slow. I guess I had my fill of trying out different options and configurations with Linux distro- and DE-hopping. Although I am still on Arch Linux with i3 (Sway at home, yay!) instead of e.g. Ubuntu or Fedora.
- Kari: Interesting. I guess various visual aids like font, highlighting, ligature, theme etc are not that important to you?
- Pauli: I use Solarized Dark whenever possible. High contrast in general and white backgrounds in particular are painful to look at. The dark mode trend was way overdue; as a Linux user I always felt that everything should be themeable, at the very least to avoid snow blindness. The usual token type -based syntax highlighting only serves to anchor the eyes and does not get any better than rainbow parens. If Lisp is "oatmeal with fingernail clippings" to Larry Wall, now I have a blueberry smoothie with sprinkles. Much more appetizing, but how much more sense does it actually make? I suppose I should try semantic highlighting some time, and learn more Paredit than just slurp, barf and raise. In any case the highlighting of matching parens or variable uses/definitions is more useful than token coloring. In DrRacket it even works with custom macros! I wonder if that would be possible with Clojure (Colin, are you reading this?). And no, I don't bother with fonts or ligatures. Monospace fonts are necessary to follow indentation but unavoidably ugly. Ligatures seem like operator precedence to me; slightly prettier but can't possibly scale. (What is the relative precedence of
<|>in Haskell? Beats me. In Lisp we just say screw it, let's not bother with infix operators at all.)
- Kari: Ok. So, it's paredit then. Have you ever tried parinfer?
- Pauli: No. I probably should, especially since it comes with Cursive now. Or maybe forget about both of them and spend my evenings practicing Vim instead of Bach's Inventions?
- Kari: You gave an interesting comment when I announced this idea that I'd like to write a blog post regarding which IDEs / editors Metosinias use. You said: "Maybe I finally configure my editor configuration".
- Kari: How about visual aids: font, highlighting, ligature, theme? Any preferences?
- Miikka: I just use the default settings of the editors.
- Kari: And finally: paredit or parinfer?
- Miikka: Paredit. Parinfer had not been invented yet when I started learning Clojure, so the choice was simple. By the time it popped up, I had gotten very comfortable with Paredit, so I have never even tried Parinfer.
- Kari: First I need to ask you about that Mac keyboard (laughing).
- Tommi: I broke my Mac laptop keyboard by resetting my Integrant system too many times.
- Kari: I remember that story. Would you like to share it with our readers?
- Tommi: Having the Butterfly keyboard on my Macbook, which really sucks, will send it for repairs on winter holiday (we have that in Finland). I'm using
Save File+ (integrant)
resetworkflow zillion times a day and because of that keys
lare totally busted. Having shortcuts for mostly everything.
- Kari: So, you are an IntelliJ IDEA / Cursive user. Have you ever used or considered Emacs? Is there something special you like about Cursive?
- Tommi: I started with Emacs back in the 90's, used it for everything possible. Switched to Java IDEs in the early 2000 and haven't gone back, too busy re-learning to use it. Cursive is great for Clojure, a bit laggy, but gets the thing done, and I really love the deps, java & testing support.
- Kari: How about Integrant, I guess you use it quite a lot as part of your Clojure programming workflow? Would you like to tell something about it?
- Tommi: I think Integrant is IoC done (mostly) right. Also, while developing, the repl gets dirty quickly and being able to
resetthe whole system is a killer feature. And we are doing that in the clouds too: having an Nrepl open in an app deployed in Kubernetes cluster and being able to play with the app from local IDE is kinda mind-bending compared to traditional deploy cycles. Just have to remember to use Integrant's suspend+resume on the
nreplserver or you get thrown out on
- Kari: How about the font? I remember seeing in some pair programming session that you prefer Ligature symbols e.g. in threading macros?
- Tommi: The most common question when tweeting with screenshots is: "what's the font, please?" (smiling). I use Liga Menlo - Menlo transformed via Ligaturizer. When Sam Aaron was at first ClojuTre in 2012, he had an inspiring talk about tuning your tooling, "Build your own lightsaber". We are using our computers a lot and aesthetics matter too: fonts, colors etc.
- Kari: Paredit or parinfer?
- Tommi: Paredit. (You can see an example of Tommi's editor theme here )
- Juho: I use Vim, because it is Vim. Everything else is shit.
- Kari: Heh, a bit harsh talk (coughing). Would you like to clarify that statement a bit?
- Juho: No.
- Kari: Ok. Paredit or parinfer?
- Juho: Not quite either. I use vim-sexp and vim-sexp mappings for regular people. It is a plugin for "precision editing S-expressions", so quite similar to Paredit, but it is built on top of Vim modal editing and text objects and commands, so it works a bit differently. It doesn't affect the insert mode (that's where you can write text) at all. Instead, it provides some new text objects and commands which are used in normal mode (the mode where you don't write text, but just use commands). New text objects, like one current form, which work together with Vim text commands, like built-in delete or change commands, or the command to send the text to REPL. It also provides some new commands like moving parenthesis, and these also work with all Text objects, not just those added by Vim-sexp.
- Kari: I remember hearing that it was you who initially suggested that Metosin starts using Clojure?
- Jarppe: Yeah, that’s true. We all - me, Tommi and Mikko - had been programming in Java for a long time. In one of my projects at that time we used immutable data structures a lot. At the same time I experimented with Scala and Clojure on my hobby projects. Working with immutable data pipelines felt really natural and fun in Clojure, and I kind of fell in love with it. Then Metosin got a new gig and I proposed we should try Clojure. The rest is, as they say, history.
- Kari: A legendary history, indeed. Which IDE / editor did you use in those early days?
- Jarppe: I can’t remember what I used in the early days, but pretty soon I started using Eclipse with Counter Clockwise plugin. It was a really good plugin, and since most Java programmers were familiar with Eclipse it provided a gentle path to try Clojure. I remember that I actually made a video training material regarding how to start programming Clojure and use Counter Clockwise plugin.
- Kari: How about nowadays? Are you still using Counter Clockwise?
- Jarppe: The last 5 years or so I have been using IntelliJ with Cursive. Cursive is just amazing.
- Kari: Are visual aids important to you, like font, highlighting, ligature, theme?
- Jarppe: Yeah, I’m very used to syntax highlighting and ligatures, so when ever I see code without them, I feel like it takes a little bit more cognitive effort to understand it.
- Kari: Paredit or parinfer?
- Jarppe: Paredit.
- Kari: Kalle, which IDE / Editor are you using?
- Kalle: Emacs.
- Kari: Have you always used Emacs?
- Kalle: Always used emacs.
- Kari: What are the most important reasons for you to use Emacs?
- Kalle: I’ve always used it, so it’s what I know.
- Kari: Paredit or parinfer?
- Kalle: Paredit.
- Kari: Tuukka, which IDE / editor are you using?
- Tuukka: Recently, I have been programming mostly in Python and I use VSCode. I also had little experimentation with Clojure using the Calva extension about half a year ago. Before that I mostly used IntelliJ IDEA + Cursive which was really great for Clojure. I especially liked the refactoring functionalities in Cursive. DataGrip is another tool from JetBrains that I use for database-related tasks (mostly working on queries against Oracle/Postgres).
- Kari: Why did you move to VSCode?
- Tuukka: I switched to VSCode about a year and a half ago after moving to a Python-project. The main attraction was the large ecosystem of available extensions. Probably I will try to use VSCode + Calva when programming in Clojure again. I have a gut feeling that VSCode is pretty popular nowadays and a good VSCode extension probably helps if someone new to Clojure wants to play with it. One VScode feature that I am now relying on is the SSH remote development which seems to be functioning pretty well with my development VMs.
- Kari: Do you use some special mode like emacs or vim?
- Tuukka: I have Vim extension enabled on DataGrip and NeoVim integration on VScode. To be honest, I have been pretty lazy learning the Vim tricks until now. Actually, I installed the VScode NeoVim integration to solve the horrible VSCode input lag I had with default settings. Then little by little, I started to learn the Vim stuff. I do not have any interest in participating in editor (or language) battles. Someone might like and get the job done with PHP and Notepad++ and I am quite okay with it.
- Kari: Ok. Are visual aids important to you, like font, highlighting, ligature, theme?
- Tuukka: Yes I think they are pretty important. As a programmer you read and write lots of code so it makes sense to improve the aesthetics and readability with font selection, theming and so on. Inversely, bad theming e.g. with incomplete language keyword coloring can make things harder to read. Many years ago, I had an Ubuntu dev machine where IntelliJ IDEA font rendering was just horrible. That combined with the default Darcula theme must have been visually the worst experience ever. There is one pitfall however: with beautiful font rendering etc. you can fool yourself that the code you wrote is beautiful. Like with articles written in LaTeX: even mediocre content seems better on pretty LaTeX output (smiling).
- Kari: Heh, ok (smiling). Final question: paredit or parinfer?
- Tuukka: Paredit. I did try parinfer but gave up since I already had learned the most typical paredit commands to feel comfortable enough with it on daily work.
- Kari: So Jari, Which IDE / Editor are you using?
- Jari: I'm using IntelliJ. Initially the main reason for choosing it was that also Jarppe was using it, and it must be good (laughing). Eventually I've realized that built-in functionalities are really useful as my main job is not software development, and I might need to do various stuff only seldom, i.e. getting the IDE to help me as much as possible is a joy.
- Kari: What are the most important reasons for using IntelliJ?
- Jari: As I said earlier, for me the most important thing is time saving stuff, in the sense: how to do this correctly. I think exploring structure in data is something that I've found really cumbersome. This is something that might be related both to Clojure and Python and I have not found a really good way to explore data structures outside of coding helper functions. For example: You have a table with tens of columns and thousands of lines. The data has been originally read from Excel, but then the data has been modified in code. Then you encounter stuff that does not work (error in data?) and you would quickly want to find out where the problem lies. Good visualization of the data structures in the IDE would really help. Writing helpers to debug and print code in the console is the current way (for many developers). But how to do this better? Any comments from my colleagues are welcome.
- Kari: So Anssi, pick your poison: Emacs or IntelliJ?
- Anssi: I have used IntelliJ IDEA and Sublime Text also. But I must confess that I'm really an Eclipse fan boy.
- Kari: Eclipse? I believe you belong to the minority then, with the Vim guys.
- Anssi: Eclipse is awesome for Java, but sadly many plugins are nowadays abandoned. On the other hand many things work better in Eclipse than in IntelliJ IDEA.
- Kari: Such as?
- Anssi: Eclipse hot keys! Oh, I almost forgot: I did my Master's thesis about Eclipse plugin!
- Kari: That makes you an Eclipse master! How about fonts, do you have a strong preference regarding fonts?
- Anssi: Nope, as long as there are ligatures (laughing)! Ok, I have been using JetBrains Mono but also Fira Code.
- Kari: And finally: Paredit or parinfer?
- Anssi: I don't have a strong opinion about that.
- Kari: Miika, IntelliJ or Emacs?
- Miika: I use mainly IntelliJ Idea with Cursive. I try to avoid spending my time with configuring and updating things for no reason as with every update things can potentially break (or even worse, change). IntelliJ and Cursive simply work out of the box and do not require endless hours of editing config files just to get syntax highlighting to work. Fragile updates are even greater risk when a piece of software is dependent on another as it is the case with IDEs and their plugins. I mean, if it ain't broken don't fix it. In fact I have "fixed" my current setup only once so my IntelliJ and Cursive both are builds from early 2017. I only dared to update for some cool Cursive feature that I wanted really badly. I can't remember which one but it might have been the "jump to event definition" feature for cljs namespaces. I'm afraid the changelog only goes back to 2019 so there is no way to tell for sure. Some new Cursive features are quite tempting, though, maybe enough so to get me to update my tool chain again.
- Kari: Unbelievable! (looking Miika's IntelliJ IDEA About window: "IntelliJ IDEA 2017"). I always use the latest IntelliJ version. Would you like to tell our readers something about your visual aids, theme etc.?
- Miika: The theme I use is IntelliJ's Darcula. It looks nice and is easy on the eyes. As for version control features I mainly use git via its command line interface but IntelliJ has a great tool for resolving merge conflicts that I find useful.
- Kari: How about the classic Clojure editor question: paredit or parinfer?
- Miika: I like paredit as parinfer always seems to mess up my namespace when I give it a try. Things break and I don't like it so I fall back to paredit. Propably an user error but I don't see the benefit.
- Kari: Ilmo, which editor or IDE are you using?
- Ilmo: I use a few different editors: Cursive/IntelliJ, Vim, VS Code, and Sublime Text 2/3 (ST).
- Kari: Interesting, you have quite a few editors in your toolbox, I guess that makes you a Jack of all editors (laughing).
- Ilmo: Right. I originally started out my career with ST, editing Python code with it and also using it with my Clojure hobby projects. I later exited the Python industry for some time and found out about Cursive/IntelliJ with the permissive non-commercial license. When I started working in a Clojure customer project, I was already using Cursive and continued using it (with a commercial license). Somewhere along there, I started phasing out my ST habits to learn more Vim. Usually because terminals would have some combination of editors to get by and Vi/Vim were one of them. I’ve used Vim for editing IaC files and some occasional Python scripts. VS Code is a recent editor during this year for React/TypeScript frontend work that I’ve been doing in my current customer project.
- Kari: What are the most important reasons for using those editors?
- Ilmo: Well, for Cursive/IntelliJ the most important reasons are code navigation, refactoring, structural editing, and REPL-integrated development. I also occasionally use the Cursive debugger. Multi-caret support for the occasional “non-refactorable” string replacements is also nice, as is ability to use library code and navigate Java classes.
- Kari: How about other editors, Vim, VS Code and ST?
- Ilmo: For Vim, portability and the fact that you can find Vim in most *nix machines. Vim is a good general editor. I used VS Code when learning the TypeScript ecosystem - didn’t want too many distractions, and it was generally well understood and supported by the customer project teams. ST has a good multi-caret support, and is also a good general editor.
- Kari: If you are using the standalone Vim, do you use also the Vim mode in IntelliJ?
- Ilmo: Nope. I try to keep my setups somewhat vanilla because it empowers others to use my setup during pair coding sessions (once we can all huddle together without fear of the ’Rona).
- Kari: Are you mostly happy with IntelliJ or is there some feature that you especially miss?
- Ilmo: At least more integrated formatter support, shortcut functions that you could apply to code and receive code as output (if this is possible already, then I just haven’t figured it out yet), and reorder namespace imports in lexicographic (ascending) order.
- Kari: Since you already know quite a few editors, is there one more you'd like to learn?
- Ilmo: Well, Emacs. Maybe also some Python IDE.
- Kari: You don't like IntelliJ as a Python IDE? I thought it has a pretty good Python support?
- Ilmo: I just haven’t tried hard enough to really form an opinion. I tried importing a Python project once as a module to a Clojure project, but somehow I never got it working. For me, using and editing Python from the command line has always been a thing, but at times I’ve felt the pain of lacking an IDE not least when I had to maintain a largeish Python codebase.
- Kari: One last question: paredit or parinfer?
- Ilmo: Paredit. I think my editor picked a default for me and it was maybe paredit at the time? I have no strong opinions for either, and I would like to try parinfer during some quieter learning time.
- Kari: Lassi, which IDE / Editor are you using?
- Lassi: IntelliJ (Ultimate, Rider, Android Studio). IDEA has been my main IDE for quite a many years now.
- Kari: Interesting. For what kind of work are you using Rider and Android Studio?
- Lassi: I tried configuring plain IDEA for Android development, but found out some quirks and settled to Android Studio, it’s IDEA under the hood anyways, given I have plenty enough memory to spend. Rider is for C# development when working on Unity projects.
- Kari: What are the most important reasons to stick with the IntelliJ family?
- Lassi: IDEA just (mostly) works and familiarity gives speed. There is a big array of extra functionality through plugins, and the code completion, code navigation, and refactoring experience is superb.
- Kari: Is there some specific keymap like Emacs or Vim mode you use with IDEA?
- Lassi: I’m doing casual quick editing with Vim and I do like it as an editor. But with IntelliJ I'm not using the Vim mode. I have tried it a couple of times but seems too big a jump to get it really working, though entertain the idea from time to time on delving into it. I kind of secretly harbour the idea that I would become so fluent in Vim that I would really do most of my coding with it. I practice some Vim trickery from time to time, but then the reality kicks in and I’m back in my safe haven with IDEA (laughing).
- Kari: Ok. If you really consider start using Vim as your Clojure editor I recommend you contact Juho - he's pretty fluent with Vim and uses it as his main Clojure environment. So, the last question: Paredit or parinfer?
- Lassi: Parinfer! I love it!
- Kari: Miika, your favorite editor or IDE?
- Miika: I started writing Clojure with Emacs, must have been around 2011. I’m not actually sure which one was my main editor back then Vim or Emacs, but somehow I ended up using Emacs with Vim keybindings, the Evil-mode. It’s also unclear why I swapped to IntelliJ/Cursive. Probably had something to do with the big hairball Emacs configuration running totally out of control and supposedly easier debugging experience on the Cursive side that I actually never really remember using. At some point I tried to use IntelliJ IDEA with Vim mode too - didn’t like it, and surely enough, don’t remember exactly why. That’s a lot of unknowns.
- Kari: But you are still using IntelliJ IDEA? Which mode are you then using?
- Miika: Yeah, I’m using Cursive with pretty much vanilla keybindings, usually a bit older vintage, maybe a year or so, so things are not broken. Only specialty is some templates for datomic queries and maybe other project specific stuff. I’m certainly less invested in configuring editor than I used to be. Maybe it has to do with the fact that I use much more time on reading code, in Excel and in the Markdown editor writing stuff up (for that I use Typora - not only use, I think in Typora) than writing code. Ah, that reminds me, Cursive has very nice find usages for Clojure functions. And even for Re-frame subs and handlers too. I think that was one of the reasons I got stuck using Cursive, I just couldn’t get that working nicely in Emacs/Cider back in the day. I’m sure it was/is possible, but there we go.
- Kari: Final question: Paredit or parinfer?
- Miika: To be completely honest, I had to google up what's the difference. Paredit.
- Kari: Teemu, you are the newest member in the Metosin family. What is your favorite Clojure editor or IDE?
- Teemu: I use IntelliJ IDEA with Cursive, mainly because it's easy to get working and it comes with nice features out-of-the-box. I use the different refactoring tools a lot, e.g. renaming vars and keywords(!). I've thought about learning Emacs many times, and even started down that road a couple of times, but it just feels like I would need to invest so much time into it until it reaches a similar level of comfort and power, that it's hard to justify. I'm ready to believe that in the end I could get more out of Emacs than out of my current setup, but on the other hand IDEA+Cursive probably does offer some features that are not available, or just not as good, in Emacs.
- Kari: How about theme, font, and ligature symbols, any favorites?
===is pretty important, and it's really easy to distinguish
==thanks to the exclamation mark. I enjoy tuning the aesthetics of my editor too, but to me ligatures have an adverse effect on readability. Maybe you get used to them after a while though. I've never gotten into fonts. I like Solarized Dark, though I really only use it in my terminal. I use the Dracula theme in IDEA, because the last time I tried using alternative themes, not all UI elements got the new theme.
- Kari: Paredit or parinfer?
- Teemu: I use paredit (or well, maybe a subset of it). I learned to use it quite quickly after starting to use Clojure five years ago. Parinfer wasn't a thing back then, I think? Not sure which one I would recommend to new clojurists right now.
- Kari: So, you are the last one?
- Kari: Yep.
- Kari: I understood you are an IntelliJ / Cursive user?
- Kari: Yep. I started my career programming C, C++ and Java with Emacs. Later on I switched to Eclipse. Then IntelliJ IDEA with Emacs mode. I really like IntelliJ IDEA / Cursive but last winter I also made an experiment: can I configure Emacs to have as much look-and-feel as my IntelliJ IDEA / Cursive setup. I was pretty successful - all my favourite hotkeys now work exactly the same way in both editors, and both editors have the Leuven theme which is kind of nice to my eyes.
- Kari: Paredit or parinfer?
- Kari: Paredit, no question about it. I have configured nice keymappings for slurping and barfing - couldn't live without it.
- Kari: Anything else?
- Kari: I really like Cursive but I guess I could live with Emacs also. But I'd like to mention that there are two things I won't change for the rest of my career.
- Kari: ... and they are?
- Kari: Paredit and my Dygma Raise keyboard.
- Kari: Ok. One final question. Is it really true what they say about you that you discuss with yourself in the Metosin slack?
- Kari: Where did you hear that? Do they think that I'm some sort of a Clojurian with a multiple personality disorder?