What attributes make vim so enjoyable to program in?
I hope by parametrising this well enough, I can prevent it from being opinion based. I do believe there is a relatively objective answer. There may be more than one element to the answer.
It's a common joke that users of vim or emacs love their editors. More than just considering them useful, they actually evangelise for them. In truth, I don't know if they are more efficient to use than a traditional IDE, but they are more pleasant to use than a traditional IDE. Using vim 'sparks joy' to borrow a phrase from Kondo. I strongly suspect this is the real reason why many people love them, it's not really about productivity at all, it's about happiness. That would also explain why other people find this enthusiasm so baffling, while there are activities that many people find fun, very few are fun for everyone.
But, vim is not a video game. It doesn't contain features that I immediately recognise as 'fun'. Admittedly, coding is fun, but if that was all I was getting, eclipse ought to bring the same joy, and it doesn't. So what features could incidentally be making the user happy? Or at least facilitating frustration free programming?
Background, in case it is relevant.
- I use vim for programming and writing LaTeX.
- When I first learnt to program I used IDEs (I tried eclipse, netbeans and visual studio). This lasted for about 4 years. These all evoked some frustration.
- I am very dyslexic. Reading menus could be the problem, but I don't mind it in other programs. I've tried CLI browsers and email clients, I prefer GUI for these things.
I'm interested in understanding this, because it's something people tend to challenge when they notice ("Oh why don't you use a IDE?"). I'd like an explanation that focuses on why I like vim, not the fact that I found IDEs annoying (most people respond badly to hearing that you don't like their way, but better to hearing why you enjoy your way). Also, as mentioned in point 2., it doesn't seem to just be a preference for CLI, so what should I look for to find other software I will enjoy this much?
Comparisons
I've been asked to be more specific about the differences that matter most. Here is what I believe are the key aspects;
- Transparency; when using vim, I feel like I understand everything that is happening. For example; it is clear to me where a file is saved, and when it will be saved. If anything is automated, it's because I added it, and I can have an overview of everything I've added in vimrc.
- Debugging; it's easy to fix is something doesn't work. Error messages seem concise and clear, often they are enough to figure out what I did wrong with no external input. Without a GUI, no screenshots are needed to explain what happened/what should happen/how to fix problems, this makes it much easier to find and ask for help.
- Behaviour is better explained. If I'm following instructions on a GUI it may say "Open the Foo menu and click the Bar option", sometimes the Foo menu doesn't have a Bar option, or Bar is greyed out. That could be because I have a different version of the program, but often menu options appear and disappear depending on the state of the file or the program. If they are greyed out, there is often no explanation for it. By contrast, entering an invalid command into vim will normally spit back an error that explains why the thing I've asked for doesn't make sense or isn't available with my version.
- Behaviour is more consistent between versions. I have no idea why GUI designers like rearranging their menus so much, but it seems to be a common issue when trying to follow instructions to achieve something. If I have changed a shortcut in vim and forgotten, I can find that change in vimrc.
- My understanding of how to do something in vim is modular. I can write a macro that uses a my understanding of marks, navigation options and regex, that macro can then be applied a given number of times across multiple files. Each element of that operation requires only a simple idea, but as they can be slotted together, I can do something complex without a complex interface. For this reason, solutions to different problems can be built from variations of the same actions, for example, changing strings formatted with python's
format()
to format strings has a lot in common with changing the spacing of list brackets. They could be macro'd with the same basic commands. GUI menus don't seem to offer the same modularity, and macros are often much tricker to produce. - Clutter; vim creates very little visual noise. Options are totally hidden until you call them. As a result, you only ever see the bits you understand. Opening a GUI, and seeing lots of icons that I don't yet understand can feel a bit overwhelming.