+
+" Look for ctags in home directory first.
+se tags=~/.tags,./tags,tags
+
+" Don't timeout waiting to interpet, eg, <ESC>OA as an escape code.
+se ttimeoutlen=100
+
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+" Handle options only available in Vim 5 and above.
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+if version >= "500"
+version 5.0
+
+" Tell Vim we use dark backgrounds in our terminals.
+if ! has("gui_running")
+ se bg=dark
+endif
+
+" Enable tab-completion prompting for commands.
+se wildmenu
+" Don't list object files when globbing files to load.
+se wildignore+=*.o,*.obj
+" So there's no need to assign them low priority.
+se suffixes-=*.o,*.obj
+
+" Vim 5 hardcodes the size of numbers column to 8.
+let numberwidth=8
+
+" Save sessions in UNIX format with / as file separator. This is
+" cross-platform.
+se ssop+=unix,slash
+
+" Nuke any pre-existing autocommands.
+autocmd!
+
+" Save the current window width so we can restore it when we quit.
+let oldcols=&columns
+
+" More GUI options. Add icon, tearoffs and toolbar.
+se go+=itT
+
+" Allow dynamic window resize even if we aren't in an xterm.
+se t_WS=\e[8;%p1%d;%p2%dt
+
+" Highlight search results.
+se hlsearch
+
+" Syntax highlighting. New versions will use syn enable instead.
+if version < 600
+ syn on
+endif
+
+" Use a discernably different colour to highlight the cursor which shows
+" matching brackets. Our regular cursor is green so use blue instead of cyan.
+hi MatchParen ctermbg=blue
+
+" Catch typos.
+command! W :w
+command! Wq :wq
+command! Wqa :wqa
+
+" Set up our variables.
+fun! Iain_Vars()
+ if ! exists("b:iainlist")
+ let b:iainlist = 0
+ endif
+ if ! exists("b:iainhex")
+ let b:iainhex = 0
+ endif
+ if ! exists("b:iainverbose")
+ let b:iainverbose = 0
+ endif
+ if ! exists("b:iainstatus")
+ " Window Flags: (F)ocused, (I)nsert mode, Cursor (H)old.
+ let b:iainstatus = "Fih"
+ endif
+endfun
+
+" Helper for status line.
+" Show space, underscore or dollar sign depending on list mode.
+fun! Show_List()
+ call Iain_Vars()
+ if b:iainlist == 0
+ " No list.
+ return " "
+ elseif b:iainlist == 1
+ " Just tabs.
+ return "_"
+ else
+ " Full list.
+ return "\$"
+ endif
+endfun
+
+" Helper for status line.
+" Show c or C to denote case-sensitivity.
+fun! Show_Case()
+ if &ic
+ return "c"
+ else
+ return "C"
+ endif
+endfun
+
+" Helper for status line.
+" Show the size of the tabstop.
+fun! Show_Tabstop()
+ return &ts
+endfun
+
+" Helper for status line.
+" Show p when paste mode is on.
+fun! Show_Paste()
+ if &paste
+ return "p"
+ else
+ return ""
+ endif
+endfun
+
+" Show the status line.
+fun! Show_StatusLine()
+ call Iain_Vars()
+ let sl1='%2n\:\ %<%f\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ %='
+ let sl3='L:%4.6l/%-4.6L\ C:%3.6c\ \|\ %P'
+ let hexformat='%b'
+ if b:iainhex
+ let hexformat='0\x%02B'
+ endif
+ if b:iainverbose
+ let sl2=hexformat . '\ \|\ P:%4.6o\ '
+ else
+ let sl2=''
+ endif
+ exec "set statusline=" . sl1 . sl2 . sl3
+endfun
+
+" Toggle case-sensitivity.
+fun! Invert_Case()
+ let &ic = ! &ic
+endfun
+
+" Restore window size.
+au VimLeave * if exists("oldcols") | let &columns=oldcols | endif
+
+" Map Makefile mode.
+au BufEnter * if &ft == "make" | call MakeMode_map() | endif
+au BufLeave * if &ft == "make" | call MakeMode_unmap() | endif
+
+" Entering Make mode.
+fun! MakeMode_map()
+ call Iain_Vars()
+ let b:iainlist=1
+ call Cycle_List()
+ set ts=8
+ set noexpandtab
+endfun
+
+" Leaving Make mode.
+fun! MakeMode_unmap()
+ call Cycle_List()
+ set ts=2
+ set expandtab
+endfun
+
+" Show the status line for the first time.
+call Show_StatusLine()
+
+" Function to create mappings with either a hardcoded \ or <Leader>.
+fun! Mapping(keysequence,mapping)
+ if version >= "600"
+ exec "map \\" . a:keysequence . " " . a:mapping
+ else
+ exec "map <Leader>" . a:keysequence . " " . a:mapping
+ endif
+endfun
+
+" Use - and = to create underlines.
+call Mapping("-", "yyp:s/./-/g<RETURN>:let @/=''<RETURN>:<RETURN>")
+call Mapping("=", "yyp:s/./=/g<RETURN>:let @/=''<RETURN>:<RETURN>")
+
+" Change to ts=2 with \2.
+call Mapping("2", ":se ts=2<CR>:<CR>")
+" Change to ts=4 with \4.
+call Mapping("4", ":se ts=4<CR>:<CR>")
+" Change to ts=8 with \8.
+call Mapping("8", ":se ts=8<CR>:<CR>")
+" Change to ts=16 with \6.
+call Mapping("6", ":se ts=16<CR>:<CR>")
+" Change to ts=32 with \3.
+call Mapping("3", ":se ts=32<CR>:<CR>")
+" Toggle paste mode with \p.
+call Mapping("p", ":se paste!<CR>:<CR>")
+" Swap case-sensitivity with \c.
+call Mapping("c", ":call Invert_Case()<CR>:<CR>")
+" Change number mode with \n.
+call Mapping("n", ":se number!<CR>:<CR>")
+" Expand or shrink window size with \> and \<. For use after toggling number.
+call Mapping(">", ":exe 'se columns+=' . numberwidth<CR>:<CR>")
+call Mapping("<", ":exe 'se columns-=' . numberwidth<CR>:<CR>")
+" Clear search pattern with \/.
+call Mapping("/", ":let @/=\"\"<CR>:<CR>")
+
+" Forget the Ex mode mapping.
+map Q <NOP>
+
+" Vim tip 99: What's the highlighting group under the cursor?
+call Mapping("h", ":echo \"hi<\" . synIDattr(synID(line(\".\"),col(\".\"),1),\"name\") . '> trans<' . synIDattr(synID(line(\".\"),col(\".\"),0),\"name\") . \"> lo<\" . synIDattr(synIDtrans(synID(line(\".\"),col(\".\"),1)),\"name\") . \">\"<CR>")
+
+endif
+
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+" Handle options only available in Vim 6 and above.
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+if version >= "600"
+version 6.0
+
+" Remember quickfix state.
+let g:quickfixing=0
+
+" Set indenting by filetype.
+filetype indent on
+
+" Less intrusive syntax highlighting.