Vim. It was a name that inspired both awe and fear. No, I am not talking about this:
I meant this:
For a very, very long time, I was reluctant to use Vim. I thought it was for experts and those ultra-legend programmers of yore. If quitting Vim was supposedly enough of a meme, then actually doing anything in it would be the stuff of legends, right?
Well, last year, my friend started using it. And making some cool stuff. Things like nvim, nerd-tree, tmux, neofetch, etc, made it seem like he had ascended to the next level of programmer-kind. And then he showed it to me and said: “Learn and use Vim; it is very useful and easy. It is up to you, of course, but if you don’t, then I’ll silently judge you”.
Very nice friend, I agree. But his challenge to me was the catalyst that led me to adopt Vim to see if it really lived up to the hype, and I got a pleasant surprise when it proved to be less hard and more useful than I had thought earlier.
The Initial Days
I use an Ubuntu-based laptop. Consequently, firing up Vim was easy, and one of the first things I learnt was how to come out of it xD. I started following this tutorial from Ben Awad and made some good headway.
One of the greatest obstacles that I faced was the use of the keyboard to the complete exclusion of the mouse. I was not a touch-typist, and normal IDEs and text editors had made me heavily dependent on the mouse for anything other than typing code. So I had to unlearn my old instincts before developing new ones further.
Following the philosophy of “what gets measured gets managed”, I began practising touch typing on Monkeytype. It is not that I did not know of more websites that take a more structured approach to teach you how to touch type. In fact, I had tried them countless times before. But theoretically knowing which keys to type with which finger is very different from practically developing the muscle memory to do the right thing while typing. The structured examples seemed too artificial to me.
If you have ever been on Monkeytype, you know how it is. It basically throws a bunch of randomly generated text at you. There are a few settings that you can alter, but on the whole, it is a very minimalistic website. The whole point is to start typing whatever text they have given, and later, they will give the stats for it.
I like its minimalistic design and philosophy of quick feedback, which gives me a great way to know where to improve. The sentence words are mostly what you use every day, so it gives you a good example of what people normally type (certainly better than those contrived examples like “rerquiop” or “fjklsadffdsjaldfdjlsk”).
I practised using the normal word set containing only the lowercase English alphabet. Of course, for a programmer, that is not sufficient, but I observed that if my speed and accuracy on this subset of the keyboard increased, there was a sizable increase in them in general. Since then, I have also tried practising on an expanded word set, but for beginners, this is a good way to start.
It was not easy. One of the main hurdles encountered while unlearning something is that you temporarily become very slow in doing something you were used to doing fast. In this case, it's typing, of course. Before touch-typing, my average speed was around 20-25 WPM. After I began learning, it dropped to around 10 WPM, sometimes going as low as 1-2 WPM!
This is enough to demotivate the best of people, and I was no different. But what used to pick me up in these times was the stoic concept of control. I could not control when or if my typing would improve. What I can control, though, is how much practice I did. So I did what Cal Newport has described as ‘deliberate practice’ in his book So Good They Can’t Ignore You. That is, pushing myself a little more than what I normally do. If your speed is x WPM, then try to type at a speed slightly above that. I did this for half an hour daily and just typed normally the rest of the time. For that half an hour, though, it was just me and the keyboard. Nothing else mattered. I did 15-second sessions almost continuously for half an hour.
It is usually recommended to focus more on accuracy than speed, which is true to an extent. However, for the perfectionists among you, each wrongly typed character is an itch to be scratched, speed be damned. I found that rather than 100%, maintaining a 90%+ accuracy was a better way to get me off the ground. So, in that half an hour, I just typed on my keyboard, churning out what would be pages of random words (you should definitely read that book), typing for 15 seconds and then glancing through the feedback for 5 seconds, and then back to it. The exact details of feedback didn’t matter to me; I only wanted a 90%+ accuracy maintained as I tried to break past my WPM limit.
Slowly but surely, it started paying off. Over the course of a few months, I could see the change. My first milestone was equalling the speed that I had before I started touch typing. Soon enough, I surpassed that, and I am somewhere in the 55-60 WPM range at present (and above 95% accuracy), which is good enough for most purposes (Although I know there is still a lot of room for improvement). Now, it is more effort for me to type at 20-30 WPM, as my fingers are so attuned to the keyboard.
Learning by Customising
Parallely, I continued to learn the basic movements in Vim. It is a treasure trove, and I keep finding useful stuff in it even today (more than a year later). What I discovered here was the same problem as I had in learning touch typing. Beyond knowing what the combinations are, the artificial examples did little to develop my muscle memory when using them. I was still very prone to use the arrow keys for movement rather than j and k, and I would instinctively reach out for the mouse before remembering that it was useless here.
Then, I decided to learn Vim by doing something real in it. Fortunately, a very real-world example presented itself quite naturally: I set out to customise Vim to my liking.
I started tinkering with the .vimrc file. Interchanged the functions of 0 and ^. Made it display the file directory. Enabled line numbers and relative line numbering. Changed themes.
I could continue to customise Vim like this, but soon enough, I found something even better.
Enter NeoVim
The good friend who initially set me up on this path was not using vanilla Vim. What he was using was Vim ascended: NeoVim.
NeoVim is basically Vim with a lot of extra customizability and other cool stuff. First of all, instead of the basic VimScript that Vim uses for customisation, NeoVim uses Lua. You can imagine the increase in power of a full-fledged programming language with full support for functions, variables and the rest over just a normal scripting language limited to statements and expressions.
Which also means that you end up typing more, and in multiple files. I discovered some of the features, like multiple panes, marks, file tree, etc., because of tinkering around in NeoVim. I custom-designed my configuration and, in the process, became adept at handling the Vim bindings.
Since then, I have shifted to an out-of-the-box customisation given by LazyVim, as I felt that writing actual programs was more fun than changing plugins all the time. I know some of you would vehemently disagree on this point, but that is the viewpoint I have arrived at. Customising was a means to an end, to learn how to use Vim. Once I knew how to use it, I just settled with a good IDE and started aiming at higher things. Ships are safe in harbour, but that is not what ships are made for.
Edit on 2025-10-07: After installing Manjaro, I installed NeoVim on it, and this time, to understand the process and Lua better, I configured the plugins myself using the lazy package manager. I am definitely my own critic now!
Going Vim Beyond Vim: Vim Fever
Of course, I got what people call the ‘vim fever’. Once you get hooked to it, there is no going back; soon enough, you start seeing how to use the Vim movements everywhere.
Browser? You have to ‘C’ Vimium C. File manager? Move around with vifm. Desktop Manager? You can’t get better than i3. Want a full-fledged IDE with multiple project support? Replace VSC with NeoVim and tmux.
I started doing stuff even on my office laptop. We have to use a web code editor, which sadly does not have a Vim mode. But I found a cool extension that I could use to hook up the editor with VSCode on the laptop. And guess what I did next? I installed the Vim mode from the extension marketplace in VSC xD.
Takeaways
This whole learning Vim has been a whirlwind journey. Along the way, I learnt a lot of other things, and I am not referring just to touch-typing. Resilience, wanting to keep growing out of your comfort zone, and curiosity to keep knowing new things are some of the most important things not just for your professional career but for life in general. When faced with a challenge next time (and there will definitely be a next time; this is life), it can be useful to remember what Seneca said: Difficulties strengthen the mind, as labour does the body.
Interestingly, I would probably have seen this very differently just a few years back. Due to various reasons, I was in a very different mental state back then. I would have more likely than not taken what my friend initially told me in a negative way, then got discouraged when results did not immediately materialise, and not be able to give the intense focus required for learning to touch-type.
Indeed, I had tried touch typing earlier and never got used to it. Sticking to the more conventional websites which teach touch typing might have been a problem, as muscle memory cannot be “learned” without practice. But a deeper problem was my inability to focus for long periods of time.
This time, though, was ripe for me to tackle this problem. I had recently started incorporating Stoicism into my life (though it would still take me a few more months to discover that name), was relatively free in my final year of college, and had this friend as a neighbour in my hostel, who started delving into Vim in the summer holidays before our final year started. The confluence of all these at the right time in the right place shows that when the student is ready, the teacher appears.
Conclusion
There’s no substitute for Vim if you want to take your coding game to the next level. It took me a significant investment to learn Vim for practical use, but it has paid me back many times over in my career. Now, I am at the point where I cannot imagine life without it, somewhat like this guy.
So, should you invest your time in learning Vim? I will let Marcus Aurelius take this one:
Waste no more time arguing what a good programmer should be. Be one.
Thanks for reading this! Let me know what you think in the comments.
For more content like this, visit The Stoic Programmer!
Top comments (0)