X-Git-Url: http://git.iain.cx/?p=profile.git;a=blobdiff_plain;f=.vimrc;h=e0a31a94da87be5f898007c5809d0845767cee6c;hp=b63d1ba0e7e3226506854ca4afe6924b863dfd2d;hb=f41ffed16658e78da63012d5d2ff9a65457e6897;hpb=c204dd8c0a7d9d0c767e01f98f623af5f103c4d9 diff --git a/.vimrc b/.vimrc index b63d1ba..e0a31a9 100644 --- a/.vimrc +++ b/.vimrc @@ -167,13 +167,13 @@ endfun "}}}2 " Set up our variables. fun! Iain_Vars() "{{{2 - call Prep_Var("b:iainlist", 0) + 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", 0) - call Prep_Var("g:iainextracolumnslist", 0) + call Prep_Var("g:iainextracolumnsnumber", "''") + call Prep_Var("g:iainextracolumnslist", "''") if has("signs") call Prep_Var("g:marksigns", 0) call Prep_Var("g:firstsign", 100) @@ -184,11 +184,11 @@ endfun "}}}2 " Show space, underscore or dollar sign depending on list mode. fun! Show_List() "{{{2 call Iain_Vars() - if b:iainlist == 0 + if w:iainlist == 0 " No list. return " " elseif Has_Unicode() - if b:iainlist == 1 + if w:iainlist == 1 " Just tabs. return "»" else @@ -196,7 +196,7 @@ fun! Show_List() "{{{2 return "¶" endif else - if b:iainlist == 1 + if w:iainlist == 1 return "_" else return "\$" @@ -252,8 +252,8 @@ endfun "}}}2 " Show the status line. fun! Show_StatusLine() "{{{2 call Iain_Vars() - 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: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' @@ -309,10 +309,20 @@ endfun "}}}2 " Set extra columns depending on window status. fun! Extra_Columns(extra, var, ...) "{{{2 - if v:version < "700" + " 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 @@ -321,28 +331,34 @@ fun! Extra_Columns(extra, var, ...) "{{{2 let l:condition = a:1 endif + let l:n = 0 let l:i = 1 - let l:num_windows = 0 - while l:i <= winnr("$") + 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 - let l:num_windows = l:num_windows + 1 + 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:num_windows == l:val + if l:windows == l:val return "" endif - exe "let " . l:extra . " = " . l:num_windows - if l:num_windows == 0 + if l:windows == "" return "-" - elseif l:val == 0 + elseif l:val == "" return "+" endif endfun "}}}2 @@ -371,7 +387,7 @@ au Mode BufLeave * if &ft == "make" | call MakeMode_unmap() | endif " Entering Make mode. fun! MakeMode_map() "{{{2 call Iain_Vars() - let b:iainlist=1 + let w:iainlist=1 call Cycle_List() set ts=8 set noexpandtab @@ -482,6 +498,85 @@ fun! Startup_Resize() "{{{2 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 @@ -510,20 +605,14 @@ syn enable " Set colours. if has("gui_running") - try - if has("win32") - se guifont=DejaVu_Sans_Mono:h10:cANSI - else - se guifont=DejaVu\ Sans\ Mono\ 10 - endif - catch - endtry + if has("win32") + silent se guifont=DejaVu_Sans_Mono:h10:cANSI + else + silent se guifont=DejaVu\ Sans\ Mono\ 10 + endif endif if has("gui_running") || &t_Co > 16 - try - colo iain - catch - endtry + silent colo iain endif " Ignore whitespace when diffing. @@ -647,12 +736,13 @@ fun! Cycle_Signs(resize) "{{{2 sign define MarkDash text=’ texthl=MarkSign sign define MarkDot text=• texthl=MarkDot sign define MarkQuote text=” texthl=MarkSign + sign define MarkCaret text=ʌ texthl=MarkDot else sign define MarkDash text=' texthl=MarkSign sign define MarkDot text=* texthl=MarkDot sign define MarkQuote text=" texthl=MarkSign + sign define MarkCaret text=^ texthl=MarkDot endif - sign define MarkCaret text=^ texthl=MarkDot sign define MarkLess text=< texthl=MarkSign sign define MarkGreater text=> texthl=MarkSign sign define MarkLeft text=( texthl=MarkSign @@ -775,13 +865,13 @@ fun! Cycle_List() "{{{2 endif endif call Iain_Vars() - let b:iainlist = b:iainlist + 1 - if b:iainlist > 2 - let b:iainlist = 0 + let w:iainlist = w:iainlist + 1 + if w:iainlist > 2 + let w:iainlist = 0 endif - if b:iainlist == 0 + if w:iainlist == 0 setlocal nolist - elseif b:iainlist == 1 + elseif w:iainlist == 1 exec "setlocal lcs=" . basic setlocal list else @@ -789,7 +879,7 @@ fun! Cycle_List() "{{{2 setlocal list endif - call Resize_Columns(Extra_Columns("list", "&lcs", " =~# 'eol'"), 1) + call Resize_Columns(Extra_Columns("list", "iainlist", " == 2"), 1) endfun "}}}2 " Cycle between hex and decimal display of toolbar stuff. @@ -834,82 +924,6 @@ call Mapping("S", ":filetype detect:") " Toggle marks with \m. call Mapping("m", ":call Cycle_Signs(1):") -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 - -" 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 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 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=bold term=bold cterm=bold guifg=white guibg=" . l:colour . " ctermfg=white ctermbg=" . l:termcolour -endfun "}}}2 - -au Display VimEnter * call Highlight_StatusLine("") - " Show signs by default. au Display VimEnter * call Cycle_Signs(0) endif "}}}1