To some, Vim is a beautiful relic from the past. To others, it’s that annoying thing you have to escape whenever you need to write a message for a merge commit.
Let me introduce you to this picturesque text editor and its wonders, and show you why we’re still using it 26 years after its first release.
So fire up your terminal on your working directory of choice, and enter these commands:
$ echo 'This is a Vim tutorial! :D' > sample.txt $ vim sample.txt
So that we can get down to it.
First steps: navigating, editing and exiting.
Whenever you open a file on Vim, there are three basic things you may want to do:
- Reading the file’s contents
- Writing on the file
- Quitting the program
To move around a file on Vim, use the letters h,j,k, and l. These commands are called motions, as they move the cursor.
The keys h and l will move your cursor horizontally (one character at a time), while j and k move vertically (one line at a time). If you put your hand on them, the layout sorta makes sense.
Some people have trouble remembering which key goes up and which goes down. Pro tip: j sorta looks like a downwards pointing arrow.
As a general note, it is considered bad practice -even though it’s possible- to use the arrow keys for moving in Vim. Get used to using hjkl, and I promise you’ll see a significant boost in speed.
Once you’re confident moving through a file one character or line at a time, try pressing a number (any number, it could have many digits) before moving. You’ll jump as many times as the number you entered.
This is a very powerful concept in Vim: Repetition. Have you ever found yourself editing a text file and doing the same thing over and over? Especially something very mundane, like deleting quotes and replacing them with commas? Vim’s got you covered: Just do the thing once, and press . to repeat it. Enter a number and press . again if you want to repeat it as many times.
Moving around in a text file and reading what’s in it is good and all, but what if we need to change some of its contents? Do not despair, editing a file is as easy as pressing the i key. That will move you from normal mode into editing mode.
When entering editing mode, Vim will be like any other Text Editor (with Syntax Highlighting on), making its functionalities a superset of those available in your typical notepad.
Note that most commands will only be available in normal mode, since they overload the same keys you’d use for typing in editing mode. This means you should only switch to editing mode when writing, and then get back to normal mode for most jumping around and mass-editing.
To exit editing mode, press the ESC key.
How to Quit Vim
To quit Vim, enter normal mode, and press :wq if you want to save your changes (write and quit), or q! if you want to leave without saving.
If you want to quit Vim for real, you can switch to Emacs. Just kidding!
Other Vim commands and useful features
Editing files from the terminal might make you look like a cool hacker or something, but why should we use this text-based program instead of good old Sublime Text? The answer is commands.
How to Delete Text on Vim
Want to delete part of your file? You could enter editing mode and press backspace once for every character. It doesn’t really beat using Sublime and pressing ctrl+shift+left to select a whole word before deleting it.
If you really want to harness the power of Vim, you should try pressing the d key. Pressed once, it won’t do anything. But it’s not sitting idle, it is actually expectant, waiting for an order. Pass it a motion like the ones we learned today (l, 5j, whichever you feel like really) and it will gobble those characters up. For instance, dNl for any number N, will delete the following N letters from the cursor.
Introducing new motions
- e : Moves the cursor to the end of the current word (defined as a concatenation of letters, numbers and underscores).
- w : Moves it to the beginning of the next word.
So if I have this text:
Hello there, general.
And my cursor is standing on the H. When I press de in normal mode, the line will end up looking like this:
While using dw will leave it like this:
Notice how in the second example, there’s no space before ‘there’.
We could then press i to insert some replacement word after deleting ‘Hello’. Luckily, there’s an even more fluid way of doing that: the c command (for change). Pressing c and a motion is exactly equivalent to pressing d+motion+i.
This is starting to look nicer, but it still doesn’t beat pressing shift+home/end and deleting a whole line in a few keystrokes, right? Well I see that, and raise you to the $ and 0 motions.
- 0: moves the cursor to the first character in the current line.
- $: moves the cursor to the last character in the line.
There’s an even faster way of deleting the whole current line though: dd.And if you want to delete many lines? dxd deletes the x following lines.
Useful Vim commands
By now, the usefulness of vim when editing code (and just code — I wouldn’t encourage you to use vim for other text editing) should start to become apparent.
A few other commands you may want to check out are:
- o and O: create a new line above or below the current one, respectively, and enter editing mode.
- v : enter visual mode to select text to which you may then apply more commands. Sorta like perssing shift before moving around with the arrow keys in a normal text editor.
- y or Y: yank (copy) the selected text, or the current line, respectively.
- p : put (paste) the yanked content. Notice that yanking will move text to a special Vim reserved buffer, and not to your usual clipboard. This way, you can effectively manage two different clipboards! One you can paste from with ctrl+shift+v as usual (in editing mode), and the other with p (in normal mode).
- * : find the next occurrence of the current word.
When writing software, I find myself duplicating lines to change a few words quite often, so I think Yp is an amazing command.
I’ve barely scratched the surface with this introduction, but I hope I’ll at least have persuaded you into trying Vim out for yourself. For a more in-depth tutorial, try the command “vimtutor” from your shell, which will launch Vim’s tutorial.
Vim may not replace an IDE if you’re coding in Java or C++, especially if you’re using Frameworks and auto-complete is helping you. But when coding in C or Python, I usually pick it as my editor of choice. And sometimes when I need to transform a string quickly, editing it from Vim is faster than coding a script in Bash or Python.
Some developers also like having the best of both worlds, using a Vim plugin in their IDE of choice, to have access to its most important features.
If you want to learn more, let me know, as I’ll probably keep coming back to this as a series. However, I also encourage you to try the software on your own.Would you help me decide what to write about next? Tell me what's troubling you in this 30 seconds survey!
Vim Learning Resources
The hackernews discussion for this article contained a few very good resources for learning Vim.
Here they are:
- Do you want something more interactive and fun than Vimtutor? Someone made a minigame that teaches Vim! Finally, the game where I can move my character with hjkl that I always wanted. Jokes aside, this game is pretty neat.
- This StackOverflow response explains Vim’s verb + noun concept better than I did, and gives even more examples and tricks.
- For a historical perspective on why Vim uses hjkl for motions, and other tidbits of wisdom, I highly recommend @Jasode‘s Hackernews comment.
- If you want to really learn how to optimize your Vim use after going through vimtutor, this very geeky, very awesome site may be of interest to you as well. In it, developers must solve a task using the smallest possible amount of Vim commands. Just like golf.
I hope you found this article useful or interesting, and as usual any feedback will be welcome, whether anything I said was plain wrong, or you actually liked some part of this tutorial.
Part 2 is already available, in case you want to learn how to copy and paste with over thirty clipboards.
I am sorry that this post was not useful for you!
Let us improve this post!
Would you tell me how I can improve this post?