Getting started with Vim

Sat, Feb 12, 2011

As mentioned in an earlier post, I am switching to
Vim as my editor of choice. Like most people, my first attempts were a
struggle, but after a little perseverance I began to appreciate the power and to feel the advantages
of keeping my hands on the keyboard. So I am going to keep at it for a while longer and see if it
sticks…

Installing

Most of my work involves coding in Ruby and Javascript on Ubuntu Linux.
There are a variety of Vim flavors available as debian packages. A quick search gives us a number of options:

Your choice depends on what environment you are using: GUI or terminal, and whether or not you
require any language specific bindings (typically for plugins built with that language)

In my case I need:

ruby bindings because a plugin that I want to use (CommandT) requires them.

GUI bindings because of another plugin (CSApprox) that needs them.

I spend most of my time in a terminal, rather than on the desktop, so I don’t really need a GUI
version. However, once you start experimenting with color schemes you will discover that most of
them do NOT work in the terminal version which has a limited color palette. In order to get color
schemes to work in the terminal version you need another plugin (CSApprox) that will convert the
color scheme to the closest available terminal color. The CSApprox plugin requires a version of VIM
that is built with the GUI bindings, so even though I will be using Vim in a terminal, my choice
ended up being vim-gnome. It is built with all the necessary GUI and Ruby bindings required
for the plugins which I would like to use.

sudo apt-get install vim-gnome

Once installed, you can investigate what is included in the build by checking the version

vim --version

Then use it to create and edit a new file:

vim

… or to edit an existing file:

vim [FILE]

… and away we go!

First stumbling attempts

Unlike most editors, Vim is based around modes, primarily

command - in this mode any key you press triggers a command.

insert - in this mode you actually type your content.

visual - in this mode you can visually select.

This is one of the hardest parts to get used to. If you are not careful, you can easily start
typing away, thinking you are writing code, only to trigger a random command that needs to be
undone. Luckily u(ndo) is an easy command key to remember! (redo is <C-r>)

Switching between command and insert mode becomes more natural over time as you come to
grips with basic commands like:

i(nsert)

c(hange)

a(ppend)

d(elete)

… along with the [command][number]object pattern followed by most vim commands.

A common tip is to get in and out of insert mode as quickly as possible. insert your text
and hit <Esc> to go back to command mode gets you thinking about editing in terms of commands.

Enter the <C-v> command to switch to visual mode where you can use either the mouse or the
arrow keys to make a visual selection. Once a selection is made, it can be acted on by more commands such as:

d(elete)

y(ank)

Y(ank) is the Vim equivalent of copy. Once you have Y(anked), you can P(ut). Putting
with a lowercase p will insert the text after the cursor, using an uppercase P will insert
the text before the cursor. There are many Vim commands that have subtle behavior differences
between the lowercase and uppercase version and in order to be efficient you should be aware of
those differences.

In addition to key commands, Vim can be given explicit commands in the command area at the bottom
of the screen starting with the : character, e.g:

:write
:quit

many of these can be shortened:

:w
:q

and combined:

:wq

One of the most important commands to learn is, of course, help.

:help (topic)

This post is not meant as a Vim tutorial, its more of my initial thoughts and actions while trying
to get up to speed on Vim. I would highly recommend anyone coming to Vim for the first time go
spend some time with a book or on the Vim wiki.

Breaking MS Windows Habits

There are 2 commands that can be used to ease transition for people coming from a Windows background.
You can ask Vim to behave like mswin, you can also setup some windows like shortcuts

:behave mswin
:source $VIMRUNTIME/mswin.vim

This allows you to use shift-arrow keys to perform selections, ctrl-c/v for copy & paste and
ctrl-z/y for undo/redo.

The problem here though, is it gives you a false sense of comfort. It feels close, but it doesn’t
quite work exactly the way you expect, and when it’s different its shocking.

I would recommend NOT turning on mswin behaviors. Learn the vim commands first, then think about
how you might want to setup key mappings for your personal preferences later, and if you find
yourself trying to map commands to windows-like keystrokes then come back and visit the mswin
behavior again after you know a little more about Vim.