""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" $Id$
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+" Multi-version vimrc compatible with version 4 and above.
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Note that "if <condition> | call Something() | endif" syntax is unsupported
" in Vim 4 so we write all our functions out the long way. It does work in
" Use C indent style.
se cindent
se cinkeys=0{,0},0),:,!^F,o,O,e
+se cinoptions=b1,c2
" GUI options.
se go=aglmr
if ! exists("b:iainhex")
let b:iainhex = 0
endif
+ if ! exists("b:iainverbose")
+ let b:iainverbose = 0
+ endif
endfun
" Helper for status line.
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
" Restore window size.
if version >= "600"
version 6.0
+" Track changing number mode.
+let g:numbercols=&columns
+let g:numberchanges=0
+
" Less intrusive syntax highlighting.
syn enable
se guifont=Bitstream_Vera_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
" Status bar matches the colour.
highlight StatusLine guifg=white guibg=blue ctermbg=white ctermfg=blue
+" Numbers in blue.
+highlight LineNr term=underline cterm=bold guifg=blue ctermfg=blue
+
" Make * and # work the way you expect in visual mode.
vnoremap * y/\V<C-R>=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")<CR><CR>
vnoremap # y?\V<C-R>=substitute(escape(@@,"?\\"),"\n","\\\\n","ge")<CR><CR>
call Show_StatusLine()
endfun
+" Cycle verbose display of toolbar stuff.
+fun! Cycle_VerboseStatusLine()
+ call Iain_Vars()
+ let b:iainverbose = ! b:iainverbose
+ 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 =~ '^\e.'
- let &columns=g:numbercols
+ " Track changes.
+ let g:numberchanges=g:numberchanges-1
+ if g:numberchanges<0
+ g:numberchanges=0
+ endif
+
+ " Change size back if this was the last window.
+ if g:numberchanges == 0
+ let &columns=g:numbercols
+ endif
endif
set nonumber
else
" Save width between number toggling.
if &t_WS =~ '^\e'
- let g:numbercols=&columns
- let &columns=&columns+5
+ " 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
endif
endfun
+" Toggle case-sensitivity.
fun! Invert_Case()
let &ic = ! &ic
endfun
+
" We'll use Q for various commands. Unmap it.
map Q <Nop>
map Qp :se paste!<CR>:<CR>
" Swap hex/decimal statusline with Qx
map Qx :call Cycle_HexStatusLine()<CR>:<CR>
+" Change statusline verbosity with Qv
+map Qv :call Cycle_VerboseStatusLine()<CR>:<CR>
" Swap case-sensitivity with Qc.
map Qc :call Invert_Case()<CR>:<CR>
" Cycle list styles with Ql.
map Qn :call Cycle_Number()<CR>:<CR>
" Toggle tags with Qt.
map Qt :Tlist<CR>
+" Clear search pattern with Q/.
+map Q/ :let @/=""<CR>:<CR>
" Leaving Perl mode.
fun! PerlMode_unmap()
if version >= "700"
version 7.0
+" Make diffs vertical by default.
+se diffopt+=vertical
+
+" Set size of numbers column.
+se numberwidth=5
+
" Add "previous tab" mapping as gb.
map gb :tabPrev<CR>
endif