"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " 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. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "{{{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. 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 " Use ^B to search backward when completing. inoremap " Use ^L to show matching completions but don't select one. inoremap " Swap jump keys. noremap ' ` noremap ` ' "}}}1 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " 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. 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 " Save sessions in UNIX format with / as file separator. This is " cross-platform. se ssop+=unix,slash " 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 autocmd! endif augroup StatusLine autocmd! augroup END " Save the current window width so we can restore it when we quit. if ! exists("g:oldcols") let g:oldcols=&columns endif " More GUI options. Add icon and tearoffs. se go+=i se go+=t " Allow dynamic window resize even if we aren't in an xterm. se t_WS=[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()} endif " Syntax highlighting. New versions will use syn enable instead. if version < "600" syn on endif " Catch typos. command! W :w command! Wq :wq command! Wqa :wqa " 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:iaincul", 0) if has("signs") call Prep_Var("g:marksigns", 0) call Prep_Var("g:firstsign", 100) endif 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 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("") == "" 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 " 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 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 size. 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" 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 " 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 " 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. au Display VimLeave * if exists("g:oldcols") | call Resize_Columns("-", (&columns - g:oldcols)) | endif " Map Makefile mode. au Mode BufEnter * if &ft == "make" | call MakeMode_map() | endif au Mode BufLeave * if &ft == "make" | call MakeMode_unmap() | 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 " Show the status line for the first time. call Show_StatusLine() " 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 @/=\"\":") " Forget the Ex mode mapping. map Q " 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" 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 " 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:warningcolour = "darkred" let l:readonlycolour = "red" " 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 == "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 == "darkred" return 88 elseif a:colour == "red" return 196 endif else return a:colour endif endfun "}}}2 au StatusLine VimEnter * call Highlight_StatusLine("") " Show numbers by default. au Display VimEnter * if ! Uncluttered_Buffer() | call Number(0) | endif " Position the compview plugin window. au Display BufEnter -SearchResults- set buftype=nowrite | set nonumber | wincmd J endif "}}}1 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Handle options only available in Vim 6 and above. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" if version >= "600" "{{{1 version 6.0 if has("gui_win32") se encoding=utf-8 endif " Remember quickfix state. let g:quickfixing=0 " Set indenting by filetype. filetype indent on " Less intrusive syntax highlighting. syn enable " 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. se diffopt=filler,iwhite " Expand window when doing a vertical diff. if &diff if &columns < 161 let &columns = &columns * 2 endif 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 " Allow in-place editing of crontabs. au Mode FileType crontab set backupcopy=yes " 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, '"', '\\"', "") call Prep_Sign(l:var) exe "let " . l:var . " = Place_Sign(" . l:i . ", line(\"'" . l:ascii . "\"), 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. " Define the Mark where Symbol is not also the mark name, eg "']". if Has_Unicode() let g:iainsigns = "Dash:'=’ Dot:..• Quote:\"=” Caret:^.ʌ" else let g:iainsigns = "Dash=' Dot:..* Quote=\" Caret.^" endif let g:iainsigns = 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" 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: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=", "") exe "sign define Mark" . l:sign 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 " 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 " 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) 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 g:quickfixing == 1 cclose let g:quickfixing=0 else copen endif 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):") " Show signs by default. au Display VimEnter * call Cycle_Signs(0) endif "}}}1 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " 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 " Toggle highlighting cursor line when focus changes. fun! 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 endif endfun "}}}2 se tabline=%!Show_TabLine() se guitablabel=%!Show_GUITabLine() 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") au Display FocusGained,FocusLost * call ToggleCursorLine() if has("signs") au Signs InsertEnter * call Highlight_Signs() au Signs InsertLeave * call Highlight_Signs() endif " Limit the size of the popup menu when completing. se pumheight=20 " Make diffs vertical by default. se diffopt+=vertical " Set size of numbers column. se numberwidth=5 " Add "previous tab" mapping as gb. map gb :tabprevious: " Transparency. if has("gui_macvim") se transparency=15 endif " Yet more GUI options. Add tabs. se go+=e " Perforce. let g:p4EnableMenu=1 let g:p4Presets='P4CONFIG' " BufExplorer. let g:bufExplorerShowRelativePath=1 let g:bufExplorerSplitOutPathName=0 endif "}}}1 " Resize after startup. if version >= "500" "{{{1 au Display VimEnter * call Startup_Resize() endif "}}}1