+endfun "}}}2
+
+" Use - and = to create underlines.
+call Mapping("-", "yyp:s/./-/g<CR>:let @/=''<CR>")
+call Mapping("=", "yyp:s/./=/g<CR>:let @/=''<CR>")
+
+fun! Tab_Width(width) "{{{2
+ exec "set sw=" . a:width
+ exec "set ts=" . a:width
+endfun "}}}2
+
+" Set 2-column tabs with \2.
+call Mapping("2", ":call Tab_Width(2)<CR>")
+" Set 4-column tabs with \4.
+call Mapping("4", ":call Tab_Width(4)<CR>")
+" Set 8-column tabs with \8.
+call Mapping("8", ":call Tab_Width(8)<CR>")
+" Set 16-column tabs with \6.
+call Mapping("6", ":call Tab_Width(16)<CR>")
+" Set 32-column tabs with \3.
+call Mapping("3", ":call Tab_Width(32)<CR>")
+" Toggle paste mode with \p.
+call Mapping("p", ":se paste!<CR>")
+" Swap case-sensitivity with \c.
+call Mapping("C", ":call Invert_Case()<CR>")
+" Change number mode with \n.
+call Mapping("n", ":call Number(1)<CR>")
+" Expand or shrink window size with \> and \<.
+call Mapping(">", ":call Resize_Columns('+')<CR>")
+call Mapping("<", ":call Resize_Columns('-')<CR>")
+" Clear search pattern with \/.
+call Mapping("/", ":let @/=\"\"<CR>")
+" Toggle alternate buffer name with \#.
+call Mapping("#", ":call Cycle_Alt()<CR>")
+
+" Set graphical window title.
+if has("win32") || has("win64")
+ " Windows taskbar entries are probably too small to show full titles.
+ se titlestring=%t
+else
+ se titlestring=%{Show_TitleString()}
+endif
+
+" 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>")
+
+fun! Uncluttered_Buffer() "{{{2
+ if exists("uncluttered_buffer")
+ if uncluttered_buffer == 1
+ return 1
+ endif
+ endif
+
+ if version >= "600"
+ if &buftype != ''
+ return 1
+ endif
+ endif
+
+ if &ft == 'perforce'
+ return 1
+ endif
+
+ if &ft == 'svn'
+ return 1
+ endif
+
+ if &ft == 'gitcommit'
+ return 1
+ endif
+
+ return 0
+endfun "}}}2
+
+fun! Startup_Resize() "{{{2
+ let l:columns = 0
+
+ " Resize for numbers.
+ if &number
+ if version >= "700" && has("linebreak")
+ let l:columns = &numberwidth
+ else
+ let l:columns = 8
+ endif
+ endif
+
+ " Resize for signs.
+ if has("signs")
+ if g:marksigns
+ if version >= "600"
+ let l:columns = l:columns + 2
+ endif
+ endif
+ endif
+
+ if g:oldcols < (80 + l:columns)
+ call Resize_Columns("+", l:columns)
+ endif
+endfun "}}}2
+
+" Change status bar colour when various things happen.
+" Flags: H/h: Cursor held/moved.
+" F/f: Focus gained/lost.
+" I/i: Insert mode entered/left.
+fun! Highlight_StatusLine(flag) "{{{2
+ if ! has("statusline")
+ return
+ endif
+ " Get current status.
+ call Iain_Vars()
+
+ " Change the status based on the flag. XXX: Does Vim let us to do flags?
+ let l:ic = &ic
+ set ic
+ let b:iainstatus = substitute(b:iainstatus, a:flag, a:flag, "")
+ let &ic = l:ic
+
+ let l:normalcolour = "darkblue"
+ let l:editingcolour = "darkmagenta"
+ let l:replacecolour = "purple"
+ let l:warningcolour = "darkred"
+ let l:readonlycolour = "red"
+
+ if b:iainstatus =~# "I"
+ if v:insertmode == "r"
+ let l:editingcolour = l:replacecolour
+ endif
+ endif
+
+ " Default colour.
+ let l:colour = l:normalcolour
+ " Maybe override depending on status.
+ if b:iainstatus =~# "H"
+ if b:iainstatus =~# "I"
+ " Held in insert mode. Add extra highlight if we don't have focus.
+ if b:iainstatus =~# "f"
+ let l:colour = l:warningcolour
+ else
+ let l:colour = l:editingcolour
+ endif
+ endif
+ else
+ if b:iainstatus =~# "I"
+ " Regular insert mode.
+ let l:colour = l:editingcolour
+ endif
+ endif
+
+ " Override again if readonly.
+ if l:colour != l:normalcolour
+ if getbufvar("", "&ro")
+ let l:colour = l:readonlycolour
+ endif
+ endif
+
+ let l:termcolour = Iain_Colour(l:colour)
+
+ exec "highlight StatusLine gui=none term=none cterm=none guifg=white guibg=" . l:colour . " ctermfg=white ctermbg=" . l:termcolour
+ exec "highlight User1 gui=bold term=bold cterm=bold guifg=white guibg=" . l:colour . " ctermfg=white ctermbg=" . l:termcolour
+endfun "}}}2
+
+fun! Iain_Colour(colour) "{{{2
+ if &t_Co == 88
+ if a:colour == "darkblue"
+ return 17
+ elseif a:colour == "darkmagenta"
+ return 33
+ elseif a:colour == "purple"
+ return 35
+ elseif a:colour == "darkred"
+ return 32
+ elseif a:colour == "red"
+ return 64
+ endif
+ elseif &t_Co == 256
+ if a:colour == "darkblue"
+ return 17
+ elseif a:colour == "darkmagenta"
+ return 90
+ elseif a:colour == "purple"
+ return 57
+ elseif a:colour == "darkred"
+ return 88
+ elseif a:colour == "red"
+ return 196
+ endif
+ else
+ " Colours which cterm*g doesn't recognise.
+ if a:colour == "purple"
+ return "magenta"
+ endif
+ return a:colour
+ endif
+endfun "}}}2
+
+if has("autocmd")
+ au StatusLine VimEnter * call Highlight_StatusLine("")
+
+ " Show numbers by default.
+ au Display VimEnter * if ! Uncluttered_Buffer() | call Number(0) | endif
+endif
+endif "}}}1
+
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+" Handle options only available in Vim 5.4 and above.
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+if version >= "504" "{{{1
+version 5.4
+
+" Reuse windows when using sbuffer.
+se switchbuf=useopen
+
+" Vim 5 requires a 'n setting for viminfo.
+if ! &viminfo
+ se viminfo='100
+endif
+
+" Allow persistent variable saving for localvimrc.
+se viminfo+=!
+
+" Do we have Unicode?
+fun! Has_Unicode() "{{{2
+ if ! has('multi_byte')
+ return 0
+ endif
+
+ if version < "602"
+ return 0
+ endif
+
+ if &tenc =~? '^u\(tf\|cs\)'
+ return 1
+ endif
+
+ if ! strlen(&tenc) && &enc =~? '^u\(tf\|cs\)'
+ return 1
+ endif
+
+ return 0
+endfun "}}}2
+
+" Helper for status line.
+" Show file encoding
+fun! Show_Encoding() "{{{2
+ if version < "600"
+ return ""
+ endif
+
+ let l:enc = &fenc
+ let l:symbol = ""
+ if l:enc == ""
+ let l:enc = &enc
+ if l:enc == ""
+ return ""
+ endif
+ if bufname("%") == ""
+ if Has_Unicode()
+ let l:symbol = '•'
+ else
+ let l:symbol = '*'
+ endif
+ endif
+ endif
+
+ if has("multi_byte")
+ if &bomb
+ if Has_Unicode()
+ let l:symbol = "☻"
+ else
+ let l:symbol = "@"
+ endif
+ endif
+ endif
+
+ " Don't return anything if the encoding is utf-8.
+ if l:enc == "utf-8"
+ if l:symbol == ""
+ return ""
+ endif
+ endif
+
+ return l:symbol . l:enc . ","
+endfun "}}}2