X-Git-Url: http://git.iain.cx/?p=profile.git;a=blobdiff_plain;f=.vimrc;h=f885cbc19a8fae08ca453a463d451622c4ca217d;hp=3ba782acb0d537362e7753d11d709443661539ca;hb=3c2f9e59a2f2d1297ac9d05aa9c64a78d8c554e8;hpb=ab6db4a720b2d9de8aa3efed76aebc7d94539024 diff --git a/.vimrc b/.vimrc index 3ba782a..f885cbc 100644 --- a/.vimrc +++ b/.vimrc @@ -1,6 +1,4 @@ """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" $Id$ -"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Multi-version vimrc compatible with version 4 and above. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -79,9 +77,6 @@ se wildignore+=*.o,*.obj " So there's no need to assign them low priority. se suffixes-=*.o,*.obj -" Vim 5 hardcodes the size of numbers column to 8. -let numberwidth=8 - " Save sessions in UNIX format with / as file separator. This is " cross-platform. se ssop+=unix,slash @@ -105,7 +100,7 @@ se hlsearch se titlestring=%{Show_TitleString()} " Syntax highlighting. New versions will use syn enable instead. -if version < 600 +if version < "600" syn on endif @@ -133,6 +128,9 @@ fun! Iain_Vars() " Window Flags: (F)ocused, (I)nsert mode, Cursor (H)old. let b:iainstatus = "Fih" endif + if ! exists("g:iainextracolumns") + let g:iainextracolumns = 0 + endif endfun " Helper for status line. @@ -180,28 +178,28 @@ endfun " Show the window title. fun! Show_TitleString() if bufname("") == "" - let ts1='Vim' + let l:ts1='Vim' else - let ts1=printf("%2d: %s", bufnr(""), expand('%t')) + let l:ts1=printf("%2d: %s", bufnr(""), expand('%t')) endif - return printf("%s (%s) %s", ts1, getcwd(), v:servername) + return printf("%s (%s) %s", l:ts1, getcwd(), v:servername) endfun " Show the status line. fun! Show_StatusLine() call Iain_Vars() - let sl1='%2n\:\ %<%f\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ %=' - let sl3='L:%4.6l/%-4.6L\ C:%3.6c\ \|\ %P' - let hexformat='%b' + let l:sl1='%2n\:\ %<%f\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ %=' + let l:sl3='L:%4.6l/%-4.6L\ C:%3.6c\ \|\ %P' + let l:hexformat='%b' if b:iainhex - let hexformat='0\x%02B' + let l:hexformat='0\x%02B' endif if b:iainverbose - let sl2=hexformat . '\ \|\ P:%4.6o\ ' + let l:sl2=l:hexformat . '\ \|\ P:%4.6o\ ' else - let sl2='' + let l:sl2='' endif - exec "set statusline=" . sl1 . sl2 . sl3 + exec "set statusline=" . l:sl1 . l:sl2 . l:sl3 endfun " Toggle case-sensitivity. @@ -209,6 +207,49 @@ fun! Invert_Case() let &ic = ! &ic endfun +" Grow or shrink the window size. +fun! Resize_Columns(op) + " XXX: This won't work inside screen. + " We should really detect whether it would work rather than assume it won't. + if &term =~ '^screen' + return + endif + + " Vim 5 hardcodes the size of numbers column to 8. + if version >= "700" + let l:numberwidth = &numberwidth + else + let l:numberwidth = 8 + endif + + exec "se columns" . a:op . "=" . l:numberwidth +endfun + +" Toggle number display. +fun! Number() + call Iain_Vars() + let &number = ! &number + + if version >= "700" + let l:i = 0 + let l:num_numbers = 0 + while l:i <= winnr("$") + if getwinvar(l:i, "&number") == 1 + let l:num_numbers = l:num_numbers + 1 + endif + let l:i = l:i + 1 + endwhile + + if l:num_numbers == 0 + let g:iainextracolumns = 0 + call Resize_Columns("-") + elseif g:iainextracolumns == 0 + let g:iainextracolumns = 1 + call Resize_Columns("+") + endif + endif +endfun + " Restore window size. au VimLeave * if exists("oldcols") | let &columns=oldcols | endif @@ -263,10 +304,10 @@ call Mapping("p", ":se paste!:") " Swap case-sensitivity with \c. call Mapping("c", ":call Invert_Case():") " Change number mode with \n. -call Mapping("n", ":se number!:") -" Expand or shrink window size with \> and \<. For use after toggling number. -call Mapping(">", ":exe 'se columns+=' . numberwidth:") -call Mapping("<", ":exe 'se columns-=' . numberwidth:") +call Mapping("n", ":call Number():") +" Expand or shrink window size with \> and \<. +call Mapping(">", ":call Resize_Columns('+'):") +call Mapping("<", ":call Resize_Columns('-'):") " Clear search pattern with \/. call Mapping("/", ":let @/=\"\":") @@ -297,6 +338,7 @@ syn enable if has("gui_running") se guifont=DejaVu\ Sans\ Mono\ 10 colo darkblue + hi LineNr guibg=#303030 elseif &t_Co > 16 try colo iain @@ -306,6 +348,8 @@ endif if has("win32") se guifont=DejaVu_Sans_Mono:h10:cANSI endif +hi! link TabLineSel StatusLine +hi! link TabLine StatusLineNC " Ignore whitespace when diffing. se diffopt=filler,iwhite @@ -404,19 +448,21 @@ fun! Highlight_StatusLine(flag) if b:iainstatus =~# "I" " Held in insert mode. Add extra highlight if we don't have focus. if b:iainstatus =~# "f" - let s:colour = "darkmagenta" - else let s:colour = "darkred" + let s:term88colour = "32" + let s:term256colour = "88" + else + let s:colour = "darkmagenta" + let s:term88colour = "33" + let s:term256colour = "90" endif - let s:term88colour = "32" - let s:term256colour = "88" endif else if b:iainstatus =~# "I" " Regular insert mode. - let s:colour = "darkred" - let s:term88colour = "32" - let s:term256colour = "88" + let s:colour = "darkmagenta" + let s:term88colour = "33" + let s:term256colour = "90" endif endif @@ -440,6 +486,77 @@ endif if version >= "700" version 7.0 +" Helper to show tab name. +fun! TabName(label, gui) + 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 + +" Find out if any buffer was modified. +fun! TabModified(buflist) + let l:i = 0 + while i < len(a:buflist) + if getbufvar(a:buflist[l:i], "&modified") == 1 + return "+" + endif + let l:i = l:i + 1 + endwhile + return "" +endfun + +" Tab line. +fun! Show_TabLine() + 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 + +" Per tab label for the GUI. +fun! Show_GUITabLine() + 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 + +se tabline=%!Show_TabLine() +se guitablabel=%!Show_GUITabLine() + au CursorHoldI * call Highlight_StatusLine("H") au CursorMovedI * call Highlight_StatusLine("h") au FocusGained * call Highlight_StatusLine("F") @@ -454,13 +571,16 @@ se diffopt+=vertical se numberwidth=5 " Add "previous tab" mapping as gb. -map gb :tabPrev +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'