"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Multi-version vimrc compatible with version 4 and above. vim:set fdm=marker: """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Note that "if | call Something() | endif" syntax is unsupported " in Vim 4 so we write all our functions out the long way. It does work in " autocommand definitions, however. " Vim 4 complains if version isn't set in the configuration file. version 4.0 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " 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 " Tabstop 2. se ts=2 " And use spaces not tabs. se expandtab " And << and >> indent by 2. se sw=2 " Backspace deletes full tab width at the start of a line. se smarttab " Allow backspace to delete before start of line. se bs=2 " Don't jump to the start of the line when using H, L etc. se nosol " Show the ruler. se ruler " Show partial commands in the ruler. se showcmd " And always show the status line. se laststatus=2 " Use C indent style. se cindent se cinkeys=0{,0},0),:,!^F,o,O,e se cinoptions=b1,c2 " GUI options. se go=aglmr " Don't be bugged by messages at the bottom of the screen. se shm=aot " Find as you type. se incsearch " Case-insensitive search. se ignorecase " But override by typing capitals. se smartcase " Look for ctags in home directory first. se tags=~/.tags,./tags,tags " Don't timeout waiting to interpet, eg, OA as an escape code. se ttimeoutlen=100 " Remember undo list for closed (but not wiped) buffers. se hidden " Use ^B to search backward when completing. inoremap " Use ^L to show matching completions but don't select one. inoremap " Swap jump keys. nnoremap ' ` nnoremap ` ' " Select previous widnow. nnoremap ^ p nnoremap p "}}}1 " Find stuff. if (has("win32") || has("win64")) && version >= "504" se rtp=~/.vim,$VIMRUNTIME endif """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Handle options only available in Vim 5 and above. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" if version >= "500" "{{{1 version 5.0 " Tell Vim we use dark backgrounds in our terminals. if ! has("gui_running") se bg=dark endif " Allow mouse use in a terminal but only if it can work. if has("xterm_clipboard") se mouse=nvir endif " Update more quickly. For use with sign highlighting as polling for " CursorMove makes redrawing slow. if has("signs") se updatetime=500 endif " Enable tab-completion prompting for commands. 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. 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. 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 " 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. 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=[8;%p1%d;%p2%dt " Highlight search results. if has("extra_search") se hlsearch endif " Syntax highlighting. New versions will use syn enable instead. if version < "600" syn on endif if has("user_commands") " Catch typos. command! W :w command! Wq :wq command! Wqa :wqa endif " Forget the Ex mode mapping. map Q 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 if exists(a:var) return endif exe "let " . a:var . "=" . a:value endfun "}}}2 " Set up our variables. fun! Iain_Vars() "{{{2 call Prep_Var("w:iainlist", 0) call Prep_Var("b:iainhex", 0) call Prep_Var("b:iainverbose", 0) " Window Flags: (F)ocused, (I)nsert mode, Cursor (H)old. call Prep_Var("b:iainstatus", "'Fih'") call Prep_Var("g:iainextracolumnsnumber", "''") call Prep_Var("g:iainextracolumnslist", "''") call Prep_Var("b:iainalt", 0) if has("signs") call Prep_Var("g:marksigns", 0) call Prep_Var("g:firstsign", 100) endif call Prep_Var("g:resizable", "''") endfun "}}}2 " Show the window title. fun! Show_TitleString() "{{{2 if bufname("") == "" let l:ts1='Vim' else " Vim 5 doesn't have printf. let l:ts1=bufnr("") if l:ts1 < 10 let l:ts1=" " . l:ts1 endif let l:ts1=l:ts1 . ": " . expand('%t') endif let l:ts1=l:ts1 . " (" . getcwd() . ")" if has("clientserver") let l:ts1=l:ts1 . " " . v:servername endif return l:ts1 endfun "}}}2 " Toggle case-sensitivity. fun! Invert_Case() "{{{2 let &ic = ! &ic endfun "}}}2 " Can we resize this window? fun! Can_Resize() "{{{2 call Iain_Vars() if g:resizable == "0" || g:resizable == "1" return g:resizable endif " Do we KNOW we can(not) resize? if has("gui_running") let g:resizable = 1 elseif $RESIZABLE == &term let g:resizable = 1 elseif $RESIZABLE == "0" let g:resizable = 0 else " Assume we can. Allow overriding. let g:resizable = 1 endif return g:resizable endfun "}}}2 " Grow or shrink the window width. fun! Resize_Columns(op, ...) "{{{2 if a:op == "" return endif if ! Can_Resize() return endif if a:0 == 0 " Vim 5 hardcodes the size of numbers column to 8. if version >= "700" && has("linebreak") let l:columns = &numberwidth else let l:columns = 8 endif else let l:columns = a:1 endif exe "let l:resize=" . &columns . a:op . l:columns let l:resize = "se columns=" . l:resize " HACK: Inside screen there is an extra line for the status bar. Vim " manages the resize by sending an escape sequence to set the number of " lines and number of columns in one action. To do this it will first query " the number of lines and then set by . Because of the extra line for the status bar this results in " the real terminal being shrunk by a line. We ask for the terminal to grow " by a line so it ends up actually being the same. if &term =~ '^screen' let l:resize = l:resize . " lines=" . (&lines + 1) endif 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 " ourselves by using :windo to incremement a counter. As Vim 5 " doesn't have :windo we require Vim 6 for this. if v:version < "600" return "" endif if ! has("windows") return "" endif " Remember which window we're in. let l:winnr = winnr() let l:num_windows = 0 windo let l:num_windows = l:num_windows + 1 " Switch back to the window we were in. exe l:winnr . "wincmd w" call Iain_Vars() if a:0 == 0 let l:condition = "" else let l:condition = a:1 endif let l:n = 0 let l:i = 1 let l:windows = "" while l:n < l:num_windows " If window w exists then getwinvar(w, "&modified") will be 0 or 1. 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 exe "let l:windows = '" . l:windows . ":" . l:i . "'" endif endif let l:i = l:i + 1 endwhile let l:extra = "g:iainextracolumns" . a:extra exe "let l:val = " . l:extra exe "let " . l:extra . " = '" . l:windows . "'" if l:windows == l:val return "" endif if l:windows == "" return "-" elseif l:val == "" return "+" endif endfun "}}}2 " Toggle number display. fun! Number(resize) "{{{2 call Iain_Vars() let &number = ! &number " Ensure we keep track of any extra columns even if we aren't resizing. " This prevents confusion when number is set at startup. let l:extra = Extra_Columns("number", "&number") if a:resize call Resize_Columns(l:extra) endif endfun "}}}2 " Restore window size. 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. 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 call Iain_Vars() let w:iainlist=1 call Cycle_List() set ts=8 set noexpandtab endfun "}}}2 " Leaving Make mode. fun! MakeMode_unmap() "{{{2 call Cycle_List() set ts=2 set expandtab endfun "}}}2 " Function to create mappings with either a hardcoded \ or . fun! Mapping(keysequence,mapping) "{{{2 if version < "600" exec "map \\" . a:keysequence . " " . a:mapping else exec "map " . a:keysequence . " " . a:mapping endif endfun "}}}2 " Use - and = to create underlines. call Mapping("-", "yyp:s/./-/g:let @/='':") call Mapping("=", "yyp:s/./=/g:let @/='':") " Change to ts=2 with \2. call Mapping("2", ":se ts=2:") " Change to ts=4 with \4. call Mapping("4", ":se ts=4:") " Change to ts=8 with \8. call Mapping("8", ":se ts=8:") " Change to ts=16 with \6. call Mapping("6", ":se ts=16:") " Change to ts=32 with \3. call Mapping("3", ":se ts=32:") " Toggle paste mode with \p. call Mapping("p", ":se paste!:") " Swap case-sensitivity with \c. call Mapping("C", ":call Invert_Case():") " Change number mode with \n. call Mapping("n", ":call Number(1):") " Expand or shrink window size with \> and \<. call Mapping(">", ":call Resize_Columns('+'):") call Mapping("<", ":call Resize_Columns('-'):") " Clear search pattern with \/. call Mapping("/", ":let @/=\"\":") " Toggle alternate buffer name with \#. call Mapping("#", ":call Cycle_Alt():") " 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\") . \">\"") 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 " 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 func! Show_Encoding() "{{{2 let l:enc = &fenc if l:enc == "" let l:enc = &enc if l:enc == "" return "" endif let l:enc = '(' . l:enc . ')' endif if has("multi_byte") if &bomb if Has_Unicode() let l:enc = l:enc . "☻" else let l:enc = l:enc . "@" endif endif endif return 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. " 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 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 " Show the status line. fun! Show_StatusLine() "{{{2 if ! has("statusline") return endif call Iain_Vars() let l:sl1='%2n\:\ %<%1*%f%0*\ [%{Show_Encoding()}%{Show_List()}%{Show_Bind()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%{Show_VirtualEdit()}%{Show_Undo()}%Y%M%R%{Show_SearchForward()}]%{Show_Alt()}\ ' let l:sl3='%{Show_Marks()}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 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Handle options only available in Vim 6 and above. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" if version >= "600" "{{{1 version 6.0 if has("win32") || has("win64") se encoding=utf-8 endif " Remember quickfix state. if has("quickfix") let g:quickfixing=0 endif " Set indenting by filetype. filetype indent on " Less intrusive syntax highlighting. if has("syntax") " The :syntax enable command tries to source the syntax.vim runtime script. " Parsing this .vimrc will fail if for some reason the runtime doesn't " exist, as could be the case if the binary was installed with no support " files. GNU On Windows is one example of an incomplete installation. try syn enable catch endtry endif " Set colours. if has("gui_running") if has("win32") || has("win64") exe "silent se guifont=DejaVu_Sans_Mono:h10:cANSI" else exe "silent se guifont=DejaVu\\ Sans\\ Mono\\ 10" endif endif if has("gui_running") || &t_Co > 16 exe "silent colo iain" endif " Ignore whitespace when diffing. if has("diff") se diffopt=filler,iwhite 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 endif " Make * and # work the way you expect in visual mode. vnoremap * y/\V=substitute(escape(@@,"/\\"),"\n","\\\\n","ge") vnoremap # y?\V=substitute(escape(@@,"?\\"),"\n","\\\\n","ge") " Set mark and update highlighting. if has("signs") au Signs BufReadPost * call Highlight_Signs() au Signs CursorHold * call Highlight_Signs() endif " Helper to set buffer variable for a given sign. fun! Prep_Sign(sign) "{{{2 if ! exists("b:sign" . a:sign) || ! g:marksigns exe "let b:sign" . a:sign . "=0" endif endfun "}}}2 fun! Place_Sign(number, line, old, name) "{{{2 if a:line == a:old return a:old endif exe "sign unplace " . (g:firstsign + a:number) . " buffer=" . bufnr("") " Don't place the sign if it would conflict with the last change sign. exe "sign place " . (g:firstsign + a:number) . " line=" . a:line . " name=" . a:name . " buffer=" . bufnr("") return a:line endfun "}}}2 fun! Highlight_Signs(...) "{{{2 if ! has("signs") || ! g:marksigns || Uncluttered_Buffer() return endif let l:signs = g:iainsigns let l:sign = "" let l:i = 0 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 Prep_Sign(l:var) exe "let " . l:var . " = 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! 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 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 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():") " Change statusline verbosity with \v. call Mapping("V", ":call Cycle_VerboseStatusLine():") " Cycle list styles with \l. call Mapping("l", ":call Cycle_List():") " Toggle tags with \t. call Mapping("t", ":Tlist") " Change foldmethod with \f. call Mapping("f", ":se foldenable!:") " Toggle quickfix window with \q. call Mapping("q", ":call Cycle_Quickfix():") " Rerun filetype detection with \s. The s is for syntax, as this will be " updated as a side-effect. call Mapping("S", ":filetype detect:") " Toggle marks with \m. call Mapping("m", ":call Cycle_Signs(1):") if has("autocmd") " Show signs by default. au Display VimEnter * call Cycle_Signs(0) endif endif "}}}1 " move. nmap MoveLineHalfPageUp nmap MoveLineHalfPageDown vmap MoveBlockHalfPageUp vmap MoveBlockHalfPageDown """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Handle options only available in Vim 7 and above. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" if version >= "700" "{{{1 version 7.0 " Helper to show tab name. fun! 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! TabModified(buflist) "{{{2 let l:i = 0 while l:i < len(a:buflist) if getbufvar(a:buflist[l:i], "&modified") == 1 return "+" endif let l:i = l:i + 1 endwhile return "" endfun "}}}2 " Tab line. fun! Show_TabLine() "{{{2 let l:s = "%#TabLineFill#Tabs:" let l:i = 0 while l:i < tabpagenr("$") let l:i = l:i + 1 " Get the label. let l:buflist = tabpagebuflist(l:i) let l:winnr = tabpagewinnr(l:i) let l:n = tabpagewinnr(l:i, "$") let l:label = TabName(bufname(l:buflist[l:winnr - 1]), 0) let l:modified = TabModified(l:buflist) " Choose highlighting. if l:i == tabpagenr() let l:s .= "%#TabLineSel#[" . l:n . l:modified . " " . l:label . "]" else let l:s .= "%#TabLine# " . l:n . l:modified . " " . l:label . " " endif endwhile " Padding. let l:s .= "%#TabLine#%T" return l:s endfun "}}}2 " Per tab label for the GUI. fun! Show_GUITabLine() "{{{2 let l:buflist = tabpagebuflist(v:lnum) let l:winnr = tabpagewinnr(v:lnum) let l:s = tabpagewinnr(v:lnum, "$") let l:label = TabName(bufname(l:buflist[l:winnr - 1]), 1) let l:modified = TabModified(l:buflist) let l:s .= l:modified . " " . l:label return l:s endfun "}}}2 " Handle searching in a BufExplorer window. fun! 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 if a:n == 0 return endif " Peek ahead to the next matching line. let l:next = search(l:re, 'w') " Select the buffer if the match is unambiguous. if l:next == l:line exe "normal \" return endif " Go back. call cursor(l:line, 0) endfun! "}}}2 " Entering a BufExplorer window. fun! BufExplorer_Map() "{{{2 for l:n in [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ] exec "nnoremap " . l:n . " :call BufExplorer_Search(" . l:n . ")" 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 InsertChange * call Highlight_StatusLine("I") au StatusLine InsertLeave * call Highlight_StatusLine("i") if has("signs") au Signs CursorHoldI * call Highlight_Signs() au Signs InsertEnter * call Highlight_Signs() au Signs InsertLeave * call Highlight_Signs() endif au Mode BufEnter \[BufExplorer\] call BufExplorer_Map() endif " Limit the size of the popup menu when completing. if has("insert_expand") se pumheight=20 endif " Make diffs vertical by default. if has("diff") se diffopt+=vertical endif " Set size of numbers column. if has("linebreak") se numberwidth=5 endif " Add "previous tab" mapping as gb. map gb :tabprevious: " Transparency. if has("gui_macvim") se transparency=15 endif " Yet more GUI options. Add tabs. if has("gui") se go+=e endif " Perforce. let g:p4EnableMenu=1 let g:p4Presets='P4CONFIG' " BufExplorer. let g:bufExplorerShowRelativePath=1 let g:bufExplorerSplitOutPathName=0 " NERDcommenter. let g:NERDSpaceDelims=1 endif "}}}1 " localvimrc. let g:localvimrc_persistent=1 " Gitv. let g:Gitv_OpenHorizontal='auto' let g:Gitv_WipeAllOnClose=1 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Handle options only available in Vim 7.2 and above. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" if version >= "702" "{{{1 if has("autocmd") " http://vim.wikia.com/wiki/Highlight_unwanted_spaces augroup WhitespaceMatch autocmd! au Display BufWinEnter * call Extra_Whitespace_Match() au Display Syntax * call Extra_Whitespace_Match() au Display BufWinLeave * call clearmatches() augroup END fun! Extra_Whitespace_Match() "{{{2 " \s\+ " $ " \@ " \%# let l:pattern = '\s\+\%#\@ " \(^\s$\) let l:pattern = '\(^\s$\)\@!' . l:pattern endif let l:hl = 'ctermfg=red guifg=red' if ! &list " Underline if we aren't using listchars. let l:hl = l:hl . ' cterm=underline gui=underline' endif highlight clear ExtraWhitespace exe "highlight ExtraWhitespace " . l:hl if exists('w:whitespace_match_number') try call matchdelete(w:whitespace_match_number) catch endtry call matchadd('ExtraWhitespace', l:pattern, 10, w:whitespace_match_number) else let w:whitespace_match_number = matchadd('ExtraWhitespace', l:pattern) endif endfun "}}}2 call Extra_Whitespace_Match() endif 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 Cycle_Undo():") " Remove persistent undo file with \U. call Mapping("U", ":call Clear_Undo():") " Toggle gundo window with \g. call Mapping("g", ":call gundo#GundoToggle():") " Use a persistent undo file if it exists. fun! Check_Undo() "{{{2 if filereadable(undofile(expand("%"))) setlocal undofile endif endfun "}}}2 " Toggle persistent undo for this buffer. fun! Cycle_Undo() "{{{2 if has("persistent_undo") let &undofile = ! &undofile endif endfun "}}}2 " Remove the persistent undo file for this buffer. fun! 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! 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 Cycle_ColorColumn():") " Remove last shown ColorColumn with \Cc. call Mapping("Cc", ":let &colorcolumn=substitute(&colorcolumn, \",*[0-9]*$\", \"\", \"\"):") " Remove all ColorColumns with \Cx. call Mapping("Cx", ":se colorcolumn=:") endif " Use persistent undo if available. if has("autocmd") if has("persistent_undo") au File BufReadPost * call Check_Undo() endif if has("cursorbind") au Display WinEnter * if &diff | se cursorbind | endif endif endif " Mapping to reload the gundo window. if has("autocmd") au Mode BufEnter * if &ft == "gundo" | try | nnoremap r :call gundo#GundoToggle():call gundo#GundoToggle() | catch | endtry | endif endif endif "}}}1 " """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Handle options only available in Vim 7.4 and above. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" if version >= "704" "{{{1 version 7.4 if has("syntax") se cursorline endif endif "}}}1 " Resize after startup. if version >= "500" "{{{1 if has("autocmd") au Display VimEnter * call Startup_Resize() endif endif "}}}1