I’ve been giving IntelliJ a shot once again, because that’s what the other devs use at $DAYJOB. I figured I’d give it a decent try before I put the time in to configure Neovim for a new stack. (We use Elm and Golang at work.)
The good
It’s easier/simpler to configure. A couple of plugins and I’m set up with whatever language I want.
Autocomplete! I’ve been reluctant to invest the time in setting this up in Neovim but it is genuinely useful.
The Vim plugin gives me most of my editor muscle memory back.
“Extract function” refactoring from a menu is convenient.
The bad
So. Much. Clicking.
All the configuration is through the GUI. It might be possible to check it in to version control anyway but I’d have to figure it out.
Vim plugin interferes with normal IntelliJ commands. “Select + tab” to indent no longer works.
When an IntelliJ plugin takes a long time to parse a file it pauses the entire editor. This is fixable by telling IntelliJ to ignore the particular file that’s causing the problem but dang.
IntelliJ doesn’t pick up my normal shell settings, so I have to go in and tell it things like where the path to Elm or Golang is. It can’t just look up the default locations from environment variables. This is irritating when I’m using asdf.
Sometimes slow to update its model of a file, it’ll still show me error squigglies for a while even after I’ve fixed the type issue or whatever it was picking up.
My opinions on editors
VSCode is a good starting point for people who don’t already know a Neovim editor. It’s easier to learn and to configure. But the underlying functionality isn’t that different from Neovim at this point, because the vast majority of its features are provided by tools that are also available to any editor. If you already know Neovim the main reason to use VSCode is if your company maintains a blessed configuration for VSCode and not Neovim.
IntelliJ is a good choice if your language is well-supported, or if you already know IntelliJ really well. If you’re using a language where you’d be using LSP anyway you’re probably not getting much out of using IntelliJ over VSCode.
The main downside of Neovim is the effort it takes to configure. If you’re reading this you probably have your own list of upsides.
The main thing that’s challenging about Neovim configuration at this point is that you have to make a lot of choices, and then you have to filter every configuration task through the lens of those choices. Once you’ve switched to Lua and selected a plugin manager this gets somewhat easier but you still often need to figure out how to configure a given plugin in the context of the other specific choices you’ve made in your config.
I’m dealing with this right now as I attempt to configure autocomplete. There are several different autocompletion plugins, and there are a variety of different snippet engines, and there are different ways to configure the various plugins, and then I have to translate that configuration into the specific plugin manager I’m using. Using a configuration distribution somewhat simplifies this but at the cost of adding a lot of complexity all at once to my actual configuration — suddenly my editor has a lot of features I don’t know about.
The configuration distributions also largely use Mason to install things like language servers which I really do not like. My editor should not be poking around in my system and adding packages! I have a system for that! I honestly think that Mason is a pretty bad idea. It simplifies installation for distributions so I see why it exists — distributions that use Mason will be easier to install, so they’ll outcompete distributions that require you to understand how to install the language servers you want — but at the cost of requiring editors to grapple with cross-platform package management.
Cross platform package management is a very hard problem!
This is probably just a sign that I’m entering my “old man yells at cloud” phase because I’m increasingly compiling my dependencies myself from source. It’s just simpler.