X-Git-Url: http://git.iain.cx/?p=profile.git;a=blobdiff_plain;f=.vimrc;h=21a9d0f9aa00577fa38278262f4238200b4b3af0;hp=65d889513818862f648d91beb1fed1cf1b0bbeed;hb=19d0f46786b27c544f7a3f4241f0ead99d964db3;hpb=4e5e1cbacdc09f06d70f30c42e5b0fa76f23b512 diff --git a/.vimrc b/.vimrc index 65d8895..21a9d0f 100644 --- a/.vimrc +++ b/.vimrc @@ -1,5 +1,5 @@ """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" Multi-version vimrc compatible with version 4 and above. +" Multi-version vimrc compatible with version 4 and above. vim:set fdm=marker: """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Note that "if | call Something() | endif" syntax is unsupported @@ -14,6 +14,7 @@ version 4.0 " "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 @@ -28,10 +29,15 @@ se ts=2 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. @@ -69,10 +75,15 @@ 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" +if version >= "500" "{{{1 version 5.0 " Tell Vim we use dark backgrounds in our terminals. @@ -102,6 +113,9 @@ se suffixes-=*.o,*.obj " 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! @@ -143,110 +157,129 @@ command! W :w command! Wq :wq command! Wqa :wqa -" Set up our variables. -fun! Iain_Vars() - if ! exists("b:iainlist") - let b:iainlist = 0 - endif - if ! exists("b:iainhex") - let b:iainhex = 0 - endif - if ! exists("b:iainverbose") - let b:iainverbose = 0 - endif - if ! exists("b:iainstatus") - " Window Flags: (F)ocused, (I)nsert mode, Cursor (H)old. - let b:iainstatus = "Fih" - endif - if ! exists("g:iainextracolumns") - let g:iainextracolumns = 0 +" 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") - if ! exists("g:marksigns") - let g:marksigns = 0 - endif - if ! exists("g:firstsign") - let g:firstsign = 100 - endif + call Prep_Var("g:marksigns", 0) + call Prep_Var("g:firstsign", 100) endif -endfun +endfun "}}}2 " Helper for status line. " Show space, underscore or dollar sign depending on list mode. -fun! Show_List() +fun! Show_List() "{{{2 call Iain_Vars() - if b:iainlist == 0 + if w:iainlist == 0 " No list. return " " - elseif b:iainlist == 1 - " Just tabs. - return "_" + elseif Has_Unicode() + if w:iainlist == 1 + " Just tabs. + return "»" + else + " Full list. + return "¶" + endif else - " Full list. - return "\$" + if w:iainlist == 1 + return "_" + else + return "\$" + endif endif -endfun +endfun "}}}2 " Helper for status line. " Show c or C to denote case-sensitivity. -fun! Show_Case() +fun! Show_Case() "{{{2 if &ic return "c" else return "C" endif -endfun +endfun "}}}2 " Helper for status line. " Show the size of the tabstop. -fun! Show_Tabstop() +fun! Show_Tabstop() "{{{2 return &ts -endfun +endfun "}}}2 " Helper for status line. " Show p when paste mode is on. -fun! Show_Paste() +fun! Show_Paste() "{{{2 if &paste return "p" else return "" endif -endfun +endfun "}}}2 " Show the window title. -fun! Show_TitleString() +fun! Show_TitleString() "{{{2 if bufname("") == "" let l:ts1='Vim' else - let l:ts1=printf("%2d: %s", bufnr(""), expand('%t')) + " 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 - return printf("%s (%s) %s", l:ts1, getcwd(), v:servername) -endfun + 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() +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' 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 +endfun "}}}2 " Toggle case-sensitivity. -fun! Invert_Case() +fun! Invert_Case() "{{{2 let &ic = ! &ic -endfun +endfun "}}}2 " Grow or shrink the window size. -fun! Resize_Columns(op, ...) +fun! Resize_Columns(op, ...) "{{{2 + if a:op == "" + return + endif + if a:0 == 0 " Vim 5 hardcodes the size of numbers column to 8. if version >= "700" @@ -273,36 +306,77 @@ fun! Resize_Columns(op, ...) endif exe l:resize -endfun +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" -" Toggle number display. -fun! Number(resize) 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 a:0 == 0 + let l:condition = "" + else + let l:condition = a:1 + endif - if l:num_numbers == 0 - let g:iainextracolumns = 0 - if a:resize - call Resize_Columns("-") - endif - elseif g:iainextracolumns == 0 - let g:iainextracolumns = 1 - if a:resize - call Resize_Columns("+") + 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 +endfun "}}}2 " Restore window size. au Display VimLeave * if exists("g:oldcols") | call Resize_Columns("-", (&columns - g:oldcols)) | endif @@ -312,32 +386,32 @@ 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() - call Iain_Vars() - let b:iainlist=1 +fun! MakeMode_map() "{{{2 + call Iain_Vars() + let w:iainlist=1 call Cycle_List() set ts=8 set noexpandtab -endfun +endfun "}}}2 " Leaving Make mode. -fun! MakeMode_unmap() +fun! MakeMode_unmap() "{{{2 call Cycle_List() set ts=2 set expandtab -endfun +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) +fun! Mapping(keysequence,mapping) "{{{2 if version < "600" exec "map \\" . a:keysequence . " " . a:mapping else exec "map " . a:keysequence . " " . a:mapping endif -endfun +endfun "}}}2 " Use - and = to create underlines. call Mapping("-", "yyp:s/./-/g:let @/='':") @@ -356,7 +430,7 @@ 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():") +call Mapping("C", ":call Invert_Case():") " Change number mode with \n. call Mapping("n", ":call Number(1):") " Expand or shrink window size with \> and \<. @@ -371,7 +445,7 @@ 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() +fun! Uncluttered_Buffer() "{{{2 if exists("uncluttered_buffer") if uncluttered_buffer == 1 return 1 @@ -397,9 +471,9 @@ fun! Uncluttered_Buffer() endif return 0 -endfun +endfun "}}}2 -fun! Startup_Resize() +fun! Startup_Resize() "{{{2 let l:columns = 0 " Resize for numbers. @@ -423,18 +497,104 @@ fun! Startup_Resize() if g:oldcols < (80 + l:columns) call Resize_Columns("+", l:columns) endif -endfun +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 -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" +if version >= "600" "{{{1 version 6.0 +if has("win32") + se encoding=utf-8 +endif + " Remember quickfix state. let g:quickfixing=0 @@ -446,20 +606,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") + 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 - try - colo iain - catch - endtry + exe "silent colo iain" endif " Ignore whitespace when diffing. @@ -485,74 +639,45 @@ vnoremap # y?\V=substitute(escape(@@,"?\\"),"\n","\\\\n","ge") " Set mark and update highlighting. if has("signs") - au Signs BufEnter * call Highlight_Signs() + au Signs BufReadPost * call Highlight_Signs() au Signs CursorHold * call Highlight_Signs() endif -fun! Prep_Signs() - if ! exists("b:signdot") || ! g:marksigns - let b:signdot=0 - endif - if ! exists("b:signdash") || ! g:marksigns - let b:signdash=0 - endif - if ! exists("b:signquote") || ! g:marksigns - let b:signquote=0 - endif - if ! exists("b:signcaret") || ! g:marksigns - let b:signcaret=0 - endif - if ! exists("b:signless") || ! g:marksigns - let b:signless=0 - endif - if ! exists("b:signgreater") || ! g:marksigns - let b:signgreater=0 - endif - if ! exists("b:signleft") || ! g:marksigns - let b:signleft=0 - endif - if ! exists("b:signright") || ! g:marksigns - let b:signright=0 - endif - if ! exists("b:signa") || ! g:marksigns - let b:signa=0 - endif - if ! exists("b:signb") || ! g:marksigns - let b:signb=0 - endif - if ! exists("b:signc") || ! g:marksigns - let b:signc=0 - endif - if ! exists("b:signd") || ! g:marksigns - let b:signd=0 - endif - if ! exists("b:signe") || ! g:marksigns - let b:signe=0 - endif - if ! exists("b:signf") || ! g:marksigns - let b:signf=0 - endif - if ! exists("b:signA") || ! g:marksigns - let b:signA=0 - endif - if ! exists("b:signB") || ! g:marksigns - let b:signB=0 - endif - if ! exists("b:signC") || ! g:marksigns - let b:signC=0 - endif - if ! exists("b:signD") || ! g:marksigns - let b:signD=0 - endif - if ! exists("b:signE") || ! g:marksigns - let b:signE=0 - endif - if ! exists("b:signF") || ! g:marksigns - let b:signF=0 - endif -endfun! - -fun! Place_Sign(number, line, old, name) +" 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! Prep_Signs() "{{{2 + call Prep_Sign("dot") + call Prep_Sign("dash") + call Prep_Sign("quote") + call Prep_Sign("caret") + call Prep_Sign("less") + call Prep_Sign("greater") + call Prep_Sign("left") + call Prep_Sign("right") + call Prep_Sign("squareleft") + call Prep_Sign("squareright") + call Prep_Sign("braceleft") + call Prep_Sign("braceright") + call Prep_Sign("a") + call Prep_Sign("b") + call Prep_Sign("c") + call Prep_Sign("d") + call Prep_Sign("e") + call Prep_Sign("f") + call Prep_Sign("A") + call Prep_Sign("B") + call Prep_Sign("C") + call Prep_Sign("D") + call Prep_Sign("E") + call Prep_Sign("F") +endfun! "}}}2 + +fun! Place_Sign(number, line, old, name) "{{{2 if a:line == a:old return a:old endif @@ -561,9 +686,9 @@ fun! Place_Sign(number, line, old, name) " 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 +endfun "}}}2 -fun! Highlight_Signs(...) +fun! Highlight_Signs(...) "{{{2 if ! has("signs") || ! g:marksigns || Uncluttered_Buffer() return endif @@ -574,27 +699,31 @@ fun! Highlight_Signs(...) let b:signdash = Place_Sign(1, line("''"), b:signdash, "MarkDash") let b:signquote = Place_Sign(2, line("'\""), b:signquote, "MarkQuote") let b:signcaret = Place_Sign(3, line("'^"), b:signcaret, "MarkCaret") - let b:signless = Place_Sign(4, line("'<"), b:signcaret, "MarkLess") - let b:signgreater = Place_Sign(5, line("'>"), b:signcaret, "MarkGreater") - let b:signleft = Place_Sign(6, line("'["), b:signcaret, "MarkLeft") - let b:signright = Place_Sign(7, line("']"), b:signcaret, "MarkRight") - - let b:signa = Place_Sign(8, line("'a"), b:signa, "Marka") - let b:signb = Place_Sign(9, line("'b"), b:signb, "Markb") - let b:signc = Place_Sign(10, line("'c"), b:signc, "Markc") - let b:signd = Place_Sign(11, line("'d"), b:signd, "Markd") - let b:signe = Place_Sign(12, line("'e"), b:signe, "Marke") - let b:signf = Place_Sign(13, line("'f"), b:signf, "Markf") - let b:signA = Place_Sign(14, line("'A"), b:signA, "MarkA") - let b:signB = Place_Sign(15, line("'B"), b:signB, "MarkB") - let b:signC = Place_Sign(16, line("'C"), b:signC, "MarkC") - let b:signD = Place_Sign(17, line("'D"), b:signD, "MarkD") - let b:signE = Place_Sign(18, line("'E"), b:signE, "MarkE") - let b:signF = Place_Sign(19, line("'F"), b:signF, "MarkF") -endfun + let b:signless = Place_Sign(4, line("'<"), b:signless, "MarkLess") + let b:signgreater = Place_Sign(5, line("'>"), b:signgreater, "MarkGreater") + let b:signleft = Place_Sign(6, line("'("), b:signleft, "MarkLeft") + let b:signright = Place_Sign(7, line("')"), b:signright, "MarkRight") + let b:signsquareleft = Place_Sign(8, line("'["), b:signsquareleft, "MarkSquareLeft") + let b:signsquareright = Place_Sign(9, line("']"), b:signsquareright, "MarkSquareRight") + let b:signbraceleft = Place_Sign(10, line("'{"), b:signbraceleft, "MarkBraceLeft") + let b:signbraceright = Place_Sign(11, line("'}"), b:signbraceright, "MarkBraceRight") + + let b:signa = Place_Sign(12, line("'a"), b:signa, "Marka") + let b:signb = Place_Sign(13, line("'b"), b:signb, "Markb") + let b:signc = Place_Sign(15, line("'c"), b:signc, "Markc") + let b:signd = Place_Sign(16, line("'d"), b:signd, "Markd") + let b:signe = Place_Sign(17, line("'e"), b:signe, "Marke") + let b:signf = Place_Sign(18, line("'f"), b:signf, "Markf") + let b:signA = Place_Sign(19, line("'A"), b:signA, "MarkA") + let b:signB = Place_Sign(20, line("'B"), b:signB, "MarkB") + let b:signC = Place_Sign(21, line("'C"), b:signC, "MarkC") + let b:signD = Place_Sign(22, line("'D"), b:signD, "MarkD") + let b:signE = Place_Sign(23, line("'E"), b:signE, "MarkE") + let b:signF = Place_Sign(24, line("'F"), b:signF, "MarkF") +endfun "}}}2 " Toggle signs. -fun! Cycle_Signs(resize) +fun! Cycle_Signs(resize) "{{{2 if ! has("signs") return endif @@ -604,14 +733,25 @@ fun! Cycle_Signs(resize) if g:marksigns " Signs to highlight marks. " Syntax won't work properly in Vim 6. - sign define MarkDash text=' texthl=MarkSign - sign define MarkDot text=* texthl=MarkDot - sign define MarkQuote text=" texthl=MarkSign - sign define MarkCaret text=^ texthl=MarkSign + if Has_Unicode() + 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 MarkLess text=< texthl=MarkSign sign define MarkGreater text=> texthl=MarkSign - sign define MarkLeft text=[ texthl=MarkSign - sign define MarkRight text=] texthl=MarkSign + sign define MarkLeft text=( texthl=MarkSign + sign define MarkRight text=) texthl=MarkSign + sign define MarkSquareLeft text=[ texthl=MarkSign + sign define MarkSquareRight text=] texthl=MarkSign + sign define MarkBraceLeft text={ texthl=MarkSign + sign define MarkBraceRight text=} texthl=MarkSign sign define Marka text=a texthl=MarkSign linehl=MarkLine sign define Markb text=b texthl=MarkSign linehl=MarkLine sign define Markc text=c texthl=MarkSign linehl=MarkLine @@ -650,6 +790,11 @@ fun! Cycle_Signs(resize) exe "sign unplace " . (g:firstsign + 17) exe "sign unplace " . (g:firstsign + 18) exe "sign unplace " . (g:firstsign + 19) + exe "sign unplace " . (g:firstsign + 20) + exe "sign unplace " . (g:firstsign + 21) + exe "sign unplace " . (g:firstsign + 22) + exe "sign unplace " . (g:firstsign + 23) + exe "sign unplace " . (g:firstsign + 24) sign undefine MarkDash sign undefine MarkDot @@ -659,6 +804,10 @@ fun! Cycle_Signs(resize) sign undefine MarkGreater sign undefine MarkLeft sign undefine MarkRight + sign undefine MarkSquareLeft + sign undefine MarkSquareRight + sign undefine MarkBraceLeft + sign undefine MarkBraceRight sign undefine Marka sign undefine Markb sign undefine Markc @@ -677,55 +826,91 @@ fun! Cycle_Signs(resize) call Resize_Columns("-", 2) endif endif -endfun +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() - let basic='tab:\\_,trail:_,extends:<,precedes:>' +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 b:iainlist = b:iainlist + 1 - if b:iainlist > 2 - let b:iainlist = 0 - endif - if b:iainlist == 0 - set nolist - elseif b:iainlist == 1 - exec "set lcs=" . basic - set list + 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 "set lcs=" . basic . ",eol:$" - set list + exec "setlocal lcs=" . basic . "," . eol + setlocal list endif -endfun + + call Resize_Columns(Extra_Columns("list", "iainlist", " == 2"), 1) +endfun "}}}2 " Cycle between hex and decimal display of toolbar stuff. -fun! Cycle_HexStatusLine() +fun! Cycle_HexStatusLine() "{{{2 call Iain_Vars() let b:iainhex = ! b:iainhex call Show_StatusLine() -endfun +endfun "}}}2 " Cycle verbose display of toolbar stuff. -fun! Cycle_VerboseStatusLine() +fun! Cycle_VerboseStatusLine() "{{{2 call Iain_Vars() let b:iainverbose = ! b:iainverbose call Show_StatusLine() -endfun +endfun "}}}2 " Toggle quickfix window. -fun! Cycle_Quickfix() +fun! Cycle_Quickfix() "{{{2 if g:quickfixing == 1 cclose let g:quickfixing=0 else copen endif -endfun +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():") +call Mapping("V", ":call Cycle_VerboseStatusLine():") " Cycle list styles with \l. call Mapping("l", ":call Cycle_List():") " Toggle tags with \t. @@ -736,98 +921,22 @@ call Mapping("f", ":se foldenable!:") 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:") +call Mapping("S", ":filetype detect:") " Toggle marks with \m. call Mapping("m", ":call Cycle_Signs(1):") -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() - - " 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 - -au Display VimEnter * call Highlight_StatusLine("") - " Show signs by default. au Display VimEnter * call Cycle_Signs(0) -endif +endif "}}}1 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Handle options only available in Vim 7 and above. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -if version >= "700" +if version >= "700" "{{{1 version 7.0 " Helper to show tab name. -fun! TabName(label, gui) +fun! TabName(label, gui) "{{{2 let l:label = a:label if l:label == "" let l:label = "No Name" @@ -841,10 +950,10 @@ fun! TabName(label, gui) endif endif return l:label -endfun +endfun "}}}2 " Find out if any buffer was modified. -fun! TabModified(buflist) +fun! TabModified(buflist) "{{{2 let l:i = 0 while l:i < len(a:buflist) if getbufvar(a:buflist[l:i], "&modified") == 1 @@ -853,10 +962,10 @@ fun! TabModified(buflist) let l:i = l:i + 1 endwhile return "" -endfun +endfun "}}}2 " Tab line. -fun! Show_TabLine() +fun! Show_TabLine() "{{{2 let l:s = "%#TabLineFill#Tabs:" let l:i = 0 @@ -880,10 +989,10 @@ fun! Show_TabLine() " Padding. let l:s .= "%#TabLine#%T" return l:s -endfun +endfun "}}}2 " Per tab label for the GUI. -fun! Show_GUITabLine() +fun! Show_GUITabLine() "{{{2 let l:buflist = tabpagebuflist(v:lnum) let l:winnr = tabpagewinnr(v:lnum) let l:s = tabpagewinnr(v:lnum, "$") @@ -892,7 +1001,20 @@ fun! Show_GUITabLine() let l:s .= l:modified . " " . l:label return l:s -endfun +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() @@ -904,6 +1026,8 @@ 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() @@ -932,9 +1056,13 @@ se go+=e " Perforce. let g:p4EnableMenu=1 let g:p4Presets='P4CONFIG' -endif -if version >= "500" +" 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 +endif "}}}1