+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
+
+" Helper for status line.
+" Show space, underscore or dollar sign depending on list mode.
+fun! Show_List() "{{{2
+ call Iain_Vars()
+ if w:iainlist == 0
+ " No list.
+ return ""
+ elseif Has_Unicode()
+ if w:iainlist == 1
+ " Just tabs.
+ return "⇥"
+ else
+ " Full list.
+ return "¶"
+ endif
+ else
+ if w:iainlist == 1
+ return "_"
+ else
+ return "\$"
+ endif
+ endif
+endfun "}}}2
+
+" Helper for status line.
+" Show c or C to denote case-sensitivity.
+fun! Show_Case() "{{{2
+ if &ic
+ return "c"
+ else
+ return "C"
+ endif
+endfun "}}}2
+
+" Helper for status line.
+" Mark DOS buffers.
+fun! Show_DOS() "{{{2
+ if &ff == "unix"
+ return ""
+ endif
+ return &ff . ","
+endfun "}}}2
+
+" Helper for status line.
+" Show the size of the tabstop.
+fun! Show_Tabstop() "{{{2
+ if &et
+ return &ts
+ else
+ if Has_Unicode()
+ return &ts . "↹"
+ else
+ return &ts . "\\"
+ fi
+ endif
+endfun "}}}2
+
+" Helper for status line.
+" Show p when paste mode is on.
+fun! Show_Paste() "{{{2
+ if &paste
+ return "p"
+ else
+ return ""
+ endif
+endfun "}}}2
+
+" Helper for status line.
+" Show v when virtualedit mode is block, insert or onemore.
+" Show V when virtualedit mode is all.
+fun! Show_VirtualEdit() "{{{2
+ if ! has("virtualedit")
+ return ""
+ endif
+
+ if &ve == "all"
+ return "V"
+ elseif &ve != ''
+ return "v"
+ else
+ return ""
+ endif
+endfun "}}}2
+
+" Helper for status line.
+" Show U when persistent undo is on.
+" Show u when persistent undo is off but an undofile exists.
+fun! Show_Undo() "{{{2
+ if ! exists("&undofile")
+ return ""
+ endif
+
+ if &undofile
+ return "U"
+ elseif filereadable(undofile(expand("%")))
+ return "u"
+ else
+ return ""
+ endif
+endfun "}}}2
+
+" Helper for status line.
+" Show alternate buffer number and name.
+fun! Show_Alt() "{{{2
+ let l:alt = bufnr("#")
+ if l:alt < 0 || l:alt == bufnr("") || ! b:iainalt
+ return ""
+ endif
+
+ return " " . l:alt . ": " . expand("#:t")
+endfun "}}}2
+
+" Helper for status line.
+" Show scrollbind or cursorbind.
+fun! Show_Bind() "{{{2
+ if has("cursorbind")
+ if &cursorbind
+ if Has_Unicode()
+ return "⇄"
+ else
+ return ">"
+ endif
+ elseif &scrollbind
+ if Has_Unicode()
+ return "⇅"
+ else
+ return "^"
+ endif
+ endif
+ endif
+ return ""
+endfun "}}}2
+
+" Helper for status line.
+" Show marker if searchforward is unset.
+fun! Show_SearchForward() "{{{2
+ if version >= "702"
+ if ! v:searchforward
+ if Has_Unicode()
+ return "∆"
+ else
+ return "^"
+ endif
+ endif
+ endif
+ return ""
+endfun "}}}2
+
+" Helper for status line.
+" Show marks set in cursor line.
+fun! Show_Marks() "{{{2
+ if ! exists("g:iainsigns")
+ return ""
+ endif
+
+ let l:marks = ""
+
+ let l:signs = g:iainsigns
+ let l:sign = ""
+ let l:cursorline = line(".")
+ while strlen(l:signs)
+ let l:sign = matchstr(l:signs, '^[A-Za-z]\+\(:.\)*[.=>-][^ ]\+')
+ let l:sign = substitute(l:sign, '^[A-Za-z]\+', "", "")
+ let l:ascii = matchstr(l:sign, '^:.')
+ let l:mark = substitute(l:sign, '^\(:.\)*[.=>-]', "", "")
+ if strlen(l:ascii)
+ let l:ascii = substitute(l:ascii, '^:', "", "")
+ else
+ let l:ascii = l:mark
+ endif
+ let l:ascii = substitute(l:ascii, '"', '\\"', "")
+
+ if l:ascii == "o"
+ let l:line = "."
+ else
+ let l:line = "'" . l:ascii
+ endif
+
+ " Ignore cursor line which will always match.
+ if l:line != "."
+ if l:cursorline == line(l:line)
+ let l:marks = l:marks . l:mark
+ endif
+ endif
+
+ let l:signs = substitute(l:signs, '^[^ ]\+ *', "", "")
+ endwhile
+
+ if l:marks == ""
+ return ""
+ else
+ return "M:" . l:marks . " "
+ endif
+endfun "}}}2
+
+" Helper for status lines.
+" Show Space plugin command.
+fun! Show_Space() "{{{2
+ if exists("*GetSpaceMovement")
+ let l:ret = GetSpaceMovement()
+ if l:ret != ""
+ if Has_Unicode()
+ let l:ret = "▭" . l:ret . Show_SearchForward()
+ else
+ let l:ret = "[" . l:ret . Show_SearchForward() . "]"
+ endif
+ endif
+ return l:ret
+ else
+ return Show_SearchForward()
+ endif
+endfun "}}}2
+
+" Show the status line.
+fun! Show_StatusLine() "{{{2
+ if ! has("statusline")
+ return
+ endif
+ call Iain_Vars()