Added option for verbose and less-verbose statusline.
[profile.git] / .vimrc
1 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
2 " $Id$
3 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
4 " Multi-version vimrc compatible with version 4 and above.
5 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
6
7 " Note that "if <condition> | call Something() | endif" syntax is unsupported 
8 " in Vim 4 so we write all our functions out the long way.  It does work in 
9 " autocommand definitions, however.
10
11 " Vim 4 complains if version isn't set in the configuration file.
12 version 4.0
13
14 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
15 " Handle options safe to use in version 4.  Vim 4 parses but ignores the 
16 " "if version" syntax used later in this file so we don't use it.  No attempt 
17 " is made to make this configuration compatible with Vim 3.
18 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
19 " No compatibility mode.
20 se nocp
21
22 " Tabstop 2.
23 se ts=2
24 " And use spaces not tabs.
25 se expandtab
26 " And << and >> indent by 2.
27 se sw=2
28
29 " Allow backspace to delete before start of line.
30 se bs=2
31
32 " Show the ruler.
33 se ruler
34 " Show partial commands in the ruler.
35 se showcmd
36 " And always show the status line.
37 se laststatus=2
38
39 " Use C indent style.
40 se cindent
41 se cinkeys=0{,0},0),:,!^F,o,O,e
42
43 " GUI options.
44 se go=aglmr
45
46 " Don't be bugged by messages at the bottom of the screen.
47 se shm=aot
48
49 " Find as you type.
50 se incsearch
51
52 " Case-insensitive search.
53 se ignorecase
54 " But override by typing capitals.
55 se smartcase
56
57 " Look for ctags in home directory first.
58 se tags=~/.tags,./tags,tags
59
60 " Use - and = to create underlines.
61 map - yyp:s/./-/g<RETURN>:let @/=''<RETURN>:<RETURN>
62 map = yyp:s/./=/g<RETURN>:let @/=''<RETURN>:<RETURN>
63
64 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
65 " Handle options only available in Vim 5 and above.
66 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
67 if version >= "500"
68 version 5.0
69
70 " Nuke any pre-existing autocommands.
71 autocmd!
72
73 " Save the current window width so we can restore it when we quit.
74 let oldcols=&columns
75
76 " More GUI options.  Add icon, tearoffs and toolbar.
77 se go=agilmrtT
78
79 " Allow dynamic window resize even if we aren't in an xterm.
80 se t_WS=\e[8;%p1%d;%p2%dt
81
82 " Highlight search results.
83 se hlsearch
84
85 " Syntax highlighting.
86 syn on
87
88 " Catch typos.
89 command! W :w
90 command! Wq :wq
91 command! Wqa :wqa
92
93 " Set up our variables.
94 fun! Iain_Vars()
95   if ! exists("b:iainlist")
96     let b:iainlist = 0
97   endif
98   if ! exists("b:iainhex")
99     let b:iainhex = 0
100   endif
101   if ! exists("b:iainverbose")
102     let b:iainverbose = 0
103   endif
104 endfun
105
106 " Helper for status line.
107 " Show space, underscore or dollar sign depending on list mode.
108 fun! Show_List()
109   call Iain_Vars()
110   if b:iainlist == 0
111     " No list.
112     return " "
113   elseif b:iainlist == 1
114     " Just tabs.
115     return "_"
116   else
117     " Full list.
118     return "\$"
119   endif
120 endfun
121
122 " Helper for status line.
123 " Show c or C to denote case-sensitivity.
124 fun! Show_Case()
125   if &ic
126     return "c"
127   else
128     return "C"
129   endif
130 endfun
131
132 " Helper for status line.
133 " Show the size of the tabstop.
134 fun! Show_Tabstop()
135   return &ts
136 endfun
137
138 " Helper for status line.
139 " Show p when paste mode is on.
140 fun! Show_Paste()
141   if &paste
142     return "p"
143   else
144     return ""
145   endif
146 endfun
147
148 " Show the status line.
149 fun! Show_StatusLine()
150   call Iain_Vars()
151   let sl1='%2n\:\ %<%f\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ %='
152   let sl3='L:%4.6l/%-4.6L\ C:%3.6c\ \|\ %P'
153   let hexformat='%b'
154   if b:iainhex
155     let hexformat='0\x%02B'
156   endif
157   if b:iainverbose
158     let sl2=hexformat . '\ \|\ P:%4.6o\ '
159   else
160     let sl2=''
161   endif
162   exec "set statusline=" . sl1 . sl2 . sl3
163 endfun
164
165 " Restore window size.
166 au VimLeave * if exists("oldcols") | let &columns=oldcols | endif
167
168 " Map C mode.
169 au BufEnter * if &ft == "c" || &ft == "cpp" | call CMode_map() | endif
170 au BufLeave * if &ft == "c" || &ft == "cpp" | call CMode_unmap() | endif
171
172 " Map Perl mode.
173 au BufEnter * if &ft == "perl" | call PerlMode_map() | endif
174 au BufLeave * if &ft == "perl" | call PerlMode_unmap() | endif
175
176 " Map Makefile mode.
177 au BufEnter * if &ft == "make" | call MakeMode_map() | endif
178 au BufLeave * if &ft == "make" | call MakeMode_unmap() | endif
179
180 " Entering C mode.
181 fun! CMode_map()
182   let oldcinkeys=&cinkeys
183   let oldcinwords=&cinwords
184   set cinkeys=0{,0},:,0#,!^F,o,O,e
185   set cinwords=if,else,while,do,for,switch
186 endfun
187
188 " Leaving C mode.
189 fun! CMode_unmap()
190   set cinkeys=oldcinkeys
191   set cinwords=oldcinwords
192 endfun
193
194 " Entering Perl mode.
195 fun! PerlMode_map()
196   let oldcinkeys=&cinkeys
197   let oldcinwords=&cinwords
198   set cinkeys=0{,0},:,!^F,o,O,e
199   set cinwords=if,else,while,do,for,eval
200 endfun
201
202 " Leaving Perl mode.
203 fun! PerlMode_unmap()
204   set cinkeys=oldcinkeys
205   set cinwords=oldcinwords
206 endfun
207
208 " Entering Make mode.
209 fun! MakeMode_map()
210   set list
211   set noexpandtab
212 endfun
213
214 " Leaving Make mode.
215 fun! MakeMode_unmap()
216   set nolist
217   set expandtab
218 endfun
219
220 " Show the status line for the first time.
221 call Show_StatusLine()
222 endif
223
224 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
225 " Handle options only available in Vim 6 and above.
226 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
227 if version >= "600"
228 version 6.0
229
230 " Track changing number mode.
231 let g:numbercols=&columns
232 let g:numberchanges=0
233
234 " Less intrusive syntax highlighting.
235 syn enable
236
237 " Nice GUI colour.
238 if has("gui_running")
239   se guifont=Bitstream\ Vera\ Sans\ Mono\ 12
240   colo darkblue
241 endif
242 if has("win32")
243   se guifont=Bitstream_Vera_Sans_Mono:h10:cANSI
244 endif
245
246 " Expand window when doing a vertical diff.
247 if &diff
248   let &columns = 164
249 endif
250
251 " Status bar matches the colour.
252 highlight StatusLine guifg=white guibg=blue ctermbg=white ctermfg=blue
253
254 " Numbers in blue.
255 highlight LineNr term=underline cterm=bold guifg=blue ctermfg=blue
256
257 " Make * and # work the way you expect in visual mode.
258 vnoremap * y/\V<C-R>=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")<CR><CR>
259 vnoremap # y?\V<C-R>=substitute(escape(@@,"?\\"),"\n","\\\\n","ge")<CR><CR>
260
261 " Change list mode.
262 fun! Cycle_List()
263   let basic='tab:\\_,trail:_,extends:<,precedes:>'
264   call Iain_Vars()
265   let b:iainlist = b:iainlist + 1
266   if b:iainlist > 2
267     let b:iainlist = 0
268   endif
269   if b:iainlist == 0
270     set nolist
271   elseif b:iainlist == 1
272     exec "set lcs=" . basic
273     set list
274   else
275     exec "set lcs=" . basic . ",eol:$"
276     set list
277   endif
278 endfun
279
280 " Cycle between hex and decimal display of toolbar stuff.
281 fun! Cycle_HexStatusLine()
282   call Iain_Vars()
283   let b:iainhex = ! b:iainhex
284   call Show_StatusLine()
285 endfun
286
287 " Cycle verbose display of toolbar stuff.
288 fun! Cycle_VerboseStatusLine()
289   call Iain_Vars()
290   let b:iainverbose = ! b:iainverbose
291   call Show_StatusLine()
292 endfun
293
294 " Cycle between number mode.
295 " FIXME: Toggling in a split window doesn't work properly.  We need to track 
296 " the number of windows and number modes.  Something for later...
297 " Perhaps have a redraw callback that checks width and original column number.
298 fun! Cycle_Number()
299   if &number
300     " Restore width.
301     if &t_WS =~ '^\e.'
302       " Track changes.
303       let g:numberchanges=g:numberchanges-1
304       if g:numberchanges<0
305         g:numberchanges=0
306       endif
307
308       " Change size back if this was the last window.
309       if g:numberchanges == 0
310         let &columns=g:numbercols
311       endif
312     endif
313     set nonumber
314   else
315     " Save width between number toggling.
316     if &t_WS =~ '^\e'
317       " Expand if this was the first change.
318       if g:numberchanges == 0
319         let g:numbercols=&columns
320         if version >= 700
321           " Expand column by our preferred width.
322           let &columns=&columns+&numberwidth
323         else
324           " Vim 6 hardcodes width to 8.
325           let &columns=&columns+8
326         endif
327       endif
328
329       " Track changes.
330       let g:numberchanges=g:numberchanges+1
331     endif
332     set number
333   endif
334 endfun
335
336 " Toggle case-sensitivity.
337 fun! Invert_Case()
338   let &ic = ! &ic
339 endfun
340
341 " We'll use Q for various commands.  Unmap it.
342 map Q <Nop>
343
344 " Change to ts=2 with Q2.
345 map Q2 :se ts=2<CR>:<CR>
346 " Change to ts=4 with Q4.
347 map Q4 :se ts=4<CR>:<CR>
348 " Change to ts=8 with Q8.
349 map Q8 :se ts=8<CR>:<CR>
350 " Change to ts=16 with Q6.
351 map Q6 :se ts=16<CR>:<CR>
352 " Change to ts=32 with Q3.
353 map Q3 :se ts=32<CR>:<CR>
354 " Change foldmethod with Qf.
355 map Qf :se foldenable!<CR>:<CR>
356 " Toggle paste mode with Qp.
357 map Qp :se paste!<CR>:<CR>
358 " Swap hex/decimal statusline with Qx
359 map Qx :call Cycle_HexStatusLine()<CR>:<CR>
360 " Change statusline verbosity with Qv
361 map Qv :call Cycle_VerboseStatusLine()<CR>:<CR>
362 " Swap case-sensitivity with Qc.
363 map Qc :call Invert_Case()<CR>:<CR>
364 " Cycle list styles with Ql.
365 map Ql :call Cycle_List()<CR>:<CR>
366 " Change number mode with Qn.
367 map Qn :call Cycle_Number()<CR>:<CR>
368 " Toggle tags with Qt.
369 map Qt :Tlist<CR>
370
371 " Leaving Perl mode.
372 fun! PerlMode_unmap()
373   set cinkeys=oldcinkeys
374   set cinwords=oldcinwords
375   set foldmethod=manual
376 endfun
377 endif
378
379 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
380 " Handle options only available in Vim 7 and above.
381 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
382 if version >= "700"
383 version 7.0
384
385 " Set size of numbers column.
386 se numberwidth=5
387
388 " Add "previous tab" mapping as gb.
389 map gb :tabPrev<CR>
390 endif