At least once each semester, as I save my notes and pack up my laptop after class, someone asks me, “What program do you use to take notes?

I don’t use anything fancy: it’s just a dark background with monospaced, technicolor, plain text. Yes, I use Vim.

Notes in Vim

Actually, to be more precise, I use MacVim, a gVim clone built to run in Mac OS X.

What is Vim?

Unless the course is a computer science topic, this is often the next question I am asked.

Vim is a powerful, modal 1, all-purpose, command-line text editor. It’s name stands for Vi IMproved because is based on the vi editor, which was written in 1976 and improved upon ex (also written in 1976), which in turn was an advanced version of ed (written in 1971). Thus one could argue that Vim is over 40 years old.

Why Vim?

I keep notes in a personal Wiki, so all of my notes are in plain-text MediaWiki format.

The distraction-free environment and keyboard-based commands make navigating, editing, and writing faster and feel more fluent: No more fooling around with the cursor or arrow keys and then repositioning my hands on the keyboard.

Plugins and macros (see below) make editing much faster and prettier. The technicolor text comes from the MediaWiki syntax definition.

Transcribing Wiki-markup from files into the web browser is a great study aid.

Stability (this is the main reason). Vim is an old editor, so they’ve had time to work the kinks out, making it more stable than other text editors. Simple text editors (and web browsers, for that matter) crash, and when they do, they tend to lose data. On the off chance that Vim crashes, all session information is maintained in the swp files.

Appendix 1: My Favorite Vim plugins

UPDATE 5/4/2013:

Tim Pope, Steve Losh, and Drew Neil all have great plugins, tips, and tricks for becoming a Vim master.

Appendix 2: My .vimrc file

Many users publish their .vimrc configuration to share some of their workflow shortcuts, so here’s mine. Most of the stuff in here is probably borrowed from other people anyway, so a big thank you to them!

set nocompatible                  " We're using VIM, not VI

" ============================
"  Pathogen Bundle Management
" ============================

runtime bundle/pathogen/autoload/pathogen.vim

call pathogen#infect()

" ====================
"  Editor Preferences
" ====================

syntax on
filetype plugin indent on         " load ftplugin and indentation files

set smarttab                      " [*Sensible]
set autoindent                    " [*Sensible] Auto-indent
set smartindent                   " Smart-indent
set tabstop=8                     " Tab literals are 8 spaces wide
set shiftwidth=4                  " Soft tabs are 4 spaces wide
set softtabstop=4                 " Backspace acts like unindent
set expandtab                     " Insert spaces instead of tabs

set listchars=tab:▸\ ,eol:¬       " [*Sensible] Show whitespace chars

set showmatch                     " [*Sensible] Highlight matching delimiters
set mat=2                         " [*Sensible] Show matchng delimiter for .2sec

set nowrap                        " do not wrap text in display

if exists("&rnu")
    set rnu                       " Relative line numbering (if available)
    set number                    " Line numbers

set ruler                         " [*Sensible] Show position in bottom-right
set showcmd                       " [*Sensible] Show incomplete commande as you type

set magic                         " Pattern matching with special chars
set incsearch                     " [*Sensible] Make search act like a browser
set hlsearch                      " Highlight search results

set backspace=eol,start,indent    " [*Sensible]
set whichwrap+=<,>,h,l

set autochdir                     " Automatically set browser to working dir

silent! colorscheme komputerwiz   " Custom colorscheme, based heavily on 'slate'

let map leader = '\'              " '\' by default, but can't use multichar maps

" ================
"  Spell Checking
" ================

nmap <silent> <leader>s :set spell!<CR>
set spelllang=en_us

" =========
"  Folding
" =========

set foldmethod=syntax
set foldcolumn=4

" ======
"  gVim
" ======

if has('gui_macvim')
    set guifont=Ubuntu\ Mono:h11
elseif has('gui_running')
    set guifont=Ubuntu\ Mono\ 11

if exists("&amp;guioptions")
    set guioptions-=T             " Hide toolbar by default

    " Hide scrollbars by default
    set guioptions-=r             " right scrollbar
    set guioptions-=R             " right scrollbar (vsplit)
    set guioptions-=l             " left scrollbar
    set guioptions-=L             " left scrollbar (vsplit)
    set guioptions-=b             " bottom scrollbar

    " mappings to toggle gui elements
    nmap <D-\> :if &amp;go=~#'T'<Bar>set go-=T<Bar>else<Bar>set go+=T<Bar>endif<CR>
    nmap <leader>R :if &amp;go=~#'r'<Bar>set go-=r<Bar>else<Bar>set go+=r<Bar>endif<CR>
    nmap <leader>L :if &amp;go=~#'l'<Bar>set go-=l<Bar>else<Bar>set go+=l<Bar>endif<CR>
    nmap <leader>B :if &amp;go=~#'b'<Bar>set go-=b<Bar>else<Bar>set go+=b<Bar>endif<CR>

" ===========================
"  Mappings and Key Bindings
" ===========================

nnoremap <leader>l :set list!<CR>
nnoremap <leader>v :tabedit $MYVIMRC<CR>

" opening and closing folds quickly
nnoremap <space> za
vnoremap <space> za

" text bubbling (unimpaired remappings)
nmap <A-D-Up> [e
vmap <A-D-Up> [egv
nmap <A-D-Down> ]e
vmap <A-D-Down> ]egv

" type '\a' followed by '|', ':', or '=' to tabularze at that char
if exists(":Tabularize")
    nmap <leader>a| :Tabularize /|<cr>
    vmap <leader>a| :Tabularize /|<cr>
    nmap <leader>a= :Tabularize /=<cr>
    vmap <leader>a= :Tabularize /=<cr>
    nmap <leader>a: :Tabularize /:\zs<cr>
    vmap <leader>a: :Tabularize /:\zs<cr>
    nmap <leader>a, :Tabularize /,\zs<cr>
    vmap <leader>a, :Tabularize /,\zs<cr>

" map NERDTree toggle to <F3>
map <F3> :NERDTreeToggle<CR>

" map <F4> to run build and display errors
nmap <F4> :w<CR>:make<CR>:cw<CR>

" map <F5> to graphcal undo tree
nmap <F5> :GundoToggle<CR>

" =======================================================
"  Set tabstop, softtab, and shiftwdth to the same value
" =======================================================

command! -nargs=1 Stab call Stab(<f-args>)
function! Stab(width)
  if a:width > 0
    let &amp;l:sts = a:width
    let &amp;l:ts = a:width
    let &amp;l:sw = a:width

" ====================================
"  Autosource vimrc when it's updated
" ====================================

if has("autocmd")
  autocmd BufWritePost .vimrc source $MYVIMRC

" ========================================
"  vim -b : edit binary using xxd-format!
" ========================================

augroup Binary
    " remove all autocmds for group 'Binary'

    au BufReadPre  *.bin let &amp;bin=1

    au BufReadPost *.bin if &amp;bin | %!xxd
    au BufReadPost *.bin set ft=xxd | endif

    au BufWritePre *.bin if &amp;bin | %!xxd -r
    au BufWritePre *.bin endif

    au BufWritePost *.bin if &amp;bin | %!xxd
    au BufWritePost *.bin set nomod | endif
augroup END

  1. Vim is modal because it has different “modes” for inserting text, entering commands, and selecting text. ↩︎