+ while strlen(l:signs)
+ let l:sign = matchstr(l:signs, '^[A-Za-z]\+\(:.\)*[.=>-][^ ]\+')
+
+ let l:name = substitute(l:sign, '[:.=>-].*', "", "")
+ 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, '^\(:.\)*[.=>-]', "", "")
+ 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
+
+ call <SID>Prep_Sign(l:var)
+ exe "let " . l:var . " = <SID>Place_Sign(" . l:i . ", line(\"" . l:line . "\"), b:sign" . l:var . ", \"Mark" . l:name . "\")"
+ let l:i = l:i + 1
+
+ let l:signs = substitute(l:signs, '^[^ ]\+ *', "", "")
+ endwhile
+endfun "}}}2
+
+" Toggle signs.
+fun! <SID>Cycle_Signs(resize) "{{{2
+ if ! has("signs")
+ return
+ endif
+ call Iain_Vars()
+ let g:marksigns = ! g:marksigns
+
+ " Retrofit arrays on to Vim 6.
+ if ! exists("g:iainsigns")
+ " Signs are defined in g:iainsigns. The syntax is as follows:
+ "
+ " Sign ::= Name (':' Mark)* Type Symbol
+ " Type ::= '=' | '-' | '.'
+ "
+ " Signs with Type '=' will be highlighted with the MarkSign group.
+ " Signs with Type '-' will be highlighted with the MarkLine group.
+ " Signs with Type '.' will be highlighted with the MarkDot group.
+ " Signs with Type '>' will be highlighted with the MarkArrow group.
+ " Define the Mark where Symbol is not also the mark name, eg "']".
+ let g:iainsigns = "Less=< Greater=> Left=( Right=) SquareLeft=[ SquareRight=] BraceLeft={ BraceRight=} a-a b-b c-c d-d e-e f-f A-A B-B C-C D-D E-E F-F"
+ if Has_Unicode()
+ let g:iainsigns = g:iainsigns . " Quote:\"=” Dash:'=’ Caret:^.ʌ Dot:..•"
+ if version < "704"
+ let g:iainsigns = g:iainsigns ." Cursor:o>▶"
+ endif
+ else
+ let g:iainsigns = g:iainsigns . " Quote=\" Dash=' Caret.^ Dot:..*"
+ if version < "704"
+ let g:iainsigns = g:iainsigns ." Cursor>o"
+ endif
+ endif
+ endif
+
+ if g:marksigns
+ " Signs to highlight marks.
+ " Syntax won't work properly in Vim 6.
+ let l:signs = g:iainsigns
+ let l:sign = ""
+ while strlen(l:signs)
+ let l:sign = matchstr(l:signs, '^[A-Za-z]\+\(:.\)*[.=>-][^ ]\+')
+
+ let l:name = substitute(l:sign, '[:.=>-].*', "", "")
+ 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, '^:', "", "")
+ let l:ascii = matchstr(l:ascii, '^.')
+ else
+ let l:ascii = l:mark
+ endif
+ let l:ascii = substitute(l:ascii, '"', '\\"', "")
+ let l:type = substitute(l:sign, '^:.', "", "")
+ let l:type = matchstr(l:type, '^.')
+
+ let l:hl = ""
+ if l:type == "="
+ let l:hl = "texthl=MarkSign text="
+ elseif l:type == "."
+ let l:hl = "texthl=MarkDot text="
+ elseif l:type == "-"
+ let l:hl = "texthl=MarkLine text="
+ elseif l:type == ">"
+ let l:hl = "texthl=MarkArrow text="
+ endif
+
+ exe "sign define Mark" . l:name . " " . l:hl . l:mark
+
+ let l:signs = substitute(l:signs, '^[^ ]\+ *', "", "")
+ endwhile
+
+ if a:resize
+ call Resize_Columns("+", 2)
+ endif
+ call <SID>Highlight_Signs()
+ else
+ let l:i = 0
+ while l:i < 25
+ exe "sign unplace " . (g:firstsign + l:i)
+ let l:i = l:i + 1
+ endwhile
+
+ let l:signs = g:iainsigns
+ let l:sign = ""
+ while strlen(l:signs)
+ let l:sign = matchstr(l:signs, '^[A-Za-z]\+')
+
+ exe "sign undefine Mark" . l:sign
+ call <SID>Prep_Sign(tolower(l:sign))
+ let l:signs = substitute(l:signs, '^[^ ]\+ *', "", "")
+ endwhile
+
+ if a:resize
+ call Resize_Columns("-", 2)
+ endif
+ endif
+endfun "}}}2
+
+" Change list mode.
+fun! Cycle_List() "{{{2
+ " Pretty UTF-8 listchars.
+ if Has_Unicode()
+ let basic='tab:⇥·,trail:…,extends:«,precedes:»'
+ let eol='eol:¶'
+ if version >= "700"
+ let basic=basic . ',nbsp:•'
+ endif
+ else
+ let basic='tab:\\_,trail:_,extends:<,precedes:>'
+ let eol='eol:$'
+ if version >= "700"
+ let basic=basic . ',nbsp:+'
+ endif
+ endif
+ call Iain_Vars()
+ let w:iainlist = w:iainlist + 1
+ if w:iainlist > 2
+ let w:iainlist = 0
+ endif
+ if w:iainlist == 0
+ setlocal nolist
+ elseif w:iainlist == 1
+ exec "setlocal lcs=" . basic
+ setlocal list
+ else
+ exec "setlocal lcs=" . basic . "," . eol
+ setlocal list
+ endif
+
+ call Resize_Columns(Extra_Columns("list", "iainlist", " == 2"), 1)
+ call Extra_Whitespace_Match()
+endfun "}}}2
+
+" Cycle between hex and decimal display of toolbar stuff.
+fun! Cycle_HexStatusLine() "{{{2
+ call Iain_Vars()
+ let b:iainhex = ! b:iainhex
+ call Show_StatusLine()
+endfun "}}}2
+
+" Cycle verbose display of toolbar stuff.
+fun! Cycle_VerboseStatusLine() "{{{2
+ call Iain_Vars()
+ let b:iainverbose = ! b:iainverbose
+ call Show_StatusLine()
+endfun "}}}2
+
+" Toggle quickfix window.
+fun! Cycle_Quickfix() "{{{2
+ if ! has("quickfix")
+ return
+ endif
+ if g:quickfixing == 1
+ cclose
+ let g:quickfixing=0
+ else
+ copen
+ 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
+
+" To be overridden later if applicable.
+fun! Extra_Whitespace_Match() "{{{2
+ " NOP.
+endfun "}}}2
+
+" Swap hex/decimal statusline with \x.
+call Mapping("x", ":call Cycle_HexStatusLine()<CR>")
+" Change statusline verbosity with \v.
+call Mapping("V", ":call Cycle_VerboseStatusLine()<CR>")
+" Cycle list styles with \l.
+call Mapping("l", ":call Cycle_List()<CR>")
+" Toggle tags with \t.
+call Mapping("t", ":Tlist<CR>")
+" Change foldmethod with \f.
+call Mapping("f", ":se foldenable!<CR>")
+" Toggle quickfix window with \q.
+call Mapping("q", ":call Cycle_Quickfix()<CR>")
+" Rerun filetype detection with \s. The s is for syntax, as this will be
+" updated as a side-effect.
+call Mapping("S", ":filetype detect<CR>")
+" Toggle marks with \m.
+call Mapping("m", ":call <SID>Cycle_Signs(1)<CR>")
+
+if has("autocmd")
+ " Show signs by default.
+ au Display VimEnter * call <SID>Cycle_Signs(0)
+endif
+
+" move.
+nmap <A-u> <Plug>MoveLineHalfPageUp
+nmap <A-d> <Plug>MoveLineHalfPageDown
+vmap <A-u> <Plug>MoveBlockHalfPageUp
+vmap <A-d> <Plug>MoveBlockHalfPageDown
+endif "}}}1
+
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+" Handle options only available in Vim 7 and above.
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+if version >= "700" "{{{1
+version 7.0
+
+" Narrow buffer with \w.
+call Mapping("w", ":NarrowRegion<CR>", "n", "v")
+" Narrow window with \W.
+call Mapping("W", ":NarrowWindow<CR>", "n", "v")
+
+" Helper to show tab name.
+fun! <SID>TabName(label, gui) "{{{2
+ let l:label = a:label
+ if l:label == ""
+ let l:label = "No Name"
+ if a:gui
+ let l:label = "[" . l:label . "]"
+ endif
+ else
+ let l:label = fnamemodify(l:label, ":t")
+ if strlen(l:label) >= 18
+ let l:label = l:label[0:17] . ".."
+ endif
+ endif
+ return l:label
+endfun "}}}2
+
+" Find out if any buffer was modified.
+fun! <SID>TabModified(buflist) "{{{2
+ let l:i = 0
+ while l:i < len(a:buflist)