Effective Vim
Being a fan of Steve Yegge, I was randomly reading some of his older writings and eventually chanced upon his post on “Effective Emacs”. Being a Vim guy, I wondered whether some of the tips he presents are useful for the Vim world as well.
Note: This is not a Vim vs Emacs thing, it is simply a porting of tips for Emacs to see whether the tips are useful for Vim users as well.
So here goes:
10 Specific Ways to Improve Your Productivity With Emacs, ported to Vim:
Item 1: Swap Caps-Lock and Control
This is a desktop-specific customization. However, I don’t think it is
required for Vim users, but it can be
useful.
Update: After using for a couple of days, I’m really starting to like this!
Item 2: Invoke M-x without the Alt key
Not relevant for Vim. Not a good start, first two tips are out…
Item 3: Prefer backward-kill-word over Backspace
This is a good tip. Normally, I would use bdw to achieve the same.
To map backspace to this command in normal mode, put this in
your vimrc: :map <bs> bdw.
To make it work in insert mode you can put :imap <bs> <esc>bdwa. I’m
sure there’s a better way to use just one command to do this, please
leave a comment if you know of a better way.
Update: You can also use ctrl-w in insert mode (see :help i_CTRL-W),
thanks to pimaniac.
Item 4: Use incremental search for Navigation
Use :set incsearch.
Press n to search forward and N to search backward.
Item 5: Use Temp Buffers
Run :new to get a new buffer (or alternately ctrl-w n).
To switch between buffers, use ctrl-w ctrl-w (yes, twice).
Use :q as usual to close the buffer (or alternately, ctrl-w q).
Item 6: Master the buffer and window commands
- To split window vertically, run
:vsp - To split window horizontally, run
:sp - To make all visible windows approximately equal height, run
ctrl-w = - To switch to other window, run
ctrl-w ctrl-wor use the directional keysctrl-w h/j/k/l - To delete other windows, use
ctrl-w oor run
nly - To list-buffers, run
:ls(or even:filesor:buffers) - Dialog Boxes: The Root of All Evil – agree, Vim doesn’t need dialog boxes as well (at least in the non-gui mode)
- Buffers to the Rescue – Same thing for Vim, I think.
Item 7: Lose the UI
- Remove the menubar using
:set guioptions-=m. - Remove the toolbar using
:set guioptions-=T. - Similar options exist for the scrollbar, see
:help guioptions - Region selection can be easier in Vim using the visual mode, just
press
v, use the normal keys to move around, such as10jto move down by 10 lines, and then a command to work on that visual selection, such asdto delete it.
Item 8: Learn the most important help functions
The help in Vim is vast, see :help usr_toc to see the chapters of
the awesome reference manual.
Item 9: Master Emacs’s regular expressions
I agree, Friedl’s book is the authority on this. However, there are some good introductions to Vim regular expressions available.
Item 10: Master the fine-grained text manipulation commands
- Creating macros are easy in Vim. Press
qato start recording a macro called ‘a’, do all the commands you want to run, presqto stop recording. Then, run@ato repeat the recorded commands i.e. a macro. - Swapping two adjacent words, yeah, this can be better. I use
xpto swap characters anddwwPto swap words, but it doesn’t do fancy stuff like thetranspose-*functions. This can be an interesting plugin to write.
Tune in next time…
- Filling paragraphs can be done by setting
:set textwidth=80and runninggqapcommand to format ‘a’ ‘p’aragraph, or like me you can map the ‘Q’ key to run it ::nmap Q gwap. To make this work inside comments, make sure you:set formatoptions+=c. - gnuserv : I use It’s All Text! Firefox extension.
- Dired : There are plugins available with similar functionality
- Whitespace manipulation – plenty of ways such as
:set expandtab,:retab!,:help fo-table, etc. - nxml-mode : I haven’t used nxml-mode but I’m still looking for something like Emacs’ SGML-mode that works for Vim. I miss you, SGML-mode.
- picture-mode : Dr. Chip to the rescue with DrawIt.vim
- minibuffer management : Not sure what this is.
- effortless navigation : I think Vim has enough keys for this by
default. See
:help navigation. - region management : We can always choose the color scheme of choice
for the highlighted region, or change it ourselves, see `:help
:highlight`. - rectangle commands : Use
ctrl-v - emacs shells : We have
:shbut don’t know if Emacs does something more - align-regexp : Not sure what this is.
- frame initialization : I set Vim to always opens in full screen,
see
:help win16-maximized. Not sure how to do it in Linux yet, but in Gnome, I just press Alt-F10. - using the goal column : No idea…
- setting the fill column : Nada…
- OS settings and font : I like to customize Vim’s font and keep
trying different
fonts, currently
I’m using
:set guifont=Consolas:h14:cANSI - browsing and editing archives : I think Vim does this by default,
see
:help netrw. - advanced keybinding : see
:help :mapand:help keycodes - mastering the kill ring : I guess you can simulate this with
:echo @a, etc. - mastering Info : Not sure if this would be useful in Vim.
- using M-x customize : Not sure what this does.
- utility apps : It’s all in the plugins.
Summary: Porting good ideas is a good idea
I wonder why a search for Steve Yegge on Wikipedia points to Batman…
Update in November end, 2008: I have released a new book on Vim, read the whole thing right here..


November 17th, 2007 at 9:26 am
I think swapping the caps lock is still a good idea. I use ctrl-p all the time for completion. And (looking ahead to item 3) ctrl-w to kill the previous word (in insert mode).
November 17th, 2007 at 5:19 pm
@Lee: Okay, I tried changing the caps lock, but I’m having a hard time getting used to it. However, I can see now that it is easier on the fingers
November 17th, 2007 at 5:39 pm
I rebind Caps Lock to Escape via my .xinitrc file. As for item #3, db will delete word in normal mode as well.
November 17th, 2007 at 7:03 pm
@jonathantan86: how?
November 17th, 2007 at 7:44 pm
You can use for only one command and go back into insert mode. So your mapping would be something like:
imap bdw
I wouldn’t like to have backspace mapped like that though, ^W seems more like an appropriate key for that.
November 17th, 2007 at 7:45 pm
Some explanations:
nxml-mode can autoclose tags and validate on-the-fly. Vim probably has a plugin.
the minibuffer works in the same way as vim’s :, with history, completion etc.
of course it does more. you can have more than one, for a start.
align-regexp adds whitespace to fields to align a group of characters in a column. yeah, it’s hard to explain.
setting the goal column keeps you in the same horizontal position when you move between lines.
text width
Oh, and you should all remap ; to : for the equivalent of tip number two. It’s the same as M-x and is easier on the shift key.
November 17th, 2007 at 7:46 pm
Hmm, the comments don’t understand my angle brackets. With parentheses:
imap (bs) (c-o)bdw
November 17th, 2007 at 10:09 pm
There was a Batman episode with Egghead …
November 18th, 2007 at 2:10 am
re: fonts, I also like to try out new fonts in [G]Vim, but editing ~/.vimrc to change them or entering the whole correct font descriptor string in the command area can be a pain. So use :set guifont=*. This works with the GTK and Win32 GUIs, and will display a standard font selection dialog. Once you have the font you want, edit /.vimrc and add the command there to change it permanently.
November 18th, 2007 at 3:41 am
The closest thing to the first two is learning to type instead of since it keeps you on the home row (I don’t do this).
To that, I’d add that you should learn and practice:
http://jmcpherson.org/editing.html
Beyond that, I like remapping K to (and the corresponding J) and opening everything with :split, though you could just as easily use the tab equivalents in Vim 7.
As far as plugins, I’ll recommend Snippets and AutoClose. Investing in your own set of snippets pays nice dividends.
November 18th, 2007 at 3:43 am
Err, that’s mapping CTRL-K to CTRL-W K CTRL-_ (and the correspondnig CTRL-J). I get used to writing with the angle bracket convention, which got stripped.
November 18th, 2007 at 10:02 am
[...] Swaroop C H, The Dreamer » Archives » Effective Vim (tags: programming tips vi vim) [...]
November 18th, 2007 at 12:10 pm
split horizontally – C-w, s
Also if you’re using Vim on a vt100 compatible terminal, you must use it together with screen. Screen is like a window manager for terminals.
Together it’s very effecient.
November 18th, 2007 at 5:48 pm
[...] Swaroop C H, The Dreamer » Archives » Effective Vim (tags: howto linux programming vim vi) [...]
November 19th, 2007 at 1:39 am
Talking about swapping words, you may be interested in my friend’s python script that does that (including some more advanced stuff like recognising function calling or nested parenths). Written using vim-python bindings.
http://blog.kamil.dworakowski.name/2007/09/swap-parameters-script-for-vim.html
November 22nd, 2007 at 2:01 pm
@CYT: Interesting, thanks.
@Karl: I am a touch typist, so that’s why Vim is a comfortable place for me. And yes, Snippets is awesome.
@Choy: I haven’t tried Screen yet, should try some time.
@Konrad: Neat, will check it out.
November 22nd, 2007 at 2:02 pm
@Gopal: Sometimes I can’t differentiate your humor and sarcasm!
January 18th, 2008 at 5:15 pm
It’s all text is amazing! Now I can finally feel 1337 while surfing . . .
October 9th, 2008 at 5:55 pm
[...] w odpowiedzi na post Steve’a effective emacs, dawno temu pojawił się post effective vim [...]
October 15th, 2008 at 1:31 am
Interesting tips on vim.
Here’s another similar interesting post about vim on Jamis Buck’s blog.
http://weblog.jamisbuck.org/2008/10/10/coming-home-to-vim
I also put a comment or two on it.
November 11th, 2008 at 9:27 pm
Hey Swaroop ! These tips are fabulous !
I am hooked ! I have been using VI and frequently get ” Why dont u use Emacs” looks – Wait till them i show the new tricks up my sleeve – I am sure the split windows shall “ooh- haah” them
-Swaroop
November 27th, 2008 at 12:59 am
[...] Effective Vim [...]
January 21st, 2009 at 8:51 pm
Hi, to lowcase entire file –> ggguG