X-Git-Url: http://git.iain.cx/?p=profile.git;a=blobdiff_plain;f=.vimrc;h=baddfed6b3cf87a65cb36af585188f03aa665c59;hp=5b9308d11f757fc330f4632368550fc545a8e01d;hb=185902dd63a6f0ccee4dd6ef6651f3caa636d04c;hpb=b06e3bd3f984e445593d218b659d9597bdaddcaa diff --git a/.vimrc b/.vimrc old mode 100755 new mode 100644 index 5b9308d..baddfed --- a/.vimrc +++ b/.vimrc @@ -39,6 +39,7 @@ 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 @@ -57,6 +58,9 @@ 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 - and = to create underlines. map - yyp:s/./-/g:let @/='': map = yyp:s/./=/g:let @/='': @@ -67,6 +71,18 @@ map = yyp:s/./=/g:let @/='': if version >= "500" version 5.0 +" Tell Vim we use dark backgrounds in our terminals. +if ! has("gui_running") + se bg=dark +endif + +" 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-platoform. +se ssop+=unix,slash + " Nuke any pre-existing autocommands. autocmd! @@ -74,7 +90,7 @@ autocmd! let oldcols=&columns " More GUI options. Add icon, tearoffs and toolbar. -se go=agilmrtT +se go+=itT " Allow dynamic window resize even if we aren't in an xterm. se t_WS=[8;%p1%d;%p2%dt @@ -85,6 +101,10 @@ se hlsearch " Syntax highlighting. syn on +" Use a discernably different colour to highlight the cursor which shows +" matching brackets. Our regular cursor is green so use blue instead of cyan. +hi MatchParen ctermbg=blue + " Catch typos. command! W :w command! Wq :wq @@ -98,6 +118,13 @@ fun! Iain_Vars() 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 endfun " Helper for status line. @@ -146,57 +173,31 @@ endfun fun! Show_StatusLine() call Iain_Vars() let sl1='%2n\:\ %<%f\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ %=' - let sl2='\ \|\ P:%4.6o\ L:%4.6l/%-4.6L\ C:%3.6c\ \|\ %P' + let sl3='L:%4.6l/%-4.6L\ C:%3.6c\ \|\ %P' let hexformat='%b' if b:iainhex let hexformat='0\x%02B' endif - exec "set statusline=" . sl1 . hexformat . sl2 + if b:iainverbose + let sl2=hexformat . '\ \|\ P:%4.6o\ ' + else + let sl2='' + endif + exec "set statusline=" . sl1 . sl2 . sl3 +endfun + +" Toggle case-sensitivity. +fun! Invert_Case() + let &ic = ! &ic endfun " Restore window size. au VimLeave * if exists("oldcols") | let &columns=oldcols | endif -" Map C mode. -au BufEnter * if &ft == "c" || &ft == "cpp" | call CMode_map() | endif -au BufLeave * if &ft == "c" || &ft == "cpp" | call CMode_unmap() | endif - -" Map Perl mode. -au BufEnter * if &ft == "perl" | call PerlMode_map() | endif -au BufLeave * if &ft == "perl" | call PerlMode_unmap() | endif - " Map Makefile mode. au BufEnter * if &ft == "make" | call MakeMode_map() | endif au BufLeave * if &ft == "make" | call MakeMode_unmap() | endif -" Entering C mode. -fun! CMode_map() - let oldcinkeys=&cinkeys - let oldcinwords=&cinwords - set cinkeys=0{,0},:,0#,!^F,o,O,e - set cinwords=if,else,while,do,for,switch -endfun - -" Leaving C mode. -fun! CMode_unmap() - set cinkeys=oldcinkeys - set cinwords=oldcinwords -endfun - -" Entering Perl mode. -fun! PerlMode_map() - let oldcinkeys=&cinkeys - let oldcinwords=&cinwords - set cinkeys=0{,0},:,!^F,o,O,e - set cinwords=if,else,while,do,for,eval -endfun - -" Leaving Perl mode. -fun! PerlMode_unmap() - set cinkeys=oldcinkeys - set cinwords=oldcinwords -endfun - " Entering Make mode. fun! MakeMode_map() set list @@ -211,6 +212,29 @@ endfun " Show the status line for the first time. call Show_StatusLine() + +" Change to ts=2 with Q2. +map Q2 :se ts=2: +" Change to ts=4 with Q4. +map Q4 :se ts=4: +" Change to ts=8 with Q8. +map Q8 :se ts=8: +" Change to ts=16 with Q6. +map Q6 :se ts=16: +" Change to ts=32 with Q3. +map Q3 :se ts=32: +" Toggle paste mode with Qp. +map Qp :se paste!: +" Swap case-sensitivity with Qc. +map Qc :call Invert_Case(): +" Change number mode with Qn. +map Qn :se number!: +" Expand or shrink window size with Q> and Q<. For use after toggling number. +map Q> :exe 'se columns+=' . numberwidth: +map Q< :exe 'se columns-=' . numberwidth: +" Clear search pattern with Q/. +map Q/ :let @/="": + endif """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -219,33 +243,42 @@ endif if version >= "600" version 6.0 -" Track changing number mode. -let g:numbercols=&columns -let g:numberchanges=0 +" Remember quickfix state. +let g:quickfixing=0 + +" Set indenting by filetype. +filetype indent on " Less intrusive syntax highlighting. syn enable " Nice GUI colour. if has("gui_running") - se guifont=Bitstream\ Vera\ Sans\ Mono\ 12 + se guifont=DejaVu\ Sans\ Mono\ 10 colo darkblue endif if has("win32") - se guifont=Bitstream_Vera_Sans_Mono:h10:cANSI + se guifont=DejaVu_Sans_Mono:h10:cANSI endif +" Ignore whitespace when diffing. +se diffopt=filler,iwhite + " Expand window when doing a vertical diff. if &diff let &columns = 164 endif " Status bar matches the colour. -highlight StatusLine guifg=white guibg=blue ctermbg=white ctermfg=blue +highlight StatusLine guifg=white guibg=darkblue ctermbg=white ctermfg=darkblue " Numbers in blue. highlight LineNr term=underline cterm=bold guifg=blue ctermfg=blue +" Remember that we are opening the quickfix window. +au BufWinEnter quickfix let g:quickfixing=1 +au BufUnload * if &ft == "qf" | let g:quickfixing=0 | endif + " 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") @@ -276,87 +309,92 @@ fun! Cycle_HexStatusLine() call Show_StatusLine() endfun -" Cycle between number mode. -" FIXME: Toggling in a split window doesn't work properly. We need to track -" the number of windows and number modes. Something for later... -" Perhaps have a redraw callback that checks width and original column number. -fun! Cycle_Number() - if &number - " Restore width. - if &t_WS =~ '^.' - " Track changes. - let g:numberchanges=g:numberchanges-1 - if g:numberchanges<0 - g:numberchanges=0 - endif +" Cycle verbose display of toolbar stuff. +fun! Cycle_VerboseStatusLine() + call Iain_Vars() + let b:iainverbose = ! b:iainverbose + call Show_StatusLine() +endfun - " Change size back if this was the last window. - if g:numberchanges == 0 - let &columns=g:numbercols - endif - endif - set nonumber +" Toggle quickfix window. +fun! Cycle_Quickfix() + if g:quickfixing == 1 + cclose + let g:quickfixing=0 else - " Save width between number toggling. - if &t_WS =~ '^' - " Expand if this was the first change. - if g:numberchanges == 0 - let g:numbercols=&columns - if version >= 700 - " Expand column by our preferred width. - let &columns=&columns+&numberwidth - else - " Vim 6 hardcodes width to 8. - let &columns=&columns+8 - endif - endif - - " Track changes. - let g:numberchanges=g:numberchanges+1 - endif - set number + copen endif endfun -" Toggle case-sensitivity. -fun! Invert_Case() - let &ic = ! &ic -endfun - -" We'll use Q for various commands. Unmap it. +" We use Q for various commands. Unmap it. +" Vim 5 won't let us unmap this as it treats Q as an ambiguous mapping (because +" Qx also exists. With Vim 5 you are rewarded with Ex mode if you don't type +" the Qx sequence quickly enough. Vim 6 allows us to forget the Ex mapping. map Q -" Change to ts=2 with Q2. -map Q2 :se ts=2: -" Change to ts=4 with Q4. -map Q4 :se ts=4: -" Change to ts=8 with Q8. -map Q8 :se ts=8: -" Change to ts=16 with Q6. -map Q6 :se ts=16: -" Change to ts=32 with Q3. -map Q3 :se ts=32: -" Change foldmethod with Qf. -map Qf :se foldenable!: -" Toggle paste mode with Qp. -map Qp :se paste!: -" Swap hex/decimal statusline with Qx +" Swap hex/decimal statusline with Qx. map Qx :call Cycle_HexStatusLine(): -" Swap case-sensitivity with Qc. -map Qc :call Invert_Case(): +" Change statusline verbosity with Qv. +map Qv :call Cycle_VerboseStatusLine(): " Cycle list styles with Ql. map Ql :call Cycle_List(): -" Change number mode with Qn. -map Qn :call Cycle_Number(): " Toggle tags with Qt. map Qt :Tlist +" Change foldmethod with Qf. +map Qf :se foldenable!: +" Toggle quickfix window with Qq. +map Qq :call Cycle_Quickfix(): +" Rerun filetype detection with Qs. The s is for syntax, as this will be +" updated as a side-effect. +map Qs :filetype detect: + +" Change status bar colour when various things happen. +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, "") + + " Default colour. + let s:colour = "darkblue" + let s:termcolour = "" + let s:term88colour = "17" + let s:term256colour = "17" + " 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 = "darkmagenta" + else + let s:colour = "darkred" + 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" + endif + endif -" Leaving Perl mode. -fun! PerlMode_unmap() - set cinkeys=oldcinkeys - set cinwords=oldcinwords - set foldmethod=manual + if &t_Co == 88 + let s:termcolour = s:term88colour + elseif &t_Co == 256 + let s:termcolour = s:term256colour + else + let s:termcolour = s:colour + endif + + exec "highlight StatusLine guifg=white guibg=" . s:colour . " ctermbg=white ctermfg=" . s:termcolour endfun + +call Highlight_StatusLine("") endif """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -365,6 +403,16 @@ endif if version >= "700" version 7.0 +au CursorHoldI * call Highlight_StatusLine("H") +au CursorMovedI * call Highlight_StatusLine("h") +au FocusGained * call Highlight_StatusLine("F") +au FocusLost * call Highlight_StatusLine("f") +au InsertEnter * call Highlight_StatusLine("I") +au InsertLeave * call Highlight_StatusLine("i") + +" Make diffs vertical by default. +se diffopt+=vertical + " Set size of numbers column. se numberwidth=5