fe6ad8efa4afe936aac47c7bed910e99c490b051
[profile.git] / .vimrc
1 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
2 " Multi-version vimrc compatible with version 4 and above.   vim:set fdm=marker:
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 " Some of these settings should strictly be wrapped inside "if has()" blocks
17 " but that would cause them not to be ignored by Vim 4.
18 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
19 "{{{1
20 " No compatibility mode.
21 se nocp
22
23 " Tabstop 2.
24 se ts=2
25 " And use spaces not tabs.
26 se expandtab
27 " And << and >> indent by 2.
28 se sw=2
29 " Backspace deletes full tab width at the start of a line.
30 se smarttab
31
32 " Allow backspace to delete before start of line.
33 se bs=2
34
35 " Don't jump to the start of the line when using H, L etc.
36 se nosol
37
38 " Show the ruler.
39 se ruler
40 " Show partial commands in the ruler.
41 se showcmd
42 " And always show the status line.
43 se laststatus=2
44
45 " Use C indent style.
46 se cindent
47 se cinkeys=0{,0},0),:,!^F,o,O,e
48 se cinoptions=b1,c2
49
50 " GUI options.
51 se go=aglmr
52
53 " Don't be bugged by messages at the bottom of the screen.
54 se shm=aot
55
56 " Find as you type.
57 se incsearch
58
59 " Case-insensitive search.
60 se ignorecase
61 " But override by typing capitals.
62 se smartcase
63
64 " Look for ctags in home directory first.
65 se tags=~/.tags,./tags,tags
66
67 " Don't timeout waiting to interpet, eg, <ESC>OA as an escape code.
68 se ttimeoutlen=100
69
70 " Remember undo list for closed (but not wiped) buffers.
71 se hidden
72
73 " Use ^B to search backward when completing.
74 inoremap <C-b> <C-p>
75 " Use ^L to show matching completions but don't select one.
76 inoremap <C-l> <C-n><C-p>
77
78 " Swap jump keys.
79 nnoremap ' `
80 nnoremap ` '
81
82 " Select previous widnow.
83 nnoremap <C-w>^ <C-w>p
84 nnoremap <C-w><C-^> <C-w>p
85 "}}}1
86
87 " Find stuff.
88 if (has("win32") || has("win64")) && version >= "504"
89   se rtp=~/.vim,$VIMRUNTIME
90 endif
91
92 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
93 " Handle options only available in Vim 5 and above.
94 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
95 if version >= "500" "{{{1
96 version 5.0
97
98 " Tell Vim we use dark backgrounds in our terminals.
99 if ! has("gui_running")
100   se bg=dark
101 endif
102
103 " Allow mouse use in a terminal but only if it can work.
104 if has("xterm_clipboard")
105   se mouse=nvir
106 endif
107
108 " Update more quickly.  For use with sign highlighting as polling for
109 " CursorMove makes redrawing slow.
110 if has("signs")
111   se updatetime=500
112 endif
113
114 " Enable tab-completion prompting for commands.
115 if has("wildmenu")
116   se wildmenu
117   " Don't list object files when globbing files to load.
118   se wildignore+=*.o,*.obj
119   " So there's no need to assign them low priority.
120   se suffixes-=*.o,*.obj
121 endif
122
123 " Save sessions in UNIX format with / as file separator.  This is
124 " cross-platform.
125 if has("mksession")
126   se ssop+=unix,slash
127 endif
128
129 " How often do we need to use ^A/^X on octals?
130 se nf=hex
131
132 " Nuke any pre-existing autocommands.
133 if has("autocmd")
134   augroup Display
135   autocmd!
136   augroup Mode
137   autocmd!
138   if has("signs")
139     augroup Signs
140     autocmd!
141   endif
142   augroup StatusLine
143   autocmd!
144   augroup File
145   autocmd!
146   augroup END
147 endif
148
149 " Save the current window dimensions so we can restore them when we quit.
150 if ! exists("g:oldcols")
151   let g:oldcols=&columns
152 endif
153 if ! exists("g:oldlines")
154   let g:oldlines=&lines
155 endif
156
157 " More GUI options.  Add icon and tearoffs.
158 if has("gui")
159   se go+=i
160   se go+=t
161 endif
162
163 " Allow dynamic window resize even if we aren't in an xterm.
164 se t_WS=\e[8;%p1%d;%p2%dt
165
166 " Highlight search results.
167 if has("extra_search")
168   se hlsearch
169 endif
170
171 " Syntax highlighting.  New versions will use syn enable instead.
172 if version < "600"
173   syn on
174 endif
175
176 if has("user_commands")
177   " Catch typos.
178   command! W :w
179   command! Wq :wq
180   command! Wqa :wqa
181 endif
182
183 " Forget the Ex mode mapping.
184 map Q <NOP>
185
186 if has("autocmd")
187   " Position the compview plugin window.
188   au Display BufEnter -SearchResults- set buftype=nowrite | set nonumber | wincmd J
189 endif
190 endif "}}}1
191
192 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
193 " Handle options only available in Vim 5.2 and above.
194 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
195 if version >= "502" "{{{1
196 version 5.2
197
198 " Helper to initialise a variable.
199 fun! Prep_Var(var, value) "{{{2
200   if exists(a:var)
201     return
202   endif
203   exe "let " . a:var . "=" . a:value
204 endfun "}}}2
205
206 " Set up our variables.
207 fun! Iain_Vars() "{{{2
208   call Prep_Var("w:iainlist", 0)
209   call Prep_Var("b:iainhex", 0)
210   call Prep_Var("b:iainverbose", 0)
211   " Window Flags: (F)ocused, (I)nsert mode, Cursor (H)old.
212   call Prep_Var("b:iainstatus", "'Fih'")
213   call Prep_Var("g:iainextracolumnsnumber", "''")
214   call Prep_Var("g:iainextracolumnslist", "''")
215   call Prep_Var("b:iainalt", 0)
216   if has("signs")
217     call Prep_Var("g:marksigns", 0)
218     call Prep_Var("g:firstsign", 100)
219   endif
220   call Prep_Var("g:resizable", "''")
221 endfun "}}}2
222
223 " Show the window title.
224 fun! Show_TitleString() "{{{2
225   if bufname("") == ""
226     let l:ts1='Vim'
227   else
228     " Vim 5 doesn't have printf.
229     let l:ts1=bufnr("")
230     if l:ts1 < 10
231       let l:ts1=" " . l:ts1
232     endif
233     let l:ts1=l:ts1 . ": " . expand('%t')
234   endif
235   let l:ts1=l:ts1 . " (" .  getcwd() . ")"
236   if has("clientserver")
237     let l:ts1=l:ts1 . " " . v:servername
238   endif
239   return l:ts1
240 endfun "}}}2
241
242 " Toggle case-sensitivity.
243 fun! Invert_Case() "{{{2
244   let &ic = ! &ic
245 endfun "}}}2
246
247 " Can we resize this window?
248 fun! Can_Resize() "{{{2
249   call Iain_Vars()
250
251   if g:resizable == "0" || g:resizable == "1"
252     return g:resizable
253   endif
254
255   " Do we KNOW we can(not) resize?
256   if has("gui_running")
257     let g:resizable = 1
258   elseif $RESIZABLE == &term
259     let g:resizable = 1
260   elseif $RESIZABLE == "0"
261     let g:resizable = 0
262   else
263     " Assume we can.  Allow overriding.
264     let g:resizable = 1
265   endif
266   return g:resizable
267 endfun "}}}2
268
269 " Grow or shrink the window width.
270 fun! Resize_Columns(op, ...) "{{{2
271   if a:op == ""
272     return
273   endif
274
275   if ! Can_Resize()
276     return
277   endif
278
279   if a:0 == 0
280     " Vim 5 hardcodes the size of numbers column to 8.
281     if version >= "700" && has("linebreak")
282       let l:columns = &numberwidth
283     else
284       let l:columns = 8
285     endif
286   else
287     let l:columns = a:1
288   endif
289
290   exe "let l:resize=" . &columns . a:op . l:columns
291   let l:resize = "se columns=" . l:resize
292
293   " HACK: Inside screen there is an extra line for the status bar.  Vim
294   " manages the resize by sending an escape sequence to set the number of
295   " lines and number of columns in one action.  To do this it will first query
296   " the number of lines and then set <same number of lines> by <new number of
297   " columns>.  Because of the extra line for the status bar this results in
298   " the real terminal being shrunk by a line.  We ask for the terminal to grow
299   " by a line so it ends up actually being the same.
300   if &term =~ '^screen'
301     let l:resize = l:resize . " lines=" . (&lines + 1)
302   endif
303
304   exe l:resize
305 endfun "}}}2
306
307 " Grow or shrink the window height.
308 fun! Resize_Lines(op, lines) "{{{2
309   if a:op == ""
310     return
311   endif
312
313   if ! Can_Resize()
314     return
315   endif
316
317   exe "let l:resize=" . &lines . a:op . a:lines
318   if &term =~ '^screen'
319     let l:resize = l:resize + 1
320   endif
321   let l:resize = "se lines=" . l:resize
322
323   exe l:resize
324 endfun "}}}2
325
326 " Set extra columns depending on window status.
327 fun! Extra_Columns(extra, var, ...) "{{{2
328   " Vim 6 doesn't have winnr("$").  Determine which windows are open
329   " ourselves by using :windo to incremement a counter.  As Vim 5
330   " doesn't have :windo we require Vim 6 for this.
331   if v:version < "600"
332     return ""
333   endif
334   if ! has("windows")
335     return ""
336   endif
337
338   " Remember which window we're in.
339   let l:winnr = winnr()
340   let l:num_windows = 0
341   windo let l:num_windows = l:num_windows + 1
342   " Switch back to the window we were in.
343   exe l:winnr . "wincmd w"
344
345   call Iain_Vars()
346
347   if a:0 == 0
348     let l:condition = ""
349   else
350     let l:condition = a:1
351   endif
352
353   let l:n = 0
354   let l:i = 1
355   let l:windows = ""
356   while l:n < l:num_windows
357     " If window w exists then getwinvar(w, "&modified") will be 0 or 1.
358     if getwinvar(l:i, "&modified") =~ '^\d'
359       let l:n = l:n + 1
360
361       let l:val = 0
362       exe "if getwinvar(" . l:i . ", '" . a:var . "') " . l:condition . " | let l:val = 1 | endif"
363       if l:val
364         exe "let l:windows = '" . l:windows . ":" . l:i . "'"
365       endif
366     endif
367     let l:i = l:i + 1
368   endwhile
369
370   let l:extra = "g:iainextracolumns" . a:extra
371   exe "let l:val = " . l:extra
372   exe "let " . l:extra . " = '" . l:windows . "'"
373
374   if l:windows == l:val
375     return ""
376   endif
377
378   if l:windows == ""
379     return "-"
380   elseif l:val == ""
381     return "+"
382   endif
383 endfun "}}}2
384
385 " Toggle number display.
386 fun! Number(resize) "{{{2
387   call Iain_Vars()
388   let &number = ! &number
389
390   " Ensure we keep track of any extra columns even if we aren't resizing.
391   " This prevents confusion when number is set at startup.
392   let l:extra = Extra_Columns("number", "&number")
393
394   if a:resize
395     call Resize_Columns(l:extra)
396   endif
397 endfun "}}}2
398
399 " Restore window size.
400 if has("autocmd") && ! has("gui_running")
401   au Display VimLeave * if exists("g:oldcols") | call Resize_Columns("-", (&columns - g:oldcols)) | endif
402   au Display VimLeave * if exists("g:oldlines") | call Resize_Lines("-", (&lines - g:oldlines)) | endif
403 endif
404
405 " Map Makefile mode.
406 if has("autocmd")
407   au Mode BufEnter * if &ft == "make" | call MakeMode_map() | endif
408   au Mode BufLeave * if &ft == "make" | call MakeMode_unmap() | endif
409 endif
410
411 " Entering Make mode.
412 fun! MakeMode_map() "{{{2
413   call Iain_Vars()
414   let w:iainlist=1
415   call Cycle_List()
416   set ts=8
417   set noexpandtab
418 endfun "}}}2
419
420 " Leaving Make mode.
421 fun! MakeMode_unmap() "{{{2
422   call Cycle_List()
423   set ts=2
424   set expandtab
425 endfun "}}}2
426
427 " Function to create mappings with either a hardcoded \ or <Leader>.
428 fun! Mapping(keysequence,mapping) "{{{2
429   if version < "600"
430     exec "map \\" . a:keysequence . " " . a:mapping
431   else
432     exec "map <Leader>" . a:keysequence . " " . a:mapping
433   endif
434 endfun "}}}2
435
436 " Use - and = to create underlines.
437 call Mapping("-", "yyp:s/./-/g<RETURN>:let @/=''<RETURN>:<RETURN>")
438 call Mapping("=", "yyp:s/./=/g<RETURN>:let @/=''<RETURN>:<RETURN>")
439
440 " Change to ts=2 with \2.
441 call Mapping("2", ":se ts=2<CR>:<CR>")
442 " Change to ts=4 with \4.
443 call Mapping("4", ":se ts=4<CR>:<CR>")
444 " Change to ts=8 with \8.
445 call Mapping("8", ":se ts=8<CR>:<CR>")
446 " Change to ts=16 with \6.
447 call Mapping("6", ":se ts=16<CR>:<CR>")
448 " Change to ts=32 with \3.
449 call Mapping("3", ":se ts=32<CR>:<CR>")
450 " Toggle paste mode with \p.
451 call Mapping("p", ":se paste!<CR>:<CR>")
452 " Swap case-sensitivity with \c.
453 call Mapping("C", ":call Invert_Case()<CR>:<CR>")
454 " Change number mode with \n.
455 call Mapping("n", ":call Number(1)<CR>:<CR>")
456 " Expand or shrink window size with \> and \<.
457 call Mapping(">", ":call Resize_Columns('+')<CR>:<CR>")
458 call Mapping("<", ":call Resize_Columns('-')<CR>:<CR>")
459 " Clear search pattern with \/.
460 call Mapping("/", ":let @/=\"\"<CR>:<CR>")
461 " Toggle alternate buffer name with \#.
462 call Mapping("#", ":call Cycle_Alt()<CR>:<CR>")
463
464 " Set graphical window title.
465 if has("win32") || has("win64")
466   " Windows taskbar entries are probably too small to show full titles.
467   se titlestring=%t
468 else
469   se titlestring=%{Show_TitleString()}
470 endif
471
472 " Vim tip 99: What's the highlighting group under the cursor?
473 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>")
474
475 fun! Uncluttered_Buffer() "{{{2
476   if exists("uncluttered_buffer")
477     if uncluttered_buffer == 1
478       return 1
479     endif
480   endif
481
482   if version >= "600"
483     if &buftype != ''
484       return 1
485     endif
486   endif
487
488   if &ft == 'perforce'
489     return 1
490   endif
491
492   if &ft == 'svn'
493     return 1
494   endif
495
496   if &ft == 'gitcommit'
497     return 1
498   endif
499
500   return 0
501 endfun "}}}2
502
503 fun! Startup_Resize() "{{{2
504   let l:columns = 0
505
506   " Resize for numbers.
507   if &number
508     if version >= "700" && has("linebreak")
509       let l:columns = &numberwidth
510     else
511       let l:columns = 8
512     endif
513   endif
514
515   " Resize for signs.
516   if has("signs")
517     if g:marksigns
518       if version >= "600"
519         let l:columns = l:columns + 2
520       endif
521     endif
522   endif
523
524   if g:oldcols < (80 + l:columns)
525     call Resize_Columns("+", l:columns)
526   endif
527 endfun "}}}2
528
529 " Change status bar colour when various things happen.
530 " Flags: H/h: Cursor held/moved.
531 "        F/f: Focus gained/lost.
532 "        I/i: Insert mode entered/left.
533 fun! Highlight_StatusLine(flag) "{{{2
534   if ! has("statusline")
535     return
536   endif
537   " Get current status.
538   call Iain_Vars()
539
540   " Change the status based on the flag.  XXX: Does Vim let us to do flags?
541   let l:ic = &ic
542   set ic
543   let b:iainstatus = substitute(b:iainstatus, a:flag, a:flag, "")
544   let &ic = l:ic
545
546   let l:normalcolour = "darkblue"
547   let l:editingcolour = "darkmagenta"
548   let l:replacecolour = "purple"
549   let l:warningcolour = "darkred"
550   let l:readonlycolour = "red"
551
552   if b:iainstatus =~# "I"
553     if v:insertmode == "r"
554       let l:editingcolour = l:replacecolour
555     endif
556   endif
557
558   " Default colour.
559   let l:colour = l:normalcolour
560   " Maybe override depending on status.
561   if b:iainstatus =~# "H"
562     if b:iainstatus =~# "I"
563       " Held in insert mode.  Add extra highlight if we don't have focus.
564       if b:iainstatus =~# "f"
565         let l:colour = l:warningcolour
566       else
567         let l:colour = l:editingcolour
568       endif
569     endif
570   else
571     if b:iainstatus =~# "I"
572       " Regular insert mode.
573       let l:colour = l:editingcolour
574     endif
575   endif
576
577   " Override again if readonly.
578   if l:colour != l:normalcolour
579     if getbufvar("", "&ro")
580       let l:colour = l:readonlycolour
581     endif
582   endif
583
584   let l:termcolour = Iain_Colour(l:colour)
585
586   exec "highlight StatusLine gui=none term=none cterm=none guifg=white guibg=" . l:colour . " ctermfg=white ctermbg=" . l:termcolour
587   exec "highlight User1 gui=bold term=bold cterm=bold guifg=white guibg=" . l:colour . " ctermfg=white ctermbg=" . l:termcolour
588 endfun "}}}2
589
590 fun! Iain_Colour(colour) "{{{2
591   if &t_Co == 88
592     if a:colour == "darkblue"
593       return 17
594     elseif a:colour == "darkmagenta"
595       return 33
596     elseif a:colour == "purple"
597       return 35
598     elseif a:colour == "darkred"
599       return 32
600     elseif a:colour == "red"
601       return 64
602     endif
603   elseif &t_Co == 256
604     if a:colour == "darkblue"
605       return 17
606     elseif a:colour == "darkmagenta"
607       return 90
608     elseif a:colour == "purple"
609       return 57
610     elseif a:colour == "darkred"
611       return 88
612     elseif a:colour == "red"
613       return 196
614     endif
615   else
616     " Colours which cterm*g doesn't recognise.
617     if a:colour == "purple"
618       return "magenta"
619     endif
620     return a:colour
621   endif
622 endfun "}}}2
623
624 if has("autocmd")
625   au StatusLine VimEnter * call Highlight_StatusLine("")
626
627   " Show numbers by default.
628   au Display VimEnter * if ! Uncluttered_Buffer() | call Number(0) | endif
629 endif
630 endif "}}}1
631
632 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
633 " Handle options only available in Vim 5.4 and above.
634 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
635 if version >= "504" "{{{1
636 version 5.4
637
638 " Reuse windows when using sbuffer.
639 se switchbuf=useopen
640
641 " Allow persistent variable saving for localvimrc.
642 se viminfo+=!
643
644 " Do we have Unicode?
645 fun! Has_Unicode() "{{{2
646   if ! has('multi_byte')
647     return 0
648   endif
649
650   if version < "602"
651     return 0
652   endif
653
654   if &tenc =~? '^u\(tf\|cs\)'
655     return 1
656   endif
657
658   if ! strlen(&tenc) && &enc =~? '^u\(tf\|cs\)'
659     return 1
660   endif
661
662   return 0
663 endfun "}}}2
664
665 " Helper for status line.
666 " Show space, underscore or dollar sign depending on list mode.
667 fun! Show_List() "{{{2
668   call Iain_Vars()
669   if w:iainlist == 0
670     " No list.
671     return " "
672   elseif Has_Unicode()
673     if w:iainlist == 1
674       " Just tabs.
675       return "»"
676     else
677       " Full list.
678       return "¶"
679     endif
680   else
681     if w:iainlist == 1
682       return "_"
683     else
684       return "\$"
685     endif
686   endif
687 endfun "}}}2
688
689 " Helper for status line.
690 " Show c or C to denote case-sensitivity.
691 fun! Show_Case() "{{{2
692   if &ic
693     return "c"
694   else
695     return "C"
696   endif
697 endfun "}}}2
698
699 " Helper for status line.
700 " Show the size of the tabstop.
701 fun! Show_Tabstop() "{{{2
702   return &ts
703 endfun "}}}2
704
705 " Helper for status line.
706 " Show p when paste mode is on.
707 fun! Show_Paste() "{{{2
708   if &paste
709     return "p"
710   else
711     return ""
712   endif
713 endfun "}}}2
714
715 " Helper for status line.
716 " Show v when virtualedit mode is block, insert or onemore.
717 " Show V when virtualedit mode is all.
718 fun! Show_VirtualEdit() "{{{2
719   if ! has("virtualedit")
720     return ""
721   endif
722
723   if &ve == "all"
724     return "V"
725   elseif &ve != ''
726     return "v"
727   else
728     return ""
729   endif
730 endfun "}}}2
731
732 " Helper for status line.
733 " Show U when persistent undo is on.
734 " Show u when persistent undo is off but an undofile exists.
735 fun! Show_Undo() "{{{2
736   if ! exists("&undofile")
737     return ""
738   endif
739
740   if &undofile
741     return "U"
742   elseif filereadable(undofile(expand("%")))
743     return "u"
744   else
745     return ""
746   endif
747 endfun "}}}2
748
749 " Helper for status line.
750 " Show alternate buffer number and name.
751 fun! Show_Alt() "{{{2
752   let l:alt = bufnr("#")
753   if l:alt < 0 || l:alt == bufnr("") || ! b:iainalt
754     return ""
755   endif
756
757   return " " . l:alt . ": " . expand("#:t")
758 endfun "}}}2
759
760 " Helper for status line.
761 " Show scrollbind or cursorbind.
762 fun! Show_Bind() "{{{2
763   if has("cursorbind")
764     if &cursorbind
765       if Has_Unicode()
766         return "⇄"
767       else
768         return ">"
769       endif
770     elseif &scrollbind
771       if Has_Unicode()
772         return "⇅"
773       else
774         return "^"
775       endif
776     endif
777   endif
778   return ""
779 endfun "}}}2
780
781 " Show the status line.
782 fun! Show_StatusLine() "{{{2
783   if ! has("statusline")
784     return
785   endif
786   call Iain_Vars()
787   let l:sl1='%2n\:\ %<%1*%f%0*\ [%{Show_List()}%{Show_Bind()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%{Show_VirtualEdit()}%{Show_Undo()}%Y%M%R]%{Show_Alt()}\ '
788   let l:sl3='L:%1*%4.6l%0*/%-4.6L\ C:%1*%3.6c%V%0*\ \|\ %P'
789   let l:hexformat='%b'
790   if b:iainhex
791     let l:hexformat='0\x%02B'
792   endif
793   if b:iainverbose
794     let l:sl1=l:sl1 . v:version . '\ %='
795     let l:sl2=l:hexformat . '\ \|\ P:%4.6o\ '
796   else
797     let l:sl1=l:sl1 . '%='
798     let l:sl2=''
799   endif
800   exec "set statusline=" . l:sl1 . l:sl2 . l:sl3
801 endfun "}}}2
802
803 " Show the status line for the first time.
804 call Show_StatusLine()
805 endif "}}}1
806
807 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
808 " Handle options only available in Vim 6 and above.
809 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
810 if version >= "600" "{{{1
811 version 6.0
812
813 if has("win32") || has("win64")
814   se encoding=utf-8
815 endif
816
817 " Remember quickfix state.
818 if has("quickfix")
819   let g:quickfixing=0
820 endif
821
822 " Set indenting by filetype.
823 filetype indent on
824
825 " Less intrusive syntax highlighting.
826 if has("syntax")
827   " The :syntax enable command tries to source the syntax.vim runtime script.
828   " Parsing this .vimrc will fail if for some reason the runtime doesn't
829   " exist, as could be the case if the binary was installed with no support
830   " files.  GNU On Windows is one example of an incomplete installation.
831   try
832     syn enable
833   catch
834   endtry
835 endif
836
837 " Set colours.
838 if has("gui_running")
839   if has("win32") || has("win64")
840     exe "silent se guifont=DejaVu_Sans_Mono:h10:cANSI"
841   else
842     exe "silent se guifont=DejaVu\\ Sans\\ Mono\\ 10"
843   endif
844 endif
845 if has("gui_running") || &t_Co > 16
846   exe "silent colo iain"
847 endif
848
849 " Ignore whitespace when diffing.
850 if has("diff")
851   se diffopt=filler,iwhite
852 endif
853
854 if has("autocmd")
855   if has("quickfix")
856     " Remember that we are opening the quickfix window.
857     au Mode BufWinEnter quickfix let g:quickfixing=1
858     au Mode BufUnload * if &ft == "qf" | let g:quickfixing=0 | endif
859   endif
860
861   " Allow in-place editing of crontabs.
862   au Mode FileType crontab set backupcopy=yes
863 endif
864
865 " Make * and # work the way you expect in visual mode.
866 vnoremap * y/\V<C-R>=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")<CR><CR>
867 vnoremap # y?\V<C-R>=substitute(escape(@@,"?\\"),"\n","\\\\n","ge")<CR><CR>
868
869 " Set mark and update highlighting.
870 if has("signs")
871   au Signs BufReadPost * call <SID>Highlight_Signs()
872   au Signs CursorHold * call <SID>Highlight_Signs()
873 endif
874
875 " Helper to set buffer variable for a given sign.
876 fun! <SID>Prep_Sign(sign) "{{{2
877   if ! exists("b:sign" . a:sign) || ! g:marksigns
878     exe "let b:sign" . a:sign . "=0"
879    endif
880 endfun "}}}2
881
882 fun! <SID>Place_Sign(number, line, old, name) "{{{2
883   if a:line == a:old
884     return a:old
885   endif
886
887   exe "sign unplace " . (g:firstsign + a:number) . " buffer=" . bufnr("")
888   " Don't place the sign if it would conflict with the last change sign.
889   exe "sign place " . (g:firstsign + a:number) . " line=" . a:line . " name=" . a:name . " buffer=" . bufnr("")
890   return a:line
891 endfun "}}}2
892
893 fun! <SID>Highlight_Signs(...) "{{{2
894   if ! has("signs") || ! g:marksigns || Uncluttered_Buffer()
895     return
896   endif
897
898   let l:signs = g:iainsigns
899   let l:sign = ""
900   let l:i = 0
901   while strlen(l:signs)
902     let l:sign = matchstr(l:signs, '^[A-Za-z]\+\(:.\)*[.=>-][^ ]\+')
903
904     let l:name = substitute(l:sign, '[:.=>-].*', "", "")
905     let l:var = tolower(l:name)
906     let l:sign = substitute(l:sign, '^[A-Za-z]\+', "", "")
907     let l:ascii = matchstr(l:sign, '^:.')
908     let l:mark = substitute(l:sign, '^\(:.\)*[.=>-]', "", "")
909     if strlen(l:ascii)
910       let l:ascii = substitute(l:ascii, '^:', "", "")
911     else
912       let l:ascii = l:mark
913     endif
914     let l:ascii = substitute(l:ascii, '"', '\\"', "")
915
916     if l:ascii == "o"
917       let l:line = "."
918     else
919       let l:line = "'" . l:ascii
920     endif
921
922     call <SID>Prep_Sign(l:var)
923     exe "let " . l:var . " = <SID>Place_Sign(" . l:i . ", line(\"" . l:line . "\"), b:sign" . l:var . ", \"Mark" . l:name . "\")"
924     let l:i = l:i + 1
925
926     let l:signs = substitute(l:signs, '^[^ ]\+ *', "", "")
927   endwhile
928 endfun "}}}2
929
930 " Toggle signs.
931 fun! <SID>Cycle_Signs(resize) "{{{2
932   if ! has("signs")
933     return
934   endif
935   call Iain_Vars()
936   let g:marksigns = ! g:marksigns
937
938   " Retrofit arrays on to Vim 6.
939   if ! exists("g:iainsigns")
940     " Signs are defined in g:iainsigns.  The syntax is as follows:
941     "
942     " Sign ::= Name (':' Mark)* Type Symbol
943     " Type ::= '=' | '-' | '.'
944     "
945     " Signs with Type '=' will be highlighted with the MarkSign group.
946     " Signs with Type '-' will be highlighted with the MarkLine group.
947     " Signs with Type '.' will be highlighted with the MarkDot group.
948     " Signs with Type '>' will be highlighted with the MarkArrow group.
949     " Define the Mark where Symbol is not also the mark name, eg "']".
950     let g:iainsigns = "Less=< Greater=> Left=( Right=) SquareLeft=[ SquareRight=] BraceLeft={ BraceRight=} a-a b-b c-c d-d e-e f-f A-A B-B C-C D-D E-E F-F"
951     if Has_Unicode()
952       let g:iainsigns = g:iainsigns . " Quote:\"=” Dash:'=’ Caret:^.ʌ Dot:..•"
953       if version < "704"
954         let g:iainsigns = g:iainsigns ." Cursor:o>▶"
955       endif
956     else
957       let g:iainsigns = g:iainsigns . " Quote=\" Dash=' Caret.^ Dot:..*"
958       if version < "704"
959         let g:iainsigns = g:iainsigns ." Cursor>o"
960       endif
961     endif
962   endif
963
964   if g:marksigns
965     " Signs to highlight marks.
966     " Syntax won't work properly in Vim 6.
967     let l:signs = g:iainsigns
968     let l:sign = ""
969     while strlen(l:signs)
970       let l:sign = matchstr(l:signs, '^[A-Za-z]\+\(:.\)*[.=>-][^ ]\+')
971
972       let l:name = substitute(l:sign, '[:.=>-].*', "", "")
973       let l:sign = substitute(l:sign, '^[A-Za-z]\+', "", "")
974       let l:ascii = matchstr(l:sign, '^:.')
975       let l:mark = substitute(l:sign, '^\(:.\)*[.=>-]', "", "")
976       if strlen(l:ascii)
977         let l:ascii = substitute(l:ascii, '^:', "", "")
978         let l:ascii = matchstr(l:ascii, '^.')
979       else
980         let l:ascii = l:mark
981       endif
982       let l:ascii = substitute(l:ascii, '"', '\\"', "")
983       let l:type = substitute(l:sign, '^:.', "", "")
984       let l:type = matchstr(l:type, '^.')
985
986       let l:hl = ""
987       if l:type == "="
988         let l:hl = "texthl=MarkSign text="
989       elseif l:type == "."
990         let l:hl = "texthl=MarkDot text="
991       elseif l:type == "-"
992         let l:hl = "texthl=MarkLine text="
993       elseif l:type == ">"
994         let l:hl = "texthl=MarkArrow text="
995       endif
996
997       exe "sign define Mark" . l:name . " " . l:hl . l:mark
998
999       let l:signs = substitute(l:signs, '^[^ ]\+ *', "", "")
1000     endwhile
1001
1002     if a:resize
1003       call Resize_Columns("+", 2)
1004     endif
1005     call <SID>Highlight_Signs()
1006   else
1007     let l:i = 0
1008     while l:i < 25
1009       exe "sign unplace " . (g:firstsign + l:i)
1010       let l:i = l:i + 1
1011     endwhile
1012
1013     let l:signs = g:iainsigns
1014     let l:sign = ""
1015     while strlen(l:signs)
1016       let l:sign = matchstr(l:signs, '^[A-Za-z]\+')
1017
1018       exe "sign undefine Mark" . l:sign
1019       call <SID>Prep_Sign(tolower(l:sign))
1020       let l:signs = substitute(l:signs, '^[^ ]\+ *', "", "")
1021     endwhile
1022
1023     if a:resize
1024       call Resize_Columns("-", 2)
1025     endif
1026   endif
1027 endfun "}}}2
1028
1029 " Change list mode.
1030 fun! Cycle_List() "{{{2
1031   " Pretty UTF-8 listchars.
1032   if Has_Unicode()
1033     let basic='tab:»·,trail:…,extends:«,precedes:»'
1034     let eol='eol:¶'
1035     if version >= "700"
1036       let basic=basic . ',nbsp:•'
1037     endif
1038   else
1039     let basic='tab:\\_,trail:_,extends:<,precedes:>'
1040     let eol='eol:$'
1041     if version >= "700"
1042       let basic=basic . ',nbsp:+'
1043     endif
1044   endif
1045   call Iain_Vars()
1046   let w:iainlist = w:iainlist + 1
1047   if w:iainlist > 2
1048     let w:iainlist = 0
1049   endif
1050   if w:iainlist == 0
1051     setlocal nolist
1052   elseif w:iainlist == 1
1053     exec "setlocal lcs=" . basic
1054     setlocal list
1055   else
1056     exec "setlocal lcs=" . basic . "," . eol
1057     setlocal list
1058   endif
1059
1060   call Resize_Columns(Extra_Columns("list", "iainlist", " == 2"), 1)
1061   call Extra_Whitespace_Match()
1062 endfun "}}}2
1063
1064 " Cycle between hex and decimal display of toolbar stuff.
1065 fun! Cycle_HexStatusLine() "{{{2
1066   call Iain_Vars()
1067   let b:iainhex = ! b:iainhex
1068   call Show_StatusLine()
1069 endfun "}}}2
1070
1071 " Cycle verbose display of toolbar stuff.
1072 fun! Cycle_VerboseStatusLine() "{{{2
1073   call Iain_Vars()
1074   let b:iainverbose = ! b:iainverbose
1075   call Show_StatusLine()
1076 endfun "}}}2
1077
1078 " Toggle quickfix window.
1079 fun! Cycle_Quickfix() "{{{2
1080   if ! has("quickfix")
1081     return
1082   endif
1083   if g:quickfixing == 1
1084     cclose
1085     let g:quickfixing=0
1086   else
1087     copen
1088   endif
1089 endfun "}}}2
1090
1091 " Toggle showing alternate buffer information.
1092 fun! Cycle_Alt() "{{{2
1093   call Iain_Vars()
1094   let b:iainalt = ! b:iainalt
1095   call Show_StatusLine()
1096 endfun "{{{2
1097
1098 " To be overridden later if applicable.
1099 fun! Extra_Whitespace_Match() "{{{2
1100   " NOP.
1101 endfun "}}}2
1102
1103 " Swap hex/decimal statusline with \x.
1104 call Mapping("x", ":call Cycle_HexStatusLine()<CR>:<CR>")
1105 " Change statusline verbosity with \v.
1106 call Mapping("V", ":call Cycle_VerboseStatusLine()<CR>:<CR>")
1107 " Cycle list styles with \l.
1108 call Mapping("l", ":call Cycle_List()<CR>:<CR>")
1109 " Toggle tags with \t.
1110 call Mapping("t", ":Tlist<CR>")
1111 " Change foldmethod with \f.
1112 call Mapping("f", ":se foldenable!<CR>:<CR>")
1113 " Toggle quickfix window with \q.
1114 call Mapping("q", ":call Cycle_Quickfix()<CR>:<CR>")
1115 " Rerun filetype detection with \s.  The s is for syntax, as this will be
1116 " updated as a side-effect.
1117 call Mapping("S", ":filetype detect<CR>:<CR>")
1118 " Toggle marks with \m.
1119 call Mapping("m", ":call <SID>Cycle_Signs(1)<CR>:<CR>")
1120
1121 if has("autocmd")
1122   " Show signs by default.
1123   au Display VimEnter * call <SID>Cycle_Signs(0)
1124 endif
1125 endif "}}}1
1126
1127 " move.
1128 nmap <A-u> <Plug>MoveLineHalfPageUp
1129 nmap <A-d> <Plug>MoveLineHalfPageDown
1130 vmap <A-u> <Plug>MoveBlockHalfPageUp
1131 vmap <A-d> <Plug>MoveBlockHalfPageDown
1132
1133 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1134 " Handle options only available in Vim 7 and above.
1135 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1136 if version >= "700" "{{{1
1137 version 7.0
1138
1139 " Helper to show tab name.
1140 fun! <SID>TabName(label, gui) "{{{2
1141   let l:label = a:label
1142   if l:label == ""
1143     let l:label = "No Name"
1144     if a:gui
1145       let l:label = "[" . l:label . "]"
1146     endif
1147   else
1148     let l:label = fnamemodify(l:label, ":t")
1149     if strlen(l:label) >= 18
1150       let l:label = l:label[0:17] . ".."
1151     endif
1152   endif
1153   return l:label
1154 endfun "}}}2
1155
1156 " Find out if any buffer was modified.
1157 fun! <SID>TabModified(buflist) "{{{2
1158   let l:i = 0
1159   while l:i < len(a:buflist)
1160     if getbufvar(a:buflist[l:i], "&modified") == 1
1161       return "+"
1162     endif
1163     let l:i = l:i + 1
1164   endwhile
1165   return ""
1166 endfun "}}}2
1167
1168 " Tab line.
1169 fun! Show_TabLine() "{{{2
1170   let l:s = "%#TabLineFill#Tabs:"
1171
1172   let l:i = 0
1173   while l:i < tabpagenr("$")
1174     let l:i = l:i + 1
1175     " Get the label.
1176     let l:buflist = tabpagebuflist(l:i)
1177     let l:winnr = tabpagewinnr(l:i)
1178     let l:n = tabpagewinnr(l:i, "$")
1179     let l:label = <SID>TabName(bufname(l:buflist[l:winnr - 1]), 0)
1180     let l:modified = <SID>TabModified(l:buflist)
1181
1182     " Choose highlighting.
1183     if l:i == tabpagenr()
1184       let l:s .= "%#TabLineSel#[" . l:n . l:modified . " " . l:label . "]"
1185     else
1186       let l:s .= "%#TabLine# " . l:n . l:modified . " " . l:label . " "
1187     endif
1188   endwhile
1189
1190   " Padding.
1191   let l:s .= "%#TabLine#%T"
1192   return l:s
1193 endfun "}}}2
1194
1195 " Per tab label for the GUI.
1196 fun! Show_GUITabLine() "{{{2
1197   let l:buflist = tabpagebuflist(v:lnum)
1198   let l:winnr = tabpagewinnr(v:lnum)
1199   let l:s = tabpagewinnr(v:lnum, "$")
1200   let l:label = <SID>TabName(bufname(l:buflist[l:winnr - 1]), 1)
1201   let l:modified = <SID>TabModified(l:buflist)
1202
1203   let l:s .= l:modified . " " . l:label
1204   return l:s
1205 endfun "}}}2
1206
1207 " Handle searching in a BufExplorer window.
1208 fun! <SID>BufExplorer_Search(n) "{{{2
1209   if a:n == 0
1210     let l:re = '^  *\d %'
1211   else
1212     let l:re = "^ *" . a:n
1213   endif
1214
1215   " Find matching line.
1216   let l:line = search(l:re, 'w')
1217   if ! l:line
1218     return
1219   endif
1220
1221   if a:n == 0
1222     return
1223   endif
1224
1225   " Peek ahead to the next matching line.
1226   let l:next = search(l:re, 'w')
1227
1228   " Select the buffer if the match is unambiguous.
1229   if l:next == l:line
1230     exe "normal \<CR>"
1231     return
1232   endif
1233
1234   " Go back.
1235   call cursor(l:line, 0)
1236 endfun! "}}}2
1237
1238 " Entering a BufExplorer window.
1239 fun! <SID>BufExplorer_Map() "{{{2
1240   for l:n in [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
1241     exec "nnoremap <buffer> <silent>" . l:n . " :call <SID>BufExplorer_Search(" . l:n . ")<CR>"
1242   endfor
1243 endfun "}}}2
1244
1245 if has("windows")
1246   se tabline=%!Show_TabLine()
1247   se guitablabel=%!Show_GUITabLine()
1248 endif
1249
1250 if has("autocmd")
1251   au StatusLine CursorHoldI * call Highlight_StatusLine("H")
1252   au StatusLine CursorMovedI * call Highlight_StatusLine("h")
1253   au StatusLine FocusGained * call Highlight_StatusLine("F")
1254   au StatusLine FocusLost * call Highlight_StatusLine("f")
1255   au StatusLine InsertEnter * call Highlight_StatusLine("I")
1256   au StatusLine InsertChange * call Highlight_StatusLine("I")
1257   au StatusLine InsertLeave * call Highlight_StatusLine("i")
1258
1259   if has("signs")
1260     au Signs CursorHoldI * call <SID>Highlight_Signs()
1261     au Signs InsertEnter * call <SID>Highlight_Signs()
1262     au Signs InsertLeave * call <SID>Highlight_Signs()
1263   endif
1264
1265   au Mode BufEnter \[BufExplorer\] call <SID>BufExplorer_Map()
1266 endif
1267
1268 " Limit the size of the popup menu when completing.
1269 if has("insert_expand")
1270   se pumheight=20
1271 endif
1272
1273 " Make diffs vertical by default.
1274 if has("diff")
1275   se diffopt+=vertical
1276 endif
1277
1278 " Set size of numbers column.
1279 if has("linebreak")
1280   se numberwidth=5
1281 endif
1282
1283 " Add "previous tab" mapping as gb.
1284 map gb :tabprevious<CR>:<CR>
1285
1286 " Transparency.
1287 if has("gui_macvim")
1288   se transparency=15
1289 endif
1290
1291 " Yet more GUI options.  Add tabs.
1292 if has("gui")
1293   se go+=e
1294 endif
1295
1296 " Perforce.
1297 let g:p4EnableMenu=1
1298 let g:p4Presets='P4CONFIG'
1299
1300 " BufExplorer.
1301 let g:bufExplorerShowRelativePath=1
1302 let g:bufExplorerSplitOutPathName=0
1303
1304 " NERDcommenter.
1305 let g:NERDSpaceDelims=1
1306 endif "}}}1
1307
1308 " localvimrc.
1309 let g:localvimrc_persistent=1
1310
1311 " Gitv.
1312 let g:Gitv_OpenHorizontal='auto'
1313 let g:Gitv_WipeAllOnClose=1
1314
1315 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1316 " Handle options only available in Vim 7.2 and above.
1317 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1318 if version >= "702" "{{{1
1319 if has("autocmd")
1320   " http://vim.wikia.com/wiki/Highlight_unwanted_spaces
1321   augroup WhitespaceMatch
1322   autocmd!
1323   au Display BufWinEnter * call Extra_Whitespace_Match()
1324   au Display Syntax * call Extra_Whitespace_Match()
1325   au Display BufWinLeave * call clearmatches()
1326   augroup END
1327
1328   fun! Extra_Whitespace_Match() "{{{2
1329     " \s\+            <whitespace>
1330     "            $    <before end of line>
1331     "        \@<!     <unless preceded by>
1332     "     \%#         <cursor position, ie when typing>
1333     let l:pattern = '\s\+\%#\@<!$'
1334     " Don't match single space in first column of diff.
1335     if &ft =~# '^diff$\|git'
1336       "         \@!  <unless also matching>
1337       " \(^\s$\)     <a single whitespace>
1338       let l:pattern = '\(^\s$\)\@!' . l:pattern
1339     endif
1340
1341     let l:hl = 'ctermfg=red guifg=red'
1342     if ! &list
1343       " Underline if we aren't using listchars.
1344       let l:hl = l:hl . ' cterm=underline gui=underline'
1345     endif
1346     highlight clear ExtraWhitespace
1347     exe "highlight ExtraWhitespace " . l:hl
1348     if exists('w:whitespace_match_number')
1349       try
1350         call matchdelete(w:whitespace_match_number)
1351       catch
1352       endtry
1353       call matchadd('ExtraWhitespace', l:pattern, 10, w:whitespace_match_number)
1354     else
1355       let w:whitespace_match_number = matchadd('ExtraWhitespace', l:pattern)
1356     endif
1357   endfun "}}}2
1358
1359   call Extra_Whitespace_Match()
1360 endif
1361
1362 endif "}}}1
1363
1364 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1365 " Handle options only available in Vim 7.3 and above.
1366 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1367 if version >= "703" "{{{1
1368 version 7.3
1369
1370 " Toggle persistent undo with \u.
1371 call Mapping("u", ":call <SID>Cycle_Undo()<CR>:<CR>")
1372 " Remove persistent undo file with \U.
1373 call Mapping("U", ":call <SID>Clear_Undo()<CR>:<CR>")
1374
1375 " Toggle gundo window with \g.
1376 call Mapping("g", ":call gundo#GundoToggle()<CR>:<CR>")
1377
1378 " Use a persistent undo file if it exists.
1379 fun! <SID>Check_Undo() "{{{2
1380   if filereadable(undofile(expand("%")))
1381     setlocal undofile
1382   endif
1383 endfun "}}}2
1384
1385 " Toggle persistent undo for this buffer.
1386 fun! <SID>Cycle_Undo() "{{{2
1387   if has("persistent_undo")
1388     let &undofile = ! &undofile
1389   endif
1390 endfun "}}}2
1391
1392 " Remove the persistent undo file for this buffer.
1393 fun! <SID>Clear_Undo() "{{{2
1394   if ! has("persistent_undo")
1395     return
1396   endif
1397
1398   setlocal noundofile
1399
1400   let l:f = expand("%")
1401   if l:f == ""
1402     return
1403   endif
1404
1405   let l:u = undofile(l:f)
1406   if l:u == ""
1407     return
1408   endif
1409
1410   if ! filereadable(l:u) || ! filewritable(l:u)
1411     return
1412   endif
1413
1414   call delete(l:u)
1415 endfun "}}}2
1416
1417 " Toggle ColorColumn at cursor position.
1418 fun! <SID>Cycle_ColorColumn() "{{{2
1419   if ! has("syntax")
1420     return
1421   endif
1422
1423   let l:cc = &colorcolumn
1424   let l:column = col(".")
1425   let l:re = ",*\\<" . l:column . "\\>"
1426   if l:cc =~# l:re
1427     let l:cc = substitute(l:cc, l:re, "", "g")
1428   else
1429     let l:cc = l:cc . "," . l:column
1430   endif
1431   let &colorcolumn = substitute(l:cc, "^,*", "", "")
1432 endfun "}}}2
1433
1434 if has("syntax")
1435   " Enable showing ColorColumn at cursor position with \CC.
1436   call Mapping("CC", ":call <SID>Cycle_ColorColumn()<CR>:<CR>")
1437   " Remove last shown ColorColumn with \Cc.
1438   call Mapping("Cc", ":let &colorcolumn=substitute(&colorcolumn, \",*[0-9]*$\", \"\", \"\")<CR>:<CR>")
1439   " Remove all ColorColumns with \Cx.
1440   call Mapping("Cx", ":se colorcolumn=<CR>:<CR>")
1441 endif
1442
1443 " Use persistent undo if available.
1444 if has("autocmd")
1445   if has("persistent_undo")
1446     au File BufReadPost * call <SID>Check_Undo()
1447   endif
1448
1449   if has("cursorbind")
1450     au Display WinEnter * if &diff | se cursorbind | endif
1451   endif
1452 endif
1453
1454 " Mapping to reload the gundo window.
1455 if has("autocmd")
1456   au Mode BufEnter * if &ft == "gundo" | try | nnoremap <silent> <buffer> <unique> r :call gundo#GundoToggle()<CR>:call gundo#GundoToggle()<CR> | catch | endtry | endif
1457 endif
1458
1459 endif "}}}1
1460 "
1461 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1462 " Handle options only available in Vim 7.4 and above.
1463 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1464 if version >= "704" "{{{1
1465 version 7.4
1466
1467 if has("syntax")
1468   se cursorline
1469 endif
1470
1471 endif "}}}1
1472
1473 " Resize after startup.
1474 if version >= "500" "{{{1
1475 if has("autocmd")
1476   au Display VimEnter * call Startup_Resize()
1477 endif
1478 endif "}}}1