This guide will break that cycle, ensuring this is the last time you will learn it. There are dozens of Vim references online, but most of them either go ninja straight away, or start basic and don't go much deeper.
There will always be plenty more Vim to learn, but you'll never have to start over again.
This guide will take you through three levels—from:
In short, we're going to learn Vim in a way that will stay with you for life.
Let's get started.
I believe people should use Vim for the following three reasons:
You should consider competence with Vim the way you consider competence with your native language, or basic maths, etc. So much in technology starts with being good with your editor.
Kana the Wizard says there are five (5) levels to Vim mastery:
Level 0: not knowing about Vim
Level 1: knows Vim basics
Level 2: knows visual mode
Level 3: knows various motions
Level 4: not needing visual mode
I don't know about that, but I thought it was worth mentioning. Kana's a wizard, after all. My approach to showing you Vim is based around four main areas:
In other words, if you're already up and running you should be able to jump to Getting Stuff Done and start knocking stuff out. If you're already solid on those bits, then head over to the Advanced section to learn Kung Fu. And if you're here to solve a specific "forgot how do do that one thing", check out the Frequent Requests area.
So, setup, basic usage, ninja stuff, and then frequent tasks—and you basically just go where you need to within those.
This isn't an uber-vim-config piece. There are many of those out there. This is a guide that will teach you Vim's way of thinking so that you gain long-term power with it. But we'll talk through some configuration basics as part of that.
I recommend you start pretty basic and go from there, but I do have a couple of key recommendations that you can take or ignore. After installing Vim by editing your main Vim config file, which is located at ~/.vimrc.
vi ~/.vimrc
This will make it so that you can type jk instead of pressing ESC, which is much easier since they're home keys!
inoremap jk ⟨Esc⟩
let mapleader = "'"
With these two quick mods you can move through all your major Vim workflows without having to move your left or right pinkies from the home row.
The next few are just nice to haves that are a solid start for any .vimrc.
syntax on " highlight syntax
set number " show line numbers
set noswapfile " disable the swapfile
set hlsearch " highlight all results
set ignorecase " ignore case in search
set incsearch " show search results as you type
This one isn't in your Vim config file, but it's an important deviation from the defaults. The CAPSLOCK key on a keyboard is generally worthless to me, so I remap it to Ctrl at an operating system level. This way my left pinky can simply slide to the left by one key to execute Ctrl-whatever.
I recommend keeping your plugin management as natural as possible, which really just means avoiding complex third-party functionality that manages them for you. This is much easier to do now in Vim 8.x, and in NeoVim. You simply drop your plugins under:
~/.vim/pack/pluginfoldername/start/pluginname
Done and done. Now you can play with any plugins you want using the method above and they will be loaded automatically when Vim starts. I much prefer this to the third-party plugin management options we needed with earlier versions of Vim.
Arguably the most brilliant thing about Vim is that as you use it you begin to think in it. Vim is set up to function like a language, complete with nouns, verbs, and adverbs.
Verbs are the actions we take, and they can be performed on nouns. Here are some examples:
Modifiers are used before nouns to describe the way in which you're going to do something. Some examples:
In English, nouns are objects you do something to. They are objects. With Vim it's the same. Here are some Vim nouns:
You can also use nouns as motions, meaning you can move around your content using them as the size of your jump. We'll see examples of this below in the moving section.
Ok, so we have the various pieces, so how would you build a sentence using them? Well, just like English, you combine the verbs, modifiers, and nouns in (soon to be) intuitive ways.
Here's what it looks like:
# Delete two words
d2w
# Change inside sentence (delete the current one and enter insert mode)
cis
# Yank inside paragraph (copy the paragraph you're in)
yip
# Change to open bracket (change the text from where you are to the next open bracket)
ct<
Remember, the "to" here was an open bracket, but it could have been anything. And the syntax for "to" was simply t, so I could have said dt. or yt; for "delete to the next period", or "copy to the next semicolon".
Now that we've handled some fundamentals, let's get tangible and functional.
Some quick basics on working with your file.
One of the first things you need to be able to do with an editor is find text you're looking for. Vim has extremely powerful search capabilities, and we'll talk about some of them now.
One of most basic and powerful ways to search in Vim is to enter the "/" command, which takes you to the bottom of your window, and then type what you're looking for and press ENTER.
# Search for include
/include
That'll light up all the hits, as seen below:
Once you've done your search, you can press "n" to go to the next instance of the result, or "N" to go to the previous one. You can also start by searching backward by using "?" instead of "/".
One thing that's brutally cool about Vim is that from anywhere you can search for and jump to specific characters. In this article, for example, because I'm editing HTML, I can always jump to the "<" character to be at the end of the sentence.
# Jump forward and land on the < character
f<
# Jump forward and land right before the < character
t<
You can think of this as "find" for the first one, which lands right on it, and "to" for the second one, which lands right before it.
What's really sick, though is that you can use these as nouns for commands. So just a second ago while editing this sentence I did:
ct,
This works for whatever character, e.g. periods, open brackets, parenthesis, regular letters—whatever. So you can just look forward in your text and jump to things or you can know that it's somewhere up there and just got to it wherever it is.
Getting around within your text is critical to productivity. With vim this is both simple and elegant, as it leverages the core principal of vim as language that we talked about above. First, some basics.
We start with use of the home row. Typists are trained to keep their right hand on the j, k, l, and ";" keys, and this is the starting point for using Vim as well.
This is a bit strange at first, and it just takes a few minutes of practice to get functional with, but it'll quickly become so natural that you'll be doing it in Microsoft Word and Outlook (it doesn't work there, by the way).
So your right index and middle fingers move you up and down lines, and your index and ring fingers move you left and right by one character.
You can easily move within the line you're on.
You can also move by word:
When you use uppercase you ignore some delimiters within a string that may break it into two words.
While you're in normal mode it's possible to jump back and forth between two places, which can be extremely handy.
So let's package that all up into one place:
Ok, so we've done a bunch of moving within our text; now let's make some changes. The first thing to remember is that the motions will always be with us—they're part of the language (they're modifiers in the vocabulary above).
The first thing we need to grasp is the concept of modes. It's a bit counterintuitive at first but it becomes second nature once you grok it. Most guides start with this bit, but I find it a bit obtuse to lead with, and I think the transition point from Normal to Insert is a great place to introduce it.
There are some other modes as well, but we won't mess with them here as they tend to live outside primer territory.
Let's recall our language: Verb, Modifier, Noun. So we're assuming we're starting in Normal Mode, and we're going to switch into Insert Mode in order to change something.
Our verb is going to start us off, and we have a few options. We can change (c), insert (i), or append (a), and we can do variations on these, as seen below.
Let's start with the options here.
# Change inside sentence
cis
# Go to the beginning of the line and enter insert mode
I
# Start typing right after the cursor
a
As you can see, there are lots of ways to start entering text. There are also some shortcuts (shown above as well) for doing multiple things at once, such as deletion and entering Insert Mode.
# Delete the line from where you're at, and enter insert mode
C
# Delete the entire line you're on, and enter insert mode
S
You can change the case of text using the tilde (~) command. It works as you'd imagine—either on the letter under the cursor, or on a selection.
It's sometimes helpful to format text quickly, such as paragraphs, and this can easily be done with the following command:
# Format the current paragraph
gq ap
gq works based on your textwidth setting, which means it'll true up whatever you invoke it on to be nice and neat within those boundaries.
The "ap" piece is the standard "around paragraph" text object.
Now that we know how to change text, let's see how to do straight deletes. As you're probably getting now, it's very similar—just a different action to start things off.
Simple enough.
You can't have a text editor without undo and redo. As you've probably noticed, Vim does its best to make the keys for the actions feel intuitive, and undo and redo are not exceptions.
Both commands can be used repeatedly, until you either go all the way back to the last save, or all the way forward to your current state.
One of the most powerful commands in all of Vim is the period ".", which seems strange, right? Well, the period "." allows you to do something brilliant—it lets you repeat whatever it is that you just did.
Many tasks you do will make a lot of sense to repeat. Going into insert mode and adding some text, for example. You can do it once and then just move around and add it again with just the "." Here are a couple of other examples.
# delete a word
dw
# delete five more words
5.
Whoa. And wait until you see it combined with Visual Mode.
Another text editor essential is being able to quickly copy and paste text, and Vim is masterful at it.
Vim does copying a bit different than one might expect. The command isn't c, as one might expect. If you'll remember, c is already taken for "change". Vim instead uses y for "yank" as it's copy command and shortcut.
Remember, just like with any other copy you're not messing with the source text—you're just making another…copy…at the destination.
Cutting text is simple: it's the same as deleting. So whatever syntax you're using for that, you're actually just pulling that deleted text into a buffer and preparing it to be pasted.
Pasting is fairly intuitive—it uses the p command as its base. So, if you delete a line using dd, you can paste it back using p.
One thing to remember about pasting is that it generally starts right after your cursor, and either pastes characters/words or lines or columns—based on what you copied (yanked). Also remember that you can undo any paste with the universal undo command "u".
# Switching lines of text
ddp
This is a quick trick you can use to swap the position of two lines of text. The first part deletes the line you're on, and the second part puts it back above where it used to be.
We'd be in pretty bad shape if we couldn't spellcheck, and vim does it quite well. First we need to set the option within our conf file.
# Somewhere in your ~/.vimrc
set spell spelllang=en_us
When you have set spell enabled within your conf file, misspelled words are automatically underlined for you. You can also enable or disable this by running :set spell and :set nospell.
Either way, once you've got some misspellings you can then advance through them and take action using the following commands:
]s - Go to the next misspelled word
[s - Go to the last misspelled word
z= - When on a misspelled word, get some suggestions
zg - Mark a misspelled word as correct
zw - Mark a good word as misspelled
I like to add a couple of shortcuts to my ~/.vimrc file related to spelling. The first just makes it easy to "fix" something:
# Fix spelling with ⟨leader⟩f
nnoremap ⟨leader⟩f 1z=
This one gets rid of spellchecking when I don't want to see it—like when I'm in creative mode. I can then re-toggle it with the same command.
# Toggle spelling visuals with ⟨leader⟩s
nnoremap ⟨leader⟩s :set spell!⟨CR⟩
Another powerful feature of Vim is its ability to do powerful substitutions. They're done by specifying what you're looking for first, then what you're changing it to, then the scope of the change.
The basic setup is the :%s
# Change "foo" to "bar" on every line
:%s/foo/bar/g
# Change "foo" to "bar" on just the current line
:s/foo/bar/g
Notice the lack of the % before the "s".
There are many other options, but these are the basics.
Brilliant. So we've covered a number of basics that any text editor should have, and how Vim handles those tasks. Now let's look at some more advanced stuff—keeping in mind that this is advanced for a primer, not for Kana the Wizard.
We talked a bit ago about being able to repeat things quickly using the period ".". Well, certain types of commands are better for this than others, and it's important to know the difference.
In general, the idea with repetition using the period "." (or as Drew Neil calls it—the dot command) is that you want to have a discreet movement action combined with a repeatable command captured in the ".".
So let's say that you're adding a bit of text to the end of multiple lines, but you're only doing it where the line contains a certain string. You can accomplish that like so:
# Search for the string
/delinquent
Now, whenever you press the "n" key you'll teleport to the next instance of "delinquent". So, starting at the first one, we're going to append some text.
Type A to append at end of line, then type [DO NOT PAY], then press Esc
Ok, so we've done that once now. But there are 12 other places it needs to be done. The "." allows us to simply re-execute that last command, and because we also have a search saved we can combine them.
# Go to the next instance and append the text to the line
n.
Text Objects are truly spectacular. They allow you to perform actions (verbs) against more complex targets (nouns). So, rather than selecting a word and deleting it, or going to the beginning of a sentence and deleting it, you can instead perform actions on these…objects…from wherever you are within them.
Hard to explain; let me give you some examples.
Let's look first at some word-based objects.
These are targets (nouns), so we can delete against them, change against them, etc.
# Delete around a word
daw
Those work pretty much the same as with word objects, so imagine you're knee deep into a sentence that you decide suddenly you hate. Instead of moving to the beginning of it and figuring out how to delete to the end, you can simply:
# Change inside a sentence
cis
This nukes the entire sentence and puts you in Insert Mode at the beginning of your new one.
There are also a number of other object types, which I'll mention briefly.
I use these constantly when editing code or HTML. Remember the key is that you don't even have to be inside the section in question; you just tell it ci" and it'll delete everything inside the double quotes and drop you inside them in Insert Mode. It's wicked cool.
The same works for a few other types of items, including parenthesis, brackets, braces, and tags (think HTML).
Think about editing an HTML link, where there is the URL within double quotes, and then the link text within tags; this is handled elegantly by vim by doing two commands: ci" and then cit.
Here a list of the objects for your reference:
and a
Many tricks of the Vim wizard can attract attention, but few create as many pleasurable expletives as skillful use of Visual Mode.
Perhaps the best thing to say about Visual Mode is that it magnifies the power of everything you've learned so far. It does this by allowing you to apply commands to the text that's currently highlighted.
So let's start with how to enter Visual Mode and light up some text. You enter Visual Mode with the "v" key, and there are three different options.
Often time you'll be inside some content that is surrounded on both sides by something, such as , . ( { [. You can visually select these things by issuing commands like these:
# Select inside of parenthesis
vi(
# Select inside of brackets
vi[
You can also add a number to that to select two levels out (if you're inside a nested set.
# Select everything inside the second tier braces
v2i{
You can also use va to select around instead of inside. Remember not to burden your mind with these. They're the same exact nouns and verbs we know from everywhere else.
Starting with character-based (using v to enter from Normal Mode), you can use this to select characters, sets of characters, words, etc. I use this far less frequently than line-based (V), but I still use it often.
The main thing to understand here is that now that you're in Visual Mode, your motions are changing what's being highlighted. This means you can do motions like w or ) to expand your selection. The highlighted area is then going to become the target for an action.
You enter this mode by pressing the V key from Normal Mode, and from here you then take the actions we'll discuss in a moment.
Another option is to select text vertically, which is great for pulling columns of data.
It's really your choice, but the most common operations are simply deletion, copy, and paste. Just think of it as highlighting with your mouse—back when you used such things.
# Enter visual mode, select two more words of text, and copy them
vwwy
Then you simply go where you want to put them and type p to paste them there.
Or you can do some line-based action.
# Enter line-based visual mode and delete a couple of lines below
Vjjd
You can also use text objects, which is seriously sick.
# Visually select an entire paragraph
vip
# Visually select an entire paragraph then paste it down below
vipyjjp
Don't panic about how big that command is. Remember, it's language. You can rattle off:
…without any problem, and it's the same with:
Another wicked thing you can do with Visual Mode is apply the . command to execute a stored action against the selection. Let's take the text below for example.
foo
bar
thing
other
yetanother
also
If we want to prepend a colon in front of every line, you can simply put one in front of foo, visually select all the lines below it, and then hit the . key.
:foo
:bar
:thing
:other
:yetanother
:also
BAM!
Not feeling it yet? How about this: your file is 60,000 lines, each with a line like the above, and you have to append the ":" to each of them. What do you do?
# Add the colon to the whole file
0i:⟨Esc⟩j0vG.
wut
Ease up, killer. Here are the steps:
Done. For the entire file. And remember, you're not going to have to remember to type "ALPHABET AMPERSAND GOBBLYGOOK 25″—no, it's just going to come to you, like falling off a bike. Trust me.
People think macros are scary. They're really not. They really come down to one thing: recording EVERYTHING you do and then doing it again when you replay. Here's a simple reference:
Simple, right? You can have multiple macros stored in multiple registers, e.g. "a", "b", "c", whatever. And then you just play them back with @a or @c or whatever.
You may be asking:
If visual selection and repetition with the dot command are so powerful, why use macros at all?
Great question, and the answer is complexity. Macros can do just about anything you can do, so check out this workflow:
That's a lot of work, and if your file is 60K lines like the last one, it's going to be somewhat painful. Try doing that in Microsof Word, for example.
With Vim however, you simply perform those actions once and then replay it on each line.
Let's go through a few tasks that get asked about a lot and/or just save a considerable amount of time.
Based on the type of file you're in, you might have some line drama. Here's how to delete those iannoying Ctrl-M characters from the end of your lines.
# Delete the Ctrl-M characters from the end of files
:%s/\s\+$//
set ft=unix
set ft=html
set ft=dos
Using the Surround Plugin you can do some seriously epic stuff in terms of wrapping text with markup.
⟨q⟩
: do the same, but change the single quotes to ⟨q⟩
tags (surround.vim auto-closes tags)⟨em⟩
: emphasize the current word (it works with text objects!) Want to know what's crazier about that? It's dot repeatable!.⟨a href="/images"⟩
, and then press enter.So that's it then. There are two things I'd like one to come away with from this guide:
If you are able to become even partially comfortable with the basics covered here I think you will simply enjoy text more—and that's not a minor thing. The more comfortable you are dealing with text, the more comfortable you'll be dealing with ideas, and I think that's nothing less than epic.
Or you can sweep all that rubbish aside and just be one of those people who make others smile orgasmically when they watch you edit a config file—either way, I hope you found this helpful.
If you liked this, check out my other technical primers here.