f163e3d764ee666ac212148793235349a42550ef
[profile.git] / .vimrc
1 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
2 " Multi-version vimrc compatible with version 4 and above.
3 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
4
5 " Note that "if <condition> | call Something() | endif" syntax is unsupported 
6 " in Vim 4 so we write all our functions out the long way.  It does work in 
7 " autocommand definitions, however.
8
9 " Vim 4 complains if version isn't set in the configuration file.
10 version 4.0
11
12 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
13 " Handle options safe to use in version 4.  Vim 4 parses but ignores the 
14 " "if version" syntax used later in this file so we don't use it.  No attempt 
15 " is made to make this configuration compatible with Vim 3.
16 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
17 " No compatibility mode.
18 se nocp
19
20 " Find stuff.
21 if has("win32")
22   se rtp=~/.vim,$VIMRUNTIME
23 endif
24
25 " Tabstop 2.
26 se ts=2
27 " And use spaces not tabs.
28 se expandtab
29 " And << and >> indent by 2.
30 se sw=2
31 " Backspace deletes full tab width at the start of a line.
32 se smarttab
33
34 " Allow backspace to delete before start of line.
35 se bs=2
36
37 " Don't jump to the start of the line when using H, L etc.
38 se nosol
39
40 " Show the ruler.
41 se ruler
42 " Show partial commands in the ruler.
43 se showcmd
44 " And always show the status line.
45 se laststatus=2
46
47 " Use C indent style.
48 se cindent
49 se cinkeys=0{,0},0),:,!^F,o,O,e
50 se cinoptions=b1,c2
51
52 " GUI options.
53 se go=aglmr
54
55 " Don't be bugged by messages at the bottom of the screen.
56 se shm=aot
57
58 " Find as you type.
59 se incsearch
60
61 " Case-insensitive search.
62 se ignorecase
63 " But override by typing capitals.
64 se smartcase
65
66 " Look for ctags in home directory first.
67 se tags=~/.tags,./tags,tags
68
69 " Don't timeout waiting to interpet, eg, <ESC>OA as an escape code.
70 se ttimeoutlen=100
71
72 " Use ^B to search backward when completing.
73 inoremap <C-b> <C-p>
74 " Use ^L to show matching completions but don't select one.
75 inoremap <C-l> <C-n><C-p>
76
77 " Swap jump keys.
78 noremap ' `
79 noremap ` '
80
81 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
82 " Handle options only available in Vim 5 and above.
83 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
84 if version >= "500"
85 version 5.0
86
87 " Tell Vim we use dark backgrounds in our terminals.
88 if ! has("gui_running")
89   se bg=dark
90 endif
91
92 " Allow mouse use in a terminal but only if it can work.
93 if has("xterm_clipboard")
94   se mouse=nvir
95 endif
96
97 " Update more quickly.  For use with sign highlighting as polling for
98 " CursorMove makes redrawing slow.
99 if has("signs")
100   se updatetime=500
101 endif
102
103 " Enable tab-completion prompting for commands.
104 se wildmenu
105 " Don't list object files when globbing files to load.
106 se wildignore+=*.o,*.obj
107 " So there's no need to assign them low priority.
108 se suffixes-=*.o,*.obj
109
110 " Save sessions in UNIX format with / as file separator.  This is
111 " cross-platform.
112 se ssop+=unix,slash
113
114 " How often do we need to use ^A/^X on octals?
115 se nf=hex
116
117 " Nuke any pre-existing autocommands.
118 augroup Display
119 autocmd!
120 augroup Mode
121 autocmd!
122 if has("signs")
123   augroup Signs
124   autocmd!
125 endif
126 augroup StatusLine
127 autocmd!
128 augroup END
129
130 " Save the current window width so we can restore it when we quit.
131 if ! exists("g:oldcols")
132   let g:oldcols=&columns
133 endif
134
135 " More GUI options.  Add icon and tearoffs.
136 se go+=i
137 se go+=t
138
139 " Allow dynamic window resize even if we aren't in an xterm.
140 se t_WS=\e[8;%p1%d;%p2%dt
141
142 " Highlight search results.
143 se hlsearch
144
145 " Set graphical window title.
146 se titlestring=%{Show_TitleString()}
147
148 " Syntax highlighting.  New versions will use syn enable instead.
149 if version < "600"
150   syn on
151 endif
152
153 " Catch typos.
154 command! W :w
155 command! Wq :wq
156 command! Wqa :wqa
157
158 " Set up our variables.
159 fun! Iain_Vars()
160   if ! exists("b:iainlist")
161     let b:iainlist = 0
162   endif
163   if ! exists("b:iainhex")
164     let b:iainhex = 0
165   endif
166   if ! exists("b:iainverbose")
167     let b:iainverbose = 0
168   endif
169   if ! exists("b:iainstatus")
170     " Window Flags: (F)ocused, (I)nsert mode, Cursor (H)old.
171     let b:iainstatus = "Fih"
172   endif
173   if ! exists("g:iainextracolumns")
174     let g:iainextracolumns = 0
175   endif
176   if has("signs")
177     if ! exists("g:marksigns")
178       let g:marksigns = 0
179     endif
180     if ! exists("g:firstsign")
181       let g:firstsign = 100
182     endif
183   endif
184 endfun
185
186 " Helper for status line.
187 " Show space, underscore or dollar sign depending on list mode.
188 fun! Show_List()
189   call Iain_Vars()
190   if b:iainlist == 0
191     " No list.
192     return " "
193   elseif b:iainlist == 1
194     " Just tabs.
195     return "_"
196   else
197     " Full list.
198     return "\$"
199   endif
200 endfun
201
202 " Helper for status line.
203 " Show c or C to denote case-sensitivity.
204 fun! Show_Case()
205   if &ic
206     return "c"
207   else
208     return "C"
209   endif
210 endfun
211
212 " Helper for status line.
213 " Show the size of the tabstop.
214 fun! Show_Tabstop()
215   return &ts
216 endfun
217
218 " Helper for status line.
219 " Show p when paste mode is on.
220 fun! Show_Paste()
221   if &paste
222     return "p"
223   else
224     return ""
225   endif
226 endfun
227
228 " Show the window title.
229 fun! Show_TitleString()
230   if bufname("") == ""
231     let l:ts1='Vim'
232   else
233     " Vim 5 doesn't have printf.
234     let l:ts1=bufnr("")
235     if l:ts1 < 10
236       let l:ts1=" " . l:ts1
237     endif
238     let l:ts1=l:ts1 . ": " . expand('%t')
239   endif
240   let l:ts1=l:ts1 . " (" .  getcwd() . ")"
241   if has("clientserver")
242     let l:ts1=l:ts1 . " " . v:servername
243   endif
244   return l:ts1
245 endfun
246
247 " Show the status line.
248 fun! Show_StatusLine()
249   call Iain_Vars()
250   let l:sl1='%2n\:\ %<%f\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ %='
251   let l:sl3='L:%4.6l/%-4.6L\ C:%3.6c\ \|\ %P'
252   let l:hexformat='%b'
253   if b:iainhex
254     let l:hexformat='0\x%02B'
255   endif
256   if b:iainverbose
257     let l:sl2=l:hexformat . '\ \|\ P:%4.6o\ '
258   else
259     let l:sl2=''
260   endif
261   exec "set statusline=" . l:sl1 . l:sl2 . l:sl3
262 endfun
263
264 " Toggle case-sensitivity.
265 fun! Invert_Case()
266   let &ic = ! &ic
267 endfun
268
269 " Grow or shrink the window size.
270 fun! Resize_Columns(op, ...)
271   if a:0 == 0
272     " Vim 5 hardcodes the size of numbers column to 8.
273     if version >= "700"
274       let l:columns = &numberwidth
275     else
276       let l:columns = 8
277     endif
278   else
279     let l:columns = a:1
280   endif
281
282   exe "let l:resize=" . &columns . a:op . l:columns
283   let l:resize = "se columns=" . l:resize
284
285   " HACK: Inside screen there is an extra line for the status bar.  Vim
286   " manages the resize by sending an escape sequence to set the number of
287   " lines and number of columns in one action.  To do this it will first query
288   " the number of lines and then set <same number of lines> by <new number of
289   " columns>.  Because of the extra line for the status bar this results in
290   " the real terminal being shrunk by a line.  We ask for the terminal to grow
291   " by a line so it ends up actually being the same.
292   if &term =~ '^screen'
293     let l:resize = l:resize . " lines=" . (&lines + 1)
294   endif
295
296   exe l:resize
297 endfun
298
299 " Toggle number display.
300 fun! Number(resize)
301   call Iain_Vars()
302   let &number = ! &number
303
304   if version >= "700"
305     let l:i = 0
306     let l:num_numbers = 0
307     while l:i <= winnr("$")
308       if getwinvar(l:i, "&number") == 1
309         let l:num_numbers = l:num_numbers + 1
310       endif
311       let l:i = l:i + 1
312     endwhile
313
314     if l:num_numbers == 0
315       let g:iainextracolumns = 0
316       if a:resize
317         call Resize_Columns("-")
318       endif
319     elseif g:iainextracolumns == 0
320       let g:iainextracolumns = 1
321       if a:resize
322         call Resize_Columns("+")
323       endif
324     endif
325   endif
326 endfun
327
328 " Restore window size.
329 au Display VimLeave * if exists("g:oldcols") | call Resize_Columns("-", (&columns - g:oldcols)) | endif
330
331 " Map Makefile mode.
332 au Mode BufEnter * if &ft == "make" | call MakeMode_map() | endif
333 au Mode BufLeave * if &ft == "make" | call MakeMode_unmap() | endif
334
335 " Entering Make mode.
336 fun! MakeMode_map()
337         call Iain_Vars()
338   let b:iainlist=1
339   call Cycle_List()
340   set ts=8
341   set noexpandtab
342 endfun
343
344 " Leaving Make mode.
345 fun! MakeMode_unmap()
346   call Cycle_List()
347   set ts=2
348   set expandtab
349 endfun
350
351 " Show the status line for the first time.
352 call Show_StatusLine()
353
354 " Function to create mappings with either a hardcoded \ or <Leader>.
355 fun! Mapping(keysequence,mapping)
356   if version < "600"
357     exec "map \\" . a:keysequence . " " . a:mapping
358   else
359     exec "map <Leader>" . a:keysequence . " " . a:mapping
360   endif
361 endfun
362
363 " Use - and = to create underlines.
364 call Mapping("-", "yyp:s/./-/g<RETURN>:let @/=''<RETURN>:<RETURN>")
365 call Mapping("=", "yyp:s/./=/g<RETURN>:let @/=''<RETURN>:<RETURN>")
366
367 " Change to ts=2 with \2.
368 call Mapping("2", ":se ts=2<CR>:<CR>")
369 " Change to ts=4 with \4.
370 call Mapping("4", ":se ts=4<CR>:<CR>")
371 " Change to ts=8 with \8.
372 call Mapping("8", ":se ts=8<CR>:<CR>")
373 " Change to ts=16 with \6.
374 call Mapping("6", ":se ts=16<CR>:<CR>")
375 " Change to ts=32 with \3.
376 call Mapping("3", ":se ts=32<CR>:<CR>")
377 " Toggle paste mode with \p.
378 call Mapping("p", ":se paste!<CR>:<CR>")
379 " Swap case-sensitivity with \c.
380 call Mapping("c", ":call Invert_Case()<CR>:<CR>")
381 " Change number mode with \n.
382 call Mapping("n", ":call Number(1)<CR>:<CR>")
383 " Expand or shrink window size with \> and \<.
384 call Mapping(">", ":call Resize_Columns('+')<CR>:<CR>")
385 call Mapping("<", ":call Resize_Columns('-')<CR>:<CR>")
386 " Clear search pattern with \/.
387 call Mapping("/", ":let @/=\"\"<CR>:<CR>")
388
389 " Forget the Ex mode mapping.
390 map Q <NOP>
391
392 " Vim tip 99: What's the highlighting group under the cursor?
393 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\") . \">\"<CR>")
394
395 fun! Uncluttered_Buffer()
396   if exists("uncluttered_buffer")
397     if uncluttered_buffer == 1
398       return 1
399     endif
400   endif
401
402   if version >= "600"
403     if &buftype != ''
404       return 1
405     endif
406   endif
407
408   if &ft == 'perforce'
409     return 1
410   endif
411
412   if &ft == 'svn'
413     return 1
414   endif
415
416   if &ft == 'gitcommit'
417     return 1
418   endif
419
420   return 0
421 endfun
422
423 fun! Startup_Resize()
424   let l:columns = 0
425
426   " Resize for numbers.
427   if &number
428     if version >= "700"
429       let l:columns = &numberwidth
430     else
431       let l:columns = 8
432     endif
433   endif
434
435   " Resize for signs.
436   if has("signs")
437     if g:marksigns
438       if version >= "600"
439         let l:columns = l:columns + 2
440       endif
441     endif
442   endif
443
444   if g:oldcols < (80 + l:columns)
445     call Resize_Columns("+", l:columns)
446   endif
447 endfun
448
449 " Show numbers by default.
450 au Display VimEnter * if ! Uncluttered_Buffer() | call Number(0) | endif
451 endif
452
453 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
454 " Handle options only available in Vim 6 and above.
455 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
456 if version >= "600"
457 version 6.0
458
459 if has("win32")
460   se encoding=utf-8
461 endif
462
463 " Remember quickfix state.
464 let g:quickfixing=0
465
466 " Set indenting by filetype.
467 filetype indent on
468
469 " Less intrusive syntax highlighting.
470 syn enable
471
472 " Set colours.
473 if has("gui_running")
474   try
475     if has("win32")
476       se guifont=DejaVu_Sans_Mono:h10:cANSI
477     else
478       se guifont=DejaVu\ Sans\ Mono\ 10
479     endif
480   catch
481   endtry
482 endif
483 if has("gui_running") || &t_Co > 16
484   try
485     colo iain
486   catch
487   endtry
488 endif
489
490 " Ignore whitespace when diffing.
491 se diffopt=filler,iwhite
492
493 " Expand window when doing a vertical diff.
494 if &diff
495   if &columns < 161
496     let &columns = &columns * 2
497   endif
498 endif
499
500 " Remember that we are opening the quickfix window.
501 au Mode BufWinEnter quickfix let g:quickfixing=1
502 au Mode BufUnload * if &ft == "qf" | let g:quickfixing=0 | endif
503
504 " Allow in-place editing of crontabs.
505 au Mode FileType crontab set backupcopy=yes
506
507 " Make * and # work the way you expect in visual mode.
508 vnoremap * y/\V<C-R>=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")<CR><CR>
509 vnoremap # y?\V<C-R>=substitute(escape(@@,"?\\"),"\n","\\\\n","ge")<CR><CR>
510
511 " Set mark and update highlighting.
512 if has("signs")
513   au Signs BufEnter * call <SID>Highlight_Signs()
514   au Signs CursorHold * call <SID>Highlight_Signs()
515 endif
516
517 fun! <SID>Prep_Signs()
518   if ! exists("b:signdot") || ! g:marksigns
519     let b:signdot=0
520   endif
521   if ! exists("b:signdash") || ! g:marksigns
522     let b:signdash=0
523   endif
524   if ! exists("b:signquote") || ! g:marksigns
525     let b:signquote=0
526   endif
527   if ! exists("b:signcaret") || ! g:marksigns
528     let b:signcaret=0
529   endif
530   if ! exists("b:signless") || ! g:marksigns
531     let b:signless=0
532   endif
533   if ! exists("b:signgreater") || ! g:marksigns
534     let b:signgreater=0
535   endif
536   if ! exists("b:signleft") || ! g:marksigns
537     let b:signleft=0
538   endif
539   if ! exists("b:signright") || ! g:marksigns
540     let b:signright=0
541   endif
542   if ! exists("b:signsquareleft") || ! g:marksigns
543     let b:signsquareleft=0
544   endif
545   if ! exists("b:signsquareright") || ! g:marksigns
546     let b:signsquareright=0
547   endif
548   if ! exists("b:signbraceleft") || ! g:marksigns
549     let b:signbraceleft=0
550   endif
551   if ! exists("b:signbraceright") || ! g:marksigns
552     let b:signbraceright=0
553   endif
554   if ! exists("b:signa") || ! g:marksigns
555     let b:signa=0
556   endif
557   if ! exists("b:signb") || ! g:marksigns
558     let b:signb=0
559   endif
560   if ! exists("b:signc") || ! g:marksigns
561     let b:signc=0
562   endif
563   if ! exists("b:signd") || ! g:marksigns
564     let b:signd=0
565   endif
566   if ! exists("b:signe") || ! g:marksigns
567     let b:signe=0
568   endif
569   if ! exists("b:signf") || ! g:marksigns
570     let b:signf=0
571   endif
572   if ! exists("b:signA") || ! g:marksigns
573     let b:signA=0
574   endif
575   if ! exists("b:signB") || ! g:marksigns
576     let b:signB=0
577   endif
578   if ! exists("b:signC") || ! g:marksigns
579     let b:signC=0
580   endif
581   if ! exists("b:signD") || ! g:marksigns
582     let b:signD=0
583   endif
584   if ! exists("b:signE") || ! g:marksigns
585     let b:signE=0
586   endif
587   if ! exists("b:signF") || ! g:marksigns
588     let b:signF=0
589   endif
590 endfun!
591
592 fun! <SID>Place_Sign(number, line, old, name)
593   if a:line == a:old
594     return a:old
595   endif
596
597   exe "sign unplace " . (g:firstsign + a:number) . " buffer=" . bufnr("")
598   " Don't place the sign if it would conflict with the last change sign.
599   exe "sign place " . (g:firstsign + a:number) . " line=" . a:line . " name=" . a:name . " buffer=" . bufnr("")
600   return a:line
601 endfun
602
603 fun! <SID>Highlight_Signs(...)
604   if ! has("signs") || ! g:marksigns || Uncluttered_Buffer()
605     return
606   endif
607
608   call <SID>Prep_Signs()
609
610   let b:signdot = <SID>Place_Sign(0, line("'."), b:signdot, "MarkDot")
611   let b:signdash = <SID>Place_Sign(1, line("''"), b:signdash, "MarkDash")
612   let b:signquote = <SID>Place_Sign(2, line("'\""), b:signquote, "MarkQuote")
613   let b:signcaret = <SID>Place_Sign(3, line("'^"), b:signcaret, "MarkCaret")
614   let b:signless = <SID>Place_Sign(4, line("'<"), b:signless, "MarkLess")
615   let b:signgreater = <SID>Place_Sign(5, line("'>"), b:signgreater, "MarkGreater")
616   let b:signleft = <SID>Place_Sign(6, line("'("), b:signleft, "MarkLeft")
617   let b:signright = <SID>Place_Sign(7, line("')"), b:signright, "MarkRight")
618   let b:signsquareleft = <SID>Place_Sign(8, line("'["), b:signsquareleft, "MarkSquareLeft")
619   let b:signsquareright = <SID>Place_Sign(9, line("']"), b:signsquareright, "MarkSquareRight")
620   let b:signbraceleft = <SID>Place_Sign(10, line("'{"), b:signbraceleft, "MarkBraceLeft")
621   let b:signbraceright = <SID>Place_Sign(11, line("'}"), b:signbraceright, "MarkBraceRight")
622
623   let b:signa = <SID>Place_Sign(12, line("'a"), b:signa, "Marka")
624   let b:signb = <SID>Place_Sign(13, line("'b"), b:signb, "Markb")
625   let b:signc = <SID>Place_Sign(15, line("'c"), b:signc, "Markc")
626   let b:signd = <SID>Place_Sign(16, line("'d"), b:signd, "Markd")
627   let b:signe = <SID>Place_Sign(17, line("'e"), b:signe, "Marke")
628   let b:signf = <SID>Place_Sign(18, line("'f"), b:signf, "Markf")
629   let b:signA = <SID>Place_Sign(19, line("'A"), b:signA, "MarkA")
630   let b:signB = <SID>Place_Sign(20, line("'B"), b:signB, "MarkB")
631   let b:signC = <SID>Place_Sign(21, line("'C"), b:signC, "MarkC")
632   let b:signD = <SID>Place_Sign(22, line("'D"), b:signD, "MarkD")
633   let b:signE = <SID>Place_Sign(23, line("'E"), b:signE, "MarkE")
634   let b:signF = <SID>Place_Sign(24, line("'F"), b:signF, "MarkF")
635 endfun
636
637 " Toggle signs.
638 fun! <SID>Cycle_Signs(resize)
639   if ! has("signs")
640     return
641   endif
642   call Iain_Vars()
643   let g:marksigns = ! g:marksigns
644
645   if g:marksigns
646     " Signs to highlight marks.
647     " Syntax won't work properly in Vim 6.
648     if <SID>Has_Unicode()
649       sign define MarkDash text=’ texthl=MarkSign
650       sign define MarkDot text=• texthl=MarkDot
651       sign define MarkQuote text=” texthl=MarkSign
652     else
653       sign define MarkDash text=' texthl=MarkSign
654       sign define MarkDot text=* texthl=MarkDot
655       sign define MarkQuote text=" texthl=MarkSign
656     endif
657     sign define MarkCaret text=^ texthl=MarkDot
658     sign define MarkLess text=< texthl=MarkSign
659     sign define MarkGreater text=> texthl=MarkSign
660     sign define MarkLeft text=( texthl=MarkSign
661     sign define MarkRight text=) texthl=MarkSign
662     sign define MarkSquareLeft text=[ texthl=MarkSign
663     sign define MarkSquareRight text=] texthl=MarkSign
664     sign define MarkBraceLeft text={ texthl=MarkSign
665     sign define MarkBraceRight text=} texthl=MarkSign
666     sign define Marka text=a texthl=MarkSign linehl=MarkLine
667     sign define Markb text=b texthl=MarkSign linehl=MarkLine
668     sign define Markc text=c texthl=MarkSign linehl=MarkLine
669     sign define Markd text=d texthl=MarkSign linehl=MarkLine
670     sign define Marke text=e texthl=MarkSign linehl=MarkLine
671     sign define Markf text=f texthl=MarkSign linehl=MarkLine
672     sign define MarkA text=A texthl=MarkSign linehl=MarkLine
673     sign define MarkB text=B texthl=MarkSign linehl=MarkLine
674     sign define MarkC text=C texthl=MarkSign linehl=MarkLine
675     sign define MarkD text=D texthl=MarkSign linehl=MarkLine
676     sign define MarkE text=E texthl=MarkSign linehl=MarkLine
677     sign define MarkF text=F texthl=MarkSign linehl=MarkLine
678
679     if a:resize
680       call Resize_Columns("+", 2)
681     endif
682     call <SID>Highlight_Signs()
683   else
684     exe "sign unplace " . (g:firstsign + 0)
685     exe "sign unplace " . (g:firstsign + 1)
686     exe "sign unplace " . (g:firstsign + 2)
687     exe "sign unplace " . (g:firstsign + 3)
688     exe "sign unplace " . (g:firstsign + 4)
689     exe "sign unplace " . (g:firstsign + 5)
690     exe "sign unplace " . (g:firstsign + 6)
691     exe "sign unplace " . (g:firstsign + 7)
692     exe "sign unplace " . (g:firstsign + 8)
693     exe "sign unplace " . (g:firstsign + 9)
694     exe "sign unplace " . (g:firstsign + 10)
695     exe "sign unplace " . (g:firstsign + 11)
696     exe "sign unplace " . (g:firstsign + 12)
697     exe "sign unplace " . (g:firstsign + 13)
698     exe "sign unplace " . (g:firstsign + 14)
699     exe "sign unplace " . (g:firstsign + 15)
700     exe "sign unplace " . (g:firstsign + 16)
701     exe "sign unplace " . (g:firstsign + 17)
702     exe "sign unplace " . (g:firstsign + 18)
703     exe "sign unplace " . (g:firstsign + 19)
704     exe "sign unplace " . (g:firstsign + 20)
705     exe "sign unplace " . (g:firstsign + 21)
706     exe "sign unplace " . (g:firstsign + 22)
707     exe "sign unplace " . (g:firstsign + 23)
708     exe "sign unplace " . (g:firstsign + 24)
709
710     sign undefine MarkDash
711     sign undefine MarkDot
712     sign undefine MarkQuote
713     sign undefine MarkCaret
714     sign undefine MarkLess
715     sign undefine MarkGreater
716     sign undefine MarkLeft
717     sign undefine MarkRight
718     sign undefine MarkSquareLeft
719     sign undefine MarkSquareRight
720     sign undefine MarkBraceLeft
721     sign undefine MarkBraceRight
722     sign undefine Marka
723     sign undefine Markb
724     sign undefine Markc
725     sign undefine Markd
726     sign undefine Marke
727     sign undefine Markf
728     sign undefine MarkA
729     sign undefine MarkB
730     sign undefine MarkC
731     sign undefine MarkD
732     sign undefine MarkE
733     sign undefine MarkF
734
735     call <SID>Prep_Signs()
736     if a:resize
737       call Resize_Columns("-", 2)
738     endif
739   endif
740 endfun
741
742 fun! <SID>Has_Unicode()
743   if ! has('multi_byte')
744     return 0
745   endif
746
747   if version < "602"
748     return 0
749   endif
750
751   if &tenc =~? '^u\(tf\|cs\)'
752     return 1
753   endif
754
755   if ! strlen(&tenc) && &enc =~? '^u\(tf\|cs\)'
756     return 1
757   endif
758
759   return 0
760 endfun
761
762 " Change list mode.
763 fun! Cycle_List()
764   " Pretty UTF-8 listchars.
765   if <SID>Has_Unicode()
766     let basic='tab:»·,trail:…,extends:«,precedes:»'
767     let eol='eol:¶'
768     if version >= "700"
769       let basic=basic . ',nbsp:•'
770     endif
771   else
772     let basic='tab:\\_,trail:_,extends:<,precedes:>'
773     let eol='eol:$'
774     if version >= "700"
775       let basic=basic . ',nbsp:+'
776     endif
777   endif
778   call Iain_Vars()
779   let b:iainlist = b:iainlist + 1
780   if b:iainlist > 2
781     let b:iainlist = 0
782   endif
783   if b:iainlist == 0
784     set nolist
785   elseif b:iainlist == 1
786     exec "set lcs=" . basic
787     set list
788   else
789     exec "set lcs=" . basic . "," . eol
790     set list
791   endif
792 endfun
793
794 " Cycle between hex and decimal display of toolbar stuff.
795 fun! Cycle_HexStatusLine()
796   call Iain_Vars()
797   let b:iainhex = ! b:iainhex
798   call Show_StatusLine()
799 endfun
800
801 " Cycle verbose display of toolbar stuff.
802 fun! Cycle_VerboseStatusLine()
803   call Iain_Vars()
804   let b:iainverbose = ! b:iainverbose
805   call Show_StatusLine()
806 endfun
807
808 " Toggle quickfix window.
809 fun! Cycle_Quickfix()
810   if g:quickfixing == 1
811     cclose
812     let g:quickfixing=0
813   else
814     copen
815   endif
816 endfun
817
818 " Swap hex/decimal statusline with \x.
819 call Mapping("x", ":call Cycle_HexStatusLine()<CR>:<CR>")
820 " Change statusline verbosity with \v.
821 call Mapping("v", ":call Cycle_VerboseStatusLine()<CR>:<CR>")
822 " Cycle list styles with \l.
823 call Mapping("l", ":call Cycle_List()<CR>:<CR>")
824 " Toggle tags with \t.
825 call Mapping("t", ":Tlist<CR>")
826 " Change foldmethod with \f.
827 call Mapping("f", ":se foldenable!<CR>:<CR>")
828 " Toggle quickfix window with \q.
829 call Mapping("q", ":call Cycle_Quickfix()<CR>:<CR>")
830 " Rerun filetype detection with \s.  The s is for syntax, as this will be
831 " updated as a side-effect.
832 call Mapping("s", ":filetype detect<CR>:<CR>")
833 " Toggle marks with \m.
834 call Mapping("m", ":call <SID>Cycle_Signs(1)<CR>:<CR>")
835
836 fun! <SID>Iain_Colour(colour)
837   if &t_Co == 88
838     if a:colour == "darkblue"
839       return 17
840     elseif a:colour == "darkmagenta"
841       return 33
842     elseif a:colour == "darkred"
843       return 32
844     elseif a:colour == "red"
845       return 64
846     endif
847   elseif &t_Co == 256
848     if a:colour == "darkblue"
849       return 17
850     elseif a:colour == "darkmagenta"
851       return 90
852     elseif a:colour == "darkred"
853       return 88
854     elseif a:colour == "red"
855       return 196
856     endif
857   else
858     return a:colour
859   endif
860 endfun
861
862 " Change status bar colour when various things happen.
863 " Flags: H/h: Cursor held/moved.
864 "        F/f: Focus gained/lost.
865 "        I/i: Insert mode entered/left.
866 fun! Highlight_StatusLine(flag)
867   " Get current status.
868   call Iain_Vars()
869
870   " Change the status based on the flag.  XXX: Does Vim let us to do flags?
871   let re = "[" . tolower(a:flag) . toupper(a:flag) . "]"
872   let b:iainstatus = substitute(b:iainstatus, re, a:flag, "")
873
874   let l:normalcolour = "darkblue"
875   let l:editingcolour = "darkmagenta"
876   let l:warningcolour = "darkred"
877   let l:readonlycolour = "red"
878
879   " Default colour.
880   let l:colour = l:normalcolour
881   " Maybe override depending on status.
882   if b:iainstatus =~# "H"
883     if b:iainstatus =~# "I"
884       " Held in insert mode.  Add extra highlight if we don't have focus.
885       if b:iainstatus =~# "f"
886         let l:colour = l:warningcolour
887       else
888         let l:colour = l:editingcolour
889       endif
890     endif
891   else
892     if b:iainstatus =~# "I"
893       " Regular insert mode.
894       let l:colour = l:editingcolour
895     endif
896   endif
897
898   " Override again if readonly.
899   if l:colour != l:normalcolour
900     if getbufvar("", "&ro")
901       let l:colour = l:readonlycolour
902     endif
903   endif
904
905   let l:termcolour = <SID>Iain_Colour(l:colour)
906
907   exec "highlight StatusLine gui=bold term=bold cterm=bold guifg=white guibg=" . l:colour . " ctermfg=white ctermbg=" . l:termcolour
908 endfun
909
910 au Display VimEnter * call Highlight_StatusLine("")
911
912 " Show signs by default.
913 au Display VimEnter * call <SID>Cycle_Signs(0)
914 endif
915
916 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
917 " Handle options only available in Vim 7 and above.
918 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
919 if version >= "700"
920 version 7.0
921
922 " Helper to show tab name.
923 fun! <SID>TabName(label, gui)
924   let l:label = a:label
925   if l:label == ""
926     let l:label = "No Name"
927     if a:gui
928       let l:label = "[" . l:label . "]"
929     endif
930   else
931     let l:label = fnamemodify(l:label, ":t")
932     if strlen(l:label) >= 18
933       let l:label = l:label[0:17] . ".."
934     endif
935   endif
936   return l:label
937 endfun
938
939 " Find out if any buffer was modified.
940 fun! <SID>TabModified(buflist)
941   let l:i = 0
942   while l:i < len(a:buflist)
943     if getbufvar(a:buflist[l:i], "&modified") == 1
944       return "+"
945     endif
946     let l:i = l:i + 1
947   endwhile
948   return ""
949 endfun
950
951 " Tab line.
952 fun! Show_TabLine()
953   let l:s = "%#TabLineFill#Tabs:"
954
955   let l:i = 0
956   while l:i < tabpagenr("$")
957     let l:i = l:i + 1
958     " Get the label.
959     let l:buflist = tabpagebuflist(l:i)
960     let l:winnr = tabpagewinnr(l:i)
961     let l:n = tabpagewinnr(l:i, "$")
962     let l:label = <SID>TabName(bufname(l:buflist[l:winnr - 1]), 0)
963     let l:modified = <SID>TabModified(l:buflist)
964
965     " Choose highlighting.
966     if l:i == tabpagenr()
967       let l:s .= "%#TabLineSel#[" . l:n . l:modified . " " . l:label . "]"
968     else
969       let l:s .= "%#TabLine# " . l:n . l:modified . " " . l:label . " "
970     endif
971   endwhile
972
973   " Padding.
974   let l:s .= "%#TabLine#%T"
975   return l:s
976 endfun
977
978 " Per tab label for the GUI.
979 fun! Show_GUITabLine()
980   let l:buflist = tabpagebuflist(v:lnum)
981   let l:winnr = tabpagewinnr(v:lnum)
982   let l:s = tabpagewinnr(v:lnum, "$")
983   let l:label = <SID>TabName(bufname(l:buflist[l:winnr - 1]), 1)
984   let l:modified = <SID>TabModified(l:buflist)
985
986   let l:s .= l:modified . " " . l:label
987   return l:s
988 endfun
989
990 se tabline=%!Show_TabLine()
991 se guitablabel=%!Show_GUITabLine()
992
993 au StatusLine CursorHoldI * call Highlight_StatusLine("H")
994 au StatusLine CursorMovedI * call Highlight_StatusLine("h")
995 au StatusLine FocusGained * call Highlight_StatusLine("F")
996 au StatusLine FocusLost * call Highlight_StatusLine("f")
997 au StatusLine InsertEnter * call Highlight_StatusLine("I")
998 au StatusLine InsertLeave * call Highlight_StatusLine("i")
999
1000 if has("signs")
1001   au Signs InsertEnter * call <SID>Highlight_Signs()
1002   au Signs InsertLeave * call <SID>Highlight_Signs()
1003 endif
1004
1005 " Limit the size of the popup menu when completing.
1006 se pumheight=20
1007
1008 " Make diffs vertical by default.
1009 se diffopt+=vertical
1010
1011 " Set size of numbers column.
1012 se numberwidth=5
1013
1014 " Add "previous tab" mapping as gb.
1015 map gb :tabprevious<CR>:<CR>
1016
1017 " Transparency.
1018 if has("gui_macvim")
1019   se transparency=15
1020 endif 
1021
1022 " Yet more GUI options.  Add tabs.
1023 se go+=e
1024
1025 " Perforce.
1026 let g:p4EnableMenu=1
1027 let g:p4Presets='P4CONFIG'
1028 endif
1029
1030 if version >= "500"
1031 " Resize after startup.
1032 au Display VimEnter * call Startup_Resize()
1033 endif