X-Git-Url: http://git.iain.cx/?p=profile.git;a=blobdiff_plain;f=.vimrc;h=96f8a1f3da3bbbaecbb35a43dad04bdc7a1911e8;hp=9da37fea14138f2a143b5102dc0740ac148c02aa;hb=3e4ed13b68141823f47f93acc00572a823c56995;hpb=8c502fd1cc463e5f8de03492ea7cfd7eda4e4c65 diff --git a/.vimrc b/.vimrc index 9da37fe..96f8a1f 100644 --- a/.vimrc +++ b/.vimrc @@ -59,6 +59,11 @@ 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 + """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Handle options only available in Vim 5 and above. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -100,7 +105,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 @@ -216,7 +221,7 @@ fun! Resize_Columns(op) endif " Vim 5 hardcodes the size of numbers column to 8. - if version >= 600 + if version >= "700" let l:numberwidth = &numberwidth else let l:numberwidth = 8 @@ -230,21 +235,23 @@ fun! Number() call Iain_Vars() let &number = ! &number - 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 + 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 - 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 endfun @@ -336,6 +343,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 @@ -345,6 +353,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 @@ -424,7 +434,36 @@ call Mapping("q", ":call Cycle_Quickfix():") " updated as a side-effect. call Mapping("s", ":filetype detect:") +fun! Iain_Colour(colour) + 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 + " 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) " Get current status. call Iain_Vars() @@ -433,43 +472,40 @@ fun! Highlight_StatusLine(flag) let re = "[" . tolower(a:flag) . toupper(a:flag) . "]" let b:iainstatus = substitute(b:iainstatus, re, a:flag, "") + let l:normalcolour = "darkblue" + let l:editingcolour = "darkmagenta" + let l:warningcolour = "darkred" + let l:readonlycolour = "red" + " Default colour. - let s:colour = "darkblue" - let s:termcolour = "" - let s:term88colour = "17" - let s:term256colour = "17" + 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 s:colour = "darkred" - let s:term88colour = "32" - let s:term256colour = "88" + let l:colour = l:warningcolour else - let s:colour = "darkmagenta" - let s:term88colour = "33" - let s:term256colour = "90" + let l:colour = l:editingcolour endif endif else if b:iainstatus =~# "I" " Regular insert mode. - let s:colour = "darkmagenta" - let s:term88colour = "33" - let s:term256colour = "90" + let l:colour = l:editingcolour endif endif - if &t_Co == 88 - let s:termcolour = s:term88colour - elseif &t_Co == 256 - let s:termcolour = s:term256colour - else - let s:termcolour = s:colour + " Override again if readonly. + if l:colour != l:normalcolour + if getbufvar("", "&ro") + let l:colour = l:readonlycolour + endif endif - exec "highlight StatusLine guifg=white guibg=" . s:colour . " ctermbg=white ctermfg=" . s:termcolour + let l:termcolour = Iain_Colour(l:colour) + + exec "highlight StatusLine guifg=white guibg=" . l:colour . " ctermbg=white ctermfg=" . l:termcolour endfun call Highlight_StatusLine("") @@ -481,6 +517,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") @@ -488,6 +595,9 @@ au FocusLost * call Highlight_StatusLine("f") au InsertEnter * call Highlight_StatusLine("I") au InsertLeave * call Highlight_StatusLine("i") +" Limit the size of the popup menu when completing. +se pumheight=20 + " Make diffs vertical by default. se diffopt+=vertical @@ -495,13 +605,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'