" Handle options safe to use in version 4. Vim 4 parses but ignores the
" "if version" syntax used later in this file so we don't use it. No attempt
" is made to make this configuration compatible with Vim 3.
+" Some of these settings should strictly be wrapped inside "if has()" blocks
+" but that would cause them not to be ignored by Vim 4.
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"{{{1
" No compatibility mode.
se nocp
-" Find stuff.
-if has("win32") || has("win64")
- se rtp=~/.vim,$VIMRUNTIME
-endif
-
" Tabstop 2.
se ts=2
" And use spaces not tabs.
noremap ` '
"}}}1
+" Find stuff.
+if (has("win32") || has("win64")) && version >= "504"
+ se rtp=~/.vim,$VIMRUNTIME
+endif
+
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Handle options only available in Vim 5 and above.
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
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
+if has("wildmenu")
+ 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
+endif
" Save sessions in UNIX format with / as file separator. This is
" cross-platform.
-se ssop+=unix,slash
+if has("mksession")
+ se ssop+=unix,slash
+endif
" How often do we need to use ^A/^X on octals?
se nf=hex
" Nuke any pre-existing autocommands.
-augroup Display
-autocmd!
-augroup Mode
-autocmd!
-if has("signs")
- augroup Signs
+if has("autocmd")
+ augroup Display
autocmd!
+ augroup Mode
+ autocmd!
+ if has("signs")
+ augroup Signs
+ autocmd!
+ endif
+ augroup StatusLine
+ autocmd!
+ augroup File
+ autocmd!
+ augroup END
endif
-augroup StatusLine
-autocmd!
-augroup END
-" Save the current window width so we can restore it when we quit.
+" Save the current window dimensions so we can restore them when we quit.
if ! exists("g:oldcols")
let g:oldcols=&columns
endif
+if ! exists("g:oldlines")
+ let g:oldlines=&lines
+endif
" More GUI options. Add icon and tearoffs.
-se go+=i
-se go+=t
+if has("gui")
+ se go+=i
+ se go+=t
+endif
" 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
-
-" 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()}
+if has("extra_search")
+ se hlsearch
endif
" Syntax highlighting. New versions will use syn enable instead.
syn on
endif
-" Catch typos.
-command! W :w
-command! Wq :wq
-command! Wqa :wqa
+if has("user_commands")
+ " Catch typos.
+ command! W :w
+ command! Wq :wq
+ command! Wqa :wqa
+endif
+
+" Forget the Ex mode mapping.
+map Q <NOP>
+
+if has("autocmd")
+ " Position the compview plugin window.
+ au Display BufEnter -SearchResults- set buftype=nowrite | set nonumber | wincmd J
+endif
+endif "}}}1
+
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+" Handle options only available in Vim 5.2 and above.
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+if version >= "502" "{{{1
+version 5.2
" Helper to initialise a variable.
fun! Prep_Var(var, value) "{{{2
call Prep_Var("g:iainextracolumnsnumber", "''")
call Prep_Var("g:iainextracolumnslist", "''")
call Prep_Var("b:iaincul", 0)
+ call Prep_Var("b:iainalt", 0)
if has("signs")
call Prep_Var("g:marksigns", 0)
call Prep_Var("g:firstsign", 100)
call Prep_Var("g:resizable", "''")
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 <SID>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.
-" Show the size of the tabstop.
-fun! Show_Tabstop() "{{{2
- return &ts
-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
-
" Show the window title.
fun! Show_TitleString() "{{{2
if bufname("") == ""
return l:ts1
endfun "}}}2
-" Show the status line.
-fun! Show_StatusLine() "{{{2
- call Iain_Vars()
- let l:sl1='%2n\:\ %<%1*%f%0*\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ '
- let l:sl3='L:%1*%4.6l%0*/%-4.6L\ C:%1*%3.6c%0*\ \|\ %P'
- let l:hexformat='%b'
- if b:iainhex
- let l:hexformat='0\x%02B'
- endif
- if b:iainverbose
- let l:sl1=l:sl1 . v:version . '\ %='
- let l:sl2=l:hexformat . '\ \|\ P:%4.6o\ '
- else
- let l:sl1=l:sl1 . '%='
- let l:sl2=''
- endif
- exec "set statusline=" . l:sl1 . l:sl2 . l:sl3
-endfun "}}}2
-
" Toggle case-sensitivity.
fun! Invert_Case() "{{{2
let &ic = ! &ic
return g:resizable
endfun "}}}2
-" Grow or shrink the window size.
+" Grow or shrink the window width.
fun! Resize_Columns(op, ...) "{{{2
if a:op == ""
return
if a:0 == 0
" Vim 5 hardcodes the size of numbers column to 8.
- if version >= "700"
+ if version >= "700" && has("linebreak")
let l:columns = &numberwidth
else
let l:columns = 8
exe l:resize
endfun "}}}2
+" Grow or shrink the window height.
+fun! Resize_Lines(op, lines) "{{{2
+ if a:op == ""
+ return
+ endif
+
+ if ! Can_Resize()
+ return
+ endif
+
+ exe "let l:resize=" . &lines . a:op . a:lines
+ if &term =~ '^screen'
+ let l:resize = l:resize + 1
+ endif
+ let l:resize = "se lines=" . l:resize
+
+ exe l:resize
+endfun "}}}2
+
" Set extra columns depending on window status.
fun! Extra_Columns(extra, var, ...) "{{{2
" Vim 6 doesn't have winnr("$"). Determine which windows are open
if v:version < "600"
return ""
endif
+ if ! has("windows")
+ return ""
+ endif
" Remember which window we're in.
let l:winnr = winnr()
if getwinvar(l:i, "&modified") =~ '^\d'
let l:n = l:n + 1
- let l:val = 0
- exe "if getwinvar(" . l:i . ", '" . a:var . "') " . l:condition . " | let l:val = 1 | endif"
- if l:val
+ let l:val = 0
+ exe "if getwinvar(" . l:i . ", '" . a:var . "') " . l:condition . " | let l:val = 1 | endif"
+ if l:val
exe "let l:windows = '" . l:windows . ":" . l:i . "'"
endif
endif
endfun "}}}2
" Restore window size.
-if ! has("gui_running")
+if has("autocmd") && ! has("gui_running")
au Display VimLeave * if exists("g:oldcols") | call Resize_Columns("-", (&columns - g:oldcols)) | endif
+ au Display VimLeave * if exists("g:oldlines") | call Resize_Lines("-", (&lines - g:oldlines)) | endif
endif
" Map Makefile mode.
-au Mode BufEnter * if &ft == "make" | call MakeMode_map() | endif
-au Mode BufLeave * if &ft == "make" | call MakeMode_unmap() | endif
+if has("autocmd")
+ au Mode BufEnter * if &ft == "make" | call MakeMode_map() | endif
+ au Mode BufLeave * if &ft == "make" | call MakeMode_unmap() | endif
+endif
" Entering Make mode.
fun! MakeMode_map() "{{{2
set expandtab
endfun "}}}2
-" 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) "{{{2
if version < "600"
call Mapping("<", ":call Resize_Columns('-')<CR>:<CR>")
" Clear search pattern with \/.
call Mapping("/", ":let @/=\"\"<CR>:<CR>")
+" Toggle alternate buffer name with \#.
+call Mapping("#", ":call Cycle_Alt()<CR>:<CR>")
-" Forget the Ex mode mapping.
-map Q <NOP>
+" 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>")
" Resize for numbers.
if &number
- if version >= "700"
+ if version >= "700" && has("linebreak")
let l:columns = &numberwidth
else
let l:columns = 8
" 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()
endif
endfun "}}}2
-au StatusLine VimEnter * call Highlight_StatusLine("")
+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
+
+" 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 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.
+" Show the size of the tabstop.
+fun! Show_Tabstop() "{{{2
+ return &ts
+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
-" Show numbers by default.
-au Display VimEnter * if ! Uncluttered_Buffer() | call Number(0) | 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
-" Position the compview plugin window.
-au Display BufEnter -SearchResults- set buftype=nowrite | set nonumber | wincmd J
+" 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
+
+" Show the status line.
+fun! Show_StatusLine() "{{{2
+ if ! has("statusline")
+ return
+ endif
+ call Iain_Vars()
+ let l:sl1='%2n\:\ %<%1*%f%0*\ [%{Show_List()}%{Show_Bind()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%{Show_VirtualEdit()}%{Show_Undo()}%Y%M%R]%{Show_Alt()}\ '
+ let l:sl3='L:%1*%4.6l%0*/%-4.6L\ C:%1*%3.6c%V%0*\ \|\ %P'
+ let l:hexformat='%b'
+ if b:iainhex
+ let l:hexformat='0\x%02B'
+ endif
+ if b:iainverbose
+ let l:sl1=l:sl1 . v:version . '\ %='
+ let l:sl2=l:hexformat . '\ \|\ P:%4.6o\ '
+ else
+ let l:sl1=l:sl1 . '%='
+ let l:sl2=''
+ endif
+ exec "set statusline=" . l:sl1 . l:sl2 . l:sl3
+endfun "}}}2
+
+" Show the status line for the first time.
+call Show_StatusLine()
endif "}}}1
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
endif
" Remember quickfix state.
-let g:quickfixing=0
+if has("quickfix")
+ let g:quickfixing=0
+endif
" Set indenting by filetype.
filetype indent on
" Less intrusive syntax highlighting.
-syn enable
+if has("syntax")
+ syn enable
+endif
" Set colours.
if has("gui_running")
endif
" Ignore whitespace when diffing.
-se diffopt=filler,iwhite
-
-" Expand window when doing a vertical diff.
-if &diff
- if &columns < 161
- let &columns = &columns * 2
- endif
+if has("diff")
+ se diffopt=filler,iwhite
endif
-" Remember that we are opening the quickfix window.
-au Mode BufWinEnter quickfix let g:quickfixing=1
-au Mode BufUnload * if &ft == "qf" | let g:quickfixing=0 | endif
+if has("autocmd")
+ if has("quickfix")
+ " Remember that we are opening the quickfix window.
+ au Mode BufWinEnter quickfix let g:quickfixing=1
+ au Mode BufUnload * if &ft == "qf" | let g:quickfixing=0 | endif
+ endif
-" Allow in-place editing of crontabs.
-au Mode FileType crontab set backupcopy=yes
+ " Allow in-place editing of crontabs.
+ au Mode FileType crontab set backupcopy=yes
+endif
" Make * and # work the way you expect in visual mode.
vnoremap * y/\V<C-R>=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")<CR><CR>
let l:var = tolower(l:name)
let l:sign = substitute(l:sign, '^[A-Za-z]\+', "", "")
let l:ascii = matchstr(l:sign, '^:.')
- let l:mark = substitute(l:sign, '^\(:.\)*[.-=]', "", "")
+ let l:mark = substitute(l:sign, '^\(:.\)*[.=-]', "", "")
if strlen(l:ascii)
let l:ascii = substitute(l:ascii, '^:', "", "")
else
" Signs with Type '-' will be highlighted with the MarkLine group.
" Signs with Type '.' will be highlighted with the MarkDot group.
" Define the Mark where Symbol is not also the mark name, eg "']".
- if <SID>Has_Unicode()
+ if Has_Unicode()
let g:iainsigns = "Dash:'=’ Dot:..• Quote:\"=” Caret:^.ʌ"
else
let g:iainsigns = "Dash=' Dot:..* Quote=\" Caret.^"
let l:sign = substitute(l:sign, ':.', "", "")
let l:sign = substitute(l:sign, '=', " texthl=MarkSign text=", "")
let l:sign = substitute(l:sign, '\.', " texthl=MarkDot text=", "")
- let l:sign = substitute(l:sign, '-', " texthl=MarkLine text=", "")
+ let l:sign = substitute(l:sign, '-', " texthl=MarkLine linehl=MarkLine text=", "")
exe "sign define Mark" . l:sign
endif
endfun "}}}2
-" Do we have Unicode?
-fun! <SID>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
-
" Change list mode.
fun! Cycle_List() "{{{2
" Pretty UTF-8 listchars.
- if <SID>Has_Unicode()
+ if Has_Unicode()
let basic='tab:»·,trail:…,extends:«,precedes:»'
let eol='eol:¶'
if version >= "700"
" Toggle quickfix window.
fun! Cycle_Quickfix() "{{{2
+ if ! has("quickfix")
+ return
+ endif
if g:quickfixing == 1
cclose
let g:quickfixing=0
endif
endfun "}}}2
+" Toggle showing alternate buffer information.
+fun! Cycle_Alt() "{{{2
+ call Iain_Vars()
+ let b:iainalt = ! b:iainalt
+ call Show_StatusLine()
+endfun "{{{2
+
" Swap hex/decimal statusline with \x.
call Mapping("x", ":call Cycle_HexStatusLine()<CR>:<CR>")
" Change statusline verbosity with \v.
" Toggle marks with \m.
call Mapping("m", ":call <SID>Cycle_Signs(1)<CR>:<CR>")
-" Show signs by default.
-au Display VimEnter * call <SID>Cycle_Signs(0)
+if has("autocmd")
+ " Show signs by default.
+ au Display VimEnter * call <SID>Cycle_Signs(0)
+endif
endif "}}}1
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
fun! <SID>ToggleCursorLine() "{{{2
call Iain_Vars()
- if b:iainstatus =~# "f" && b:iainstatus =~# "H" && b:iainstatus =~# "I"
- " Focus lost while held in insert mode.
- let b:iaincul = getbufvar("", "&cursorline")
- setlocal cursorline
- elseif ! b:iaincul
- setlocal nocursorline
+ if b:iainstatus =~# "H" && b:iainstatus =~# "I"
+ " We are held in insert mode.
+ if b:iainstatus =~# "f"
+ " And focus was lost.
+ let b:iaincul = getbufvar("", "&cursorline")
+ setlocal cursorline
+ elseif ! b:iaincul
+ setlocal nocursorline
+ endif
endif
endfun "}}}2
-se tabline=%!Show_TabLine()
-se guitablabel=%!Show_GUITabLine()
+" Handle searching in a BufExplorer window.
+fun! <SID>BufExplorer_Search(n) "{{{2
+ if a:n == 0
+ let l:re = '^ *\d %'
+ else
+ let l:re = "^ *" . a:n
+ endif
+
+ " Find matching line.
+ let l:line = search(l:re, 'w')
+ if ! l:line
+ return
+ endif
-au StatusLine CursorHoldI * call Highlight_StatusLine("H")
-au StatusLine CursorMovedI * call Highlight_StatusLine("h")
-au StatusLine FocusGained * call Highlight_StatusLine("F")
-au StatusLine FocusLost * call Highlight_StatusLine("f")
-au StatusLine InsertEnter * call Highlight_StatusLine("I")
-au StatusLine InsertLeave * call Highlight_StatusLine("i")
+ if a:n == 0
+ return
+ endif
-au Display FocusGained,FocusLost * call <SID>ToggleCursorLine()
+ " Peek ahead to the next matching line.
+ let l:next = search(l:re, 'w')
-if has("signs")
- au Signs InsertEnter * call <SID>Highlight_Signs()
- au Signs InsertLeave * call <SID>Highlight_Signs()
+ " Select the buffer if the match is unambiguous.
+ if l:next == l:line
+ exe "normal \<CR>"
+ return
+ endif
+
+ " Go back.
+ call cursor(l:line, 0)
+endfun! "}}}2
+
+" Entering a BufExplorer window.
+fun! <SID>BufExplorer_Map() "{{{2
+ for l:n in [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
+ exec "nnoremap <buffer> <silent>" . l:n . " :call <SID>BufExplorer_Search(" . l:n . ")<CR>"
+ endfor
+endfun "}}}2
+
+if has("windows")
+ se tabline=%!Show_TabLine()
+ se guitablabel=%!Show_GUITabLine()
+endif
+
+if has("autocmd")
+ au StatusLine CursorHoldI * call Highlight_StatusLine("H")
+ au StatusLine CursorMovedI * call Highlight_StatusLine("h")
+ au StatusLine FocusGained * call Highlight_StatusLine("F")
+ au StatusLine FocusLost * call Highlight_StatusLine("f")
+ au StatusLine InsertEnter * call Highlight_StatusLine("I")
+ au StatusLine InsertLeave * call Highlight_StatusLine("i")
+
+ if has("syntax")
+ au Display FocusGained,FocusLost * call <SID>ToggleCursorLine()
+ endif
+
+ if has("signs")
+ au Signs InsertEnter * call <SID>Highlight_Signs()
+ au Signs InsertLeave * call <SID>Highlight_Signs()
+ endif
+
+ au Mode BufEnter \[BufExplorer\] call <SID>BufExplorer_Map()
endif
" Limit the size of the popup menu when completing.
-se pumheight=20
+if has("insert_expand")
+ se pumheight=20
+endif
" Make diffs vertical by default.
-se diffopt+=vertical
+if has("diff")
+ se diffopt+=vertical
+endif
" Set size of numbers column.
-se numberwidth=5
+if has("linebreak")
+ se numberwidth=5
+endif
" Add "previous tab" mapping as gb.
map gb :tabprevious<CR>:<CR>
endif
" Yet more GUI options. Add tabs.
-se go+=e
+if has("gui")
+ se go+=e
+endif
" Perforce.
let g:p4EnableMenu=1
" BufExplorer.
let g:bufExplorerShowRelativePath=1
let g:bufExplorerSplitOutPathName=0
+
+" NERDcommenter.
+let g:NERDSpaceDelims=1
+endif "}}}1
+
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+" Handle options only available in Vim 7.3 and above.
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+if version >= "703" "{{{1
+version 7.3
+
+" Toggle persistent undo with \u.
+call Mapping("u", ":call <SID>Cycle_Undo()<CR>:<CR>")
+" Remove persistent undo file with \U.
+call Mapping("U", ":call <SID>Clear_Undo()<CR>:<CR>")
+
+" Use a persistent undo file if it exists.
+fun! <SID>Check_Undo() "{{{2
+ if filereadable(undofile(expand("%")))
+ setlocal undofile
+ endif
+endfun "}}}2
+
+" Toggle persistent undo for this buffer.
+fun! <SID>Cycle_Undo() "{{{2
+ if has("persistent_undo")
+ let &undofile = ! &undofile
+ endif
+endfun "}}}2
+
+" Remove the persistent undo file for this buffer.
+fun! <SID>Clear_Undo() "{{{2
+ if ! has("persistent_undo")
+ return
+ endif
+
+ setlocal noundofile
+
+ let l:f = expand("%")
+ if l:f == ""
+ return
+ endif
+
+ let l:u = undofile(l:f)
+ if l:u == ""
+ return
+ endif
+
+ if ! filereadable(l:u) || ! filewritable(l:u)
+ return
+ endif
+
+ call delete(l:u)
+endfun "}}}2
+
+" Toggle ColorColumn at cursor position.
+fun! <SID>Cycle_ColorColumn() "{{{2
+ if ! has("syntax")
+ return
+ endif
+
+ let l:cc = &colorcolumn
+ let l:column = col(".")
+ let l:re = ",*\\<" . l:column . "\\>"
+ if l:cc =~# l:re
+ let l:cc = substitute(l:cc, l:re, "", "g")
+ else
+ let l:cc = l:cc . "," . l:column
+ endif
+ let &colorcolumn = substitute(l:cc, "^,*", "", "")
+endfun "}}}2
+
+if has("syntax")
+ " Enable showing ColorColumn at cursor position with \CC.
+ call Mapping("CC", ":call <SID>Cycle_ColorColumn()<CR>:<CR>")
+ " Remove last shown ColorColumn with \Cc.
+ call Mapping("Cc", ":let &colorcolumn=substitute(&colorcolumn, \",*[0-9]*$\", \"\", \"\")<CR>:<CR>")
+ " Remove all ColorColumns with \Cx.
+ call Mapping("Cx", ":se colorcolumn=<CR>:<CR>")
+endif
+
+" Use persistent undo if available.
+if has("autocmd")
+ if has("persistent_undo")
+ au File BufReadPost * call <SID>Check_Undo()
+ endif
+
+ if has("cursorbind")
+ au Display WinEnter * if &diff | se cursorbind | endif
+ endif
+endif
endif "}}}1
" Resize after startup.
if version >= "500" "{{{1
-au Display VimEnter * call Startup_Resize()
+if has("autocmd")
+ au Display VimEnter * call Startup_Resize()
+endif
endif "}}}1