Show search direction in the statusline.
[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 " Helper for status line.
782 " Show marker if searchforward is unset.
783 fun! Show_SearchForward() "{{{2
784   if version >= "702"
785     if ! v:searchforward
786       if Has_Unicode()
787         return "∆"
788       else
789         return "^"
790       endif
791     endif
792   endif
793   return ""
794 endfun "}}}2
795
796 " Show the status line.
797 fun! Show_StatusLine() "{{{2
798   if ! has("statusline")
799     return
800   endif
801   call Iain_Vars()
802   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_SearchForward()}]%{Show_Alt()}\ '
803   let l:sl3='L:%1*%4.6l%0*/%-4.6L\ C:%1*%3.6c%V%0*\ \|\ %P'
804   let l:hexformat='%b'
805   if b:iainhex
806     let l:hexformat='0\x%02B'
807   endif
808   if b:iainverbose
809     let l:sl1=l:sl1 . v:version . '\ %='
810     let l:sl2=l:hexformat . '\ \|\ P:%4.6o\ '
811   else
812     let l:sl1=l:sl1 . '%='
813     let l:sl2=''
814   endif
815   exec "set statusline=" . l:sl1 . l:sl2 . l:sl3
816 endfun "}}}2
817
818 " Show the status line for the first time.
819 call Show_StatusLine()
820 endif "}}}1
821
822 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
823 " Handle options only available in Vim 6 and above.
824 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
825 if version >= "600" "{{{1
826 version 6.0
827
828 if has("win32") || has("win64")
829   se encoding=utf-8
830 endif
831
832 " Remember quickfix state.
833 if has("quickfix")
834   let g:quickfixing=0
835 endif
836
837 " Set indenting by filetype.
838 filetype indent on
839
840 " Less intrusive syntax highlighting.
841 if has("syntax")
842   " The :syntax enable command tries to source the syntax.vim runtime script.
843   " Parsing this .vimrc will fail if for some reason the runtime doesn't
844   " exist, as could be the case if the binary was installed with no support
845   " files.  GNU On Windows is one example of an incomplete installation.
846   try
847     syn enable
848   catch
849   endtry
850 endif
851
852 " Set colours.
853 if has("gui_running")
854   if has("win32") || has("win64")
855     exe "silent se guifont=DejaVu_Sans_Mono:h10:cANSI"
856   else
857     exe "silent se guifont=DejaVu\\ Sans\\ Mono\\ 10"
858   endif
859 endif
860 if has("gui_running") || &t_Co > 16
861   exe "silent colo iain"
862 endif
863
864 " Ignore whitespace when diffing.
865 if has("diff")
866   se diffopt=filler,iwhite
867 endif
868
869 if has("autocmd")
870   if has("quickfix")
871     " Remember that we are opening the quickfix window.
872     au Mode BufWinEnter quickfix let g:quickfixing=1
873     au Mode BufUnload * if &ft == "qf" | let g:quickfixing=0 | endif
874   endif
875
876   " Allow in-place editing of crontabs.
877   au Mode FileType crontab set backupcopy=yes
878 endif
879
880 " Make * and # work the way you expect in visual mode.
881 vnoremap * y/\V<C-R>=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")<CR><CR>
882 vnoremap # y?\V<C-R>=substitute(escape(@@,"?\\"),"\n","\\\\n","ge")<CR><CR>
883
884 " Set mark and update highlighting.
885 if has("signs")
886   au Signs BufReadPost * call <SID>Highlight_Signs()
887   au Signs CursorHold * call <SID>Highlight_Signs()
888 endif
889
890 " Helper to set buffer variable for a given sign.
891 fun! <SID>Prep_Sign(sign) "{{{2
892   if ! exists("b:sign" . a:sign) || ! g:marksigns
893     exe "let b:sign" . a:sign . "=0"
894    endif
895 endfun "}}}2
896
897 fun! <SID>Place_Sign(number, line, old, name) "{{{2
898   if a:line == a:old
899     return a:old
900   endif
901
902   exe "sign unplace " . (g:firstsign + a:number) . " buffer=" . bufnr("")
903   " Don't place the sign if it would conflict with the last change sign.
904   exe "sign place " . (g:firstsign + a:number) . " line=" . a:line . " name=" . a:name . " buffer=" . bufnr("")
905   return a:line
906 endfun "}}}2
907
908 fun! <SID>Highlight_Signs(...) "{{{2
909   if ! has("signs") || ! g:marksigns || Uncluttered_Buffer()
910     return
911   endif
912
913   let l:signs = g:iainsigns
914   let l:sign = ""
915   let l:i = 0
916   while strlen(l:signs)
917     let l:sign = matchstr(l:signs, '^[A-Za-z]\+\(:.\)*[.=>-][^ ]\+')
918
919     let l:name = substitute(l:sign, '[:.=>-].*', "", "")
920     let l:var = tolower(l:name)
921     let l:sign = substitute(l:sign, '^[A-Za-z]\+', "", "")
922     let l:ascii = matchstr(l:sign, '^:.')
923     let l:mark = substitute(l:sign, '^\(:.\)*[.=>-]', "", "")
924     if strlen(l:ascii)
925       let l:ascii = substitute(l:ascii, '^:', "", "")
926     else
927       let l:ascii = l:mark
928     endif
929     let l:ascii = substitute(l:ascii, '"', '\\"', "")
930
931     if l:ascii == "o"
932       let l:line = "."
933     else
934       let l:line = "'" . l:ascii
935     endif
936
937     call <SID>Prep_Sign(l:var)
938     exe "let " . l:var . " = <SID>Place_Sign(" . l:i . ", line(\"" . l:line . "\"), b:sign" . l:var . ", \"Mark" . l:name . "\")"
939     let l:i = l:i + 1
940
941     let l:signs = substitute(l:signs, '^[^ ]\+ *', "", "")
942   endwhile
943 endfun "}}}2
944
945 " Toggle signs.
946 fun! <SID>Cycle_Signs(resize) "{{{2
947   if ! has("signs")
948     return
949   endif
950   call Iain_Vars()
951   let g:marksigns = ! g:marksigns
952
953   " Retrofit arrays on to Vim 6.
954   if ! exists("g:iainsigns")
955     " Signs are defined in g:iainsigns.  The syntax is as follows:
956     "
957     " Sign ::= Name (':' Mark)* Type Symbol
958     " Type ::= '=' | '-' | '.'
959     "
960     " Signs with Type '=' will be highlighted with the MarkSign group.
961     " Signs with Type '-' will be highlighted with the MarkLine group.
962     " Signs with Type '.' will be highlighted with the MarkDot group.
963     " Signs with Type '>' will be highlighted with the MarkArrow group.
964     " Define the Mark where Symbol is not also the mark name, eg "']".
965     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"
966     if Has_Unicode()
967       let g:iainsigns = g:iainsigns . " Quote:\"=” Dash:'=’ Caret:^.ʌ Dot:..•"
968       if version < "704"
969         let g:iainsigns = g:iainsigns ." Cursor:o>▶"
970       endif
971     else
972       let g:iainsigns = g:iainsigns . " Quote=\" Dash=' Caret.^ Dot:..*"
973       if version < "704"
974         let g:iainsigns = g:iainsigns ." Cursor>o"
975       endif
976     endif
977   endif
978
979   if g:marksigns
980     " Signs to highlight marks.
981     " Syntax won't work properly in Vim 6.
982     let l:signs = g:iainsigns
983     let l:sign = ""
984     while strlen(l:signs)
985       let l:sign = matchstr(l:signs, '^[A-Za-z]\+\(:.\)*[.=>-][^ ]\+')
986
987       let l:name = substitute(l:sign, '[:.=>-].*', "", "")
988       let l:sign = substitute(l:sign, '^[A-Za-z]\+', "", "")
989       let l:ascii = matchstr(l:sign, '^:.')
990       let l:mark = substitute(l:sign, '^\(:.\)*[.=>-]', "", "")
991       if strlen(l:ascii)
992         let l:ascii = substitute(l:ascii, '^:', "", "")
993         let l:ascii = matchstr(l:ascii, '^.')
994       else
995         let l:ascii = l:mark
996       endif
997       let l:ascii = substitute(l:ascii, '"', '\\"', "")
998       let l:type = substitute(l:sign, '^:.', "", "")
999       let l:type = matchstr(l:type, '^.')
1000
1001       let l:hl = ""
1002       if l:type == "="
1003         let l:hl = "texthl=MarkSign text="
1004       elseif l:type == "."
1005         let l:hl = "texthl=MarkDot text="
1006       elseif l:type == "-"
1007         let l:hl = "texthl=MarkLine text="
1008       elseif l:type == ">"
1009         let l:hl = "texthl=MarkArrow text="
1010       endif
1011
1012       exe "sign define Mark" . l:name . " " . l:hl . l:mark
1013
1014       let l:signs = substitute(l:signs, '^[^ ]\+ *', "", "")
1015     endwhile
1016
1017     if a:resize
1018       call Resize_Columns("+", 2)
1019     endif
1020     call <SID>Highlight_Signs()
1021   else
1022     let l:i = 0
1023     while l:i < 25
1024       exe "sign unplace " . (g:firstsign + l:i)
1025       let l:i = l:i + 1
1026     endwhile
1027
1028     let l:signs = g:iainsigns
1029     let l:sign = ""
1030     while strlen(l:signs)
1031       let l:sign = matchstr(l:signs, '^[A-Za-z]\+')
1032
1033       exe "sign undefine Mark" . l:sign
1034       call <SID>Prep_Sign(tolower(l:sign))
1035       let l:signs = substitute(l:signs, '^[^ ]\+ *', "", "")
1036     endwhile
1037
1038     if a:resize
1039       call Resize_Columns("-", 2)
1040     endif
1041   endif
1042 endfun "}}}2
1043
1044 " Change list mode.
1045 fun! Cycle_List() "{{{2
1046   " Pretty UTF-8 listchars.
1047   if Has_Unicode()
1048     let basic='tab:»·,trail:…,extends:«,precedes:»'
1049     let eol='eol:¶'
1050     if version >= "700"
1051       let basic=basic . ',nbsp:•'
1052     endif
1053   else
1054     let basic='tab:\\_,trail:_,extends:<,precedes:>'
1055     let eol='eol:$'
1056     if version >= "700"
1057       let basic=basic . ',nbsp:+'
1058     endif
1059   endif
1060   call Iain_Vars()
1061   let w:iainlist = w:iainlist + 1
1062   if w:iainlist > 2
1063     let w:iainlist = 0
1064   endif
1065   if w:iainlist == 0
1066     setlocal nolist
1067   elseif w:iainlist == 1
1068     exec "setlocal lcs=" . basic
1069     setlocal list
1070   else
1071     exec "setlocal lcs=" . basic . "," . eol
1072     setlocal list
1073   endif
1074
1075   call Resize_Columns(Extra_Columns("list", "iainlist", " == 2"), 1)
1076   call Extra_Whitespace_Match()
1077 endfun "}}}2
1078
1079 " Cycle between hex and decimal display of toolbar stuff.
1080 fun! Cycle_HexStatusLine() "{{{2
1081   call Iain_Vars()
1082   let b:iainhex = ! b:iainhex
1083   call Show_StatusLine()
1084 endfun "}}}2
1085
1086 " Cycle verbose display of toolbar stuff.
1087 fun! Cycle_VerboseStatusLine() "{{{2
1088   call Iain_Vars()
1089   let b:iainverbose = ! b:iainverbose
1090   call Show_StatusLine()
1091 endfun "}}}2
1092
1093 " Toggle quickfix window.
1094 fun! Cycle_Quickfix() "{{{2
1095   if ! has("quickfix")
1096     return
1097   endif
1098   if g:quickfixing == 1
1099     cclose
1100     let g:quickfixing=0
1101   else
1102     copen
1103   endif
1104 endfun "}}}2
1105
1106 " Toggle showing alternate buffer information.
1107 fun! Cycle_Alt() "{{{2
1108   call Iain_Vars()
1109   let b:iainalt = ! b:iainalt
1110   call Show_StatusLine()
1111 endfun "{{{2
1112
1113 " To be overridden later if applicable.
1114 fun! Extra_Whitespace_Match() "{{{2
1115   " NOP.
1116 endfun "}}}2
1117
1118 " Swap hex/decimal statusline with \x.
1119 call Mapping("x", ":call Cycle_HexStatusLine()<CR>:<CR>")
1120 " Change statusline verbosity with \v.
1121 call Mapping("V", ":call Cycle_VerboseStatusLine()<CR>:<CR>")
1122 " Cycle list styles with \l.
1123 call Mapping("l", ":call Cycle_List()<CR>:<CR>")
1124 " Toggle tags with \t.
1125 call Mapping("t", ":Tlist<CR>")
1126 " Change foldmethod with \f.
1127 call Mapping("f", ":se foldenable!<CR>:<CR>")
1128 " Toggle quickfix window with \q.
1129 call Mapping("q", ":call Cycle_Quickfix()<CR>:<CR>")
1130 " Rerun filetype detection with \s.  The s is for syntax, as this will be
1131 " updated as a side-effect.
1132 call Mapping("S", ":filetype detect<CR>:<CR>")
1133 " Toggle marks with \m.
1134 call Mapping("m", ":call <SID>Cycle_Signs(1)<CR>:<CR>")
1135
1136 if has("autocmd")
1137   " Show signs by default.
1138   au Display VimEnter * call <SID>Cycle_Signs(0)
1139 endif
1140 endif "}}}1
1141
1142 " move.
1143 nmap <A-u> <Plug>MoveLineHalfPageUp
1144 nmap <A-d> <Plug>MoveLineHalfPageDown
1145 vmap <A-u> <Plug>MoveBlockHalfPageUp
1146 vmap <A-d> <Plug>MoveBlockHalfPageDown
1147
1148 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1149 " Handle options only available in Vim 7 and above.
1150 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1151 if version >= "700" "{{{1
1152 version 7.0
1153
1154 " Helper to show tab name.
1155 fun! <SID>TabName(label, gui) "{{{2
1156   let l:label = a:label
1157   if l:label == ""
1158     let l:label = "No Name"
1159     if a:gui
1160       let l:label = "[" . l:label . "]"
1161     endif
1162   else
1163     let l:label = fnamemodify(l:label, ":t")
1164     if strlen(l:label) >= 18
1165       let l:label = l:label[0:17] . ".."
1166     endif
1167   endif
1168   return l:label
1169 endfun "}}}2
1170
1171 " Find out if any buffer was modified.
1172 fun! <SID>TabModified(buflist) "{{{2
1173   let l:i = 0
1174   while l:i < len(a:buflist)
1175     if getbufvar(a:buflist[l:i], "&modified") == 1
1176       return "+"
1177     endif
1178     let l:i = l:i + 1
1179   endwhile
1180   return ""
1181 endfun "}}}2
1182
1183 " Tab line.
1184 fun! Show_TabLine() "{{{2
1185   let l:s = "%#TabLineFill#Tabs:"
1186
1187   let l:i = 0
1188   while l:i < tabpagenr("$")
1189     let l:i = l:i + 1
1190     " Get the label.
1191     let l:buflist = tabpagebuflist(l:i)
1192     let l:winnr = tabpagewinnr(l:i)
1193     let l:n = tabpagewinnr(l:i, "$")
1194     let l:label = <SID>TabName(bufname(l:buflist[l:winnr - 1]), 0)
1195     let l:modified = <SID>TabModified(l:buflist)
1196
1197     " Choose highlighting.
1198     if l:i == tabpagenr()
1199       let l:s .= "%#TabLineSel#[" . l:n . l:modified . " " . l:label . "]"
1200     else
1201       let l:s .= "%#TabLine# " . l:n . l:modified . " " . l:label . " "
1202     endif
1203   endwhile
1204
1205   " Padding.
1206   let l:s .= "%#TabLine#%T"
1207   return l:s
1208 endfun "}}}2
1209
1210 " Per tab label for the GUI.
1211 fun! Show_GUITabLine() "{{{2
1212   let l:buflist = tabpagebuflist(v:lnum)
1213   let l:winnr = tabpagewinnr(v:lnum)
1214   let l:s = tabpagewinnr(v:lnum, "$")
1215   let l:label = <SID>TabName(bufname(l:buflist[l:winnr - 1]), 1)
1216   let l:modified = <SID>TabModified(l:buflist)
1217
1218   let l:s .= l:modified . " " . l:label
1219   return l:s
1220 endfun "}}}2
1221
1222 " Handle searching in a BufExplorer window.
1223 fun! <SID>BufExplorer_Search(n) "{{{2
1224   if a:n == 0
1225     let l:re = '^  *\d %'
1226   else
1227     let l:re = "^ *" . a:n
1228   endif
1229
1230   " Find matching line.
1231   let l:line = search(l:re, 'w')
1232   if ! l:line
1233     return
1234   endif
1235
1236   if a:n == 0
1237     return
1238   endif
1239
1240   " Peek ahead to the next matching line.
1241   let l:next = search(l:re, 'w')
1242
1243   " Select the buffer if the match is unambiguous.
1244   if l:next == l:line
1245     exe "normal \<CR>"
1246     return
1247   endif
1248
1249   " Go back.
1250   call cursor(l:line, 0)
1251 endfun! "}}}2
1252
1253 " Entering a BufExplorer window.
1254 fun! <SID>BufExplorer_Map() "{{{2
1255   for l:n in [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
1256     exec "nnoremap <buffer> <silent>" . l:n . " :call <SID>BufExplorer_Search(" . l:n . ")<CR>"
1257   endfor
1258 endfun "}}}2
1259
1260 if has("windows")
1261   se tabline=%!Show_TabLine()
1262   se guitablabel=%!Show_GUITabLine()
1263 endif
1264
1265 if has("autocmd")
1266   au StatusLine CursorHoldI * call Highlight_StatusLine("H")
1267   au StatusLine CursorMovedI * call Highlight_StatusLine("h")
1268   au StatusLine FocusGained * call Highlight_StatusLine("F")
1269   au StatusLine FocusLost * call Highlight_StatusLine("f")
1270   au StatusLine InsertEnter * call Highlight_StatusLine("I")
1271   au StatusLine InsertChange * call Highlight_StatusLine("I")
1272   au StatusLine InsertLeave * call Highlight_StatusLine("i")
1273
1274   if has("signs")
1275     au Signs CursorHoldI * call <SID>Highlight_Signs()
1276     au Signs InsertEnter * call <SID>Highlight_Signs()
1277     au Signs InsertLeave * call <SID>Highlight_Signs()
1278   endif
1279
1280   au Mode BufEnter \[BufExplorer\] call <SID>BufExplorer_Map()
1281 endif
1282
1283 " Limit the size of the popup menu when completing.
1284 if has("insert_expand")
1285   se pumheight=20
1286 endif
1287
1288 " Make diffs vertical by default.
1289 if has("diff")
1290   se diffopt+=vertical
1291 endif
1292
1293 " Set size of numbers column.
1294 if has("linebreak")
1295   se numberwidth=5
1296 endif
1297
1298 " Add "previous tab" mapping as gb.
1299 map gb :tabprevious<CR>:<CR>
1300
1301 " Transparency.
1302 if has("gui_macvim")
1303   se transparency=15
1304 endif
1305
1306 " Yet more GUI options.  Add tabs.
1307 if has("gui")
1308   se go+=e
1309 endif
1310
1311 " Perforce.
1312 let g:p4EnableMenu=1
1313 let g:p4Presets='P4CONFIG'
1314
1315 " BufExplorer.
1316 let g:bufExplorerShowRelativePath=1
1317 let g:bufExplorerSplitOutPathName=0
1318
1319 " NERDcommenter.
1320 let g:NERDSpaceDelims=1
1321 endif "}}}1
1322
1323 " localvimrc.
1324 let g:localvimrc_persistent=1
1325
1326 " Gitv.
1327 let g:Gitv_OpenHorizontal='auto'
1328 let g:Gitv_WipeAllOnClose=1
1329
1330 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1331 " Handle options only available in Vim 7.2 and above.
1332 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1333 if version >= "702" "{{{1
1334 if has("autocmd")
1335   " http://vim.wikia.com/wiki/Highlight_unwanted_spaces
1336   augroup WhitespaceMatch
1337   autocmd!
1338   au Display BufWinEnter * call Extra_Whitespace_Match()
1339   au Display Syntax * call Extra_Whitespace_Match()
1340   au Display BufWinLeave * call clearmatches()
1341   augroup END
1342
1343   fun! Extra_Whitespace_Match() "{{{2
1344     " \s\+            <whitespace>
1345     "            $    <before end of line>
1346     "        \@<!     <unless preceded by>
1347     "     \%#         <cursor position, ie when typing>
1348     let l:pattern = '\s\+\%#\@<!$'
1349     " Don't match single space in first column of diff.
1350     if &ft =~# '^diff$\|git'
1351       "         \@!  <unless also matching>
1352       " \(^\s$\)     <a single whitespace>
1353       let l:pattern = '\(^\s$\)\@!' . l:pattern
1354     endif
1355
1356     let l:hl = 'ctermfg=red guifg=red'
1357     if ! &list
1358       " Underline if we aren't using listchars.
1359       let l:hl = l:hl . ' cterm=underline gui=underline'
1360     endif
1361     highlight clear ExtraWhitespace
1362     exe "highlight ExtraWhitespace " . l:hl
1363     if exists('w:whitespace_match_number')
1364       try
1365         call matchdelete(w:whitespace_match_number)
1366       catch
1367       endtry
1368       call matchadd('ExtraWhitespace', l:pattern, 10, w:whitespace_match_number)
1369     else
1370       let w:whitespace_match_number = matchadd('ExtraWhitespace', l:pattern)
1371     endif
1372   endfun "}}}2
1373
1374   call Extra_Whitespace_Match()
1375 endif
1376
1377 endif "}}}1
1378
1379 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1380 " Handle options only available in Vim 7.3 and above.
1381 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1382 if version >= "703" "{{{1
1383 version 7.3
1384
1385 " Toggle persistent undo with \u.
1386 call Mapping("u", ":call <SID>Cycle_Undo()<CR>:<CR>")
1387 " Remove persistent undo file with \U.
1388 call Mapping("U", ":call <SID>Clear_Undo()<CR>:<CR>")
1389
1390 " Toggle gundo window with \g.
1391 call Mapping("g", ":call gundo#GundoToggle()<CR>:<CR>")
1392
1393 " Use a persistent undo file if it exists.
1394 fun! <SID>Check_Undo() "{{{2
1395   if filereadable(undofile(expand("%")))
1396     setlocal undofile
1397   endif
1398 endfun "}}}2
1399
1400 " Toggle persistent undo for this buffer.
1401 fun! <SID>Cycle_Undo() "{{{2
1402   if has("persistent_undo")
1403     let &undofile = ! &undofile
1404   endif
1405 endfun "}}}2
1406
1407 " Remove the persistent undo file for this buffer.
1408 fun! <SID>Clear_Undo() "{{{2
1409   if ! has("persistent_undo")
1410     return
1411   endif
1412
1413   setlocal noundofile
1414
1415   let l:f = expand("%")
1416   if l:f == ""
1417     return
1418   endif
1419
1420   let l:u = undofile(l:f)
1421   if l:u == ""
1422     return
1423   endif
1424
1425   if ! filereadable(l:u) || ! filewritable(l:u)
1426     return
1427   endif
1428
1429   call delete(l:u)
1430 endfun "}}}2
1431
1432 " Toggle ColorColumn at cursor position.
1433 fun! <SID>Cycle_ColorColumn() "{{{2
1434   if ! has("syntax")
1435     return
1436   endif
1437
1438   let l:cc = &colorcolumn
1439   let l:column = col(".")
1440   let l:re = ",*\\<" . l:column . "\\>"
1441   if l:cc =~# l:re
1442     let l:cc = substitute(l:cc, l:re, "", "g")
1443   else
1444     let l:cc = l:cc . "," . l:column
1445   endif
1446   let &colorcolumn = substitute(l:cc, "^,*", "", "")
1447 endfun "}}}2
1448
1449 if has("syntax")
1450   " Enable showing ColorColumn at cursor position with \CC.
1451   call Mapping("CC", ":call <SID>Cycle_ColorColumn()<CR>:<CR>")
1452   " Remove last shown ColorColumn with \Cc.
1453   call Mapping("Cc", ":let &colorcolumn=substitute(&colorcolumn, \",*[0-9]*$\", \"\", \"\")<CR>:<CR>")
1454   " Remove all ColorColumns with \Cx.
1455   call Mapping("Cx", ":se colorcolumn=<CR>:<CR>")
1456 endif
1457
1458 " Use persistent undo if available.
1459 if has("autocmd")
1460   if has("persistent_undo")
1461     au File BufReadPost * call <SID>Check_Undo()
1462   endif
1463
1464   if has("cursorbind")
1465     au Display WinEnter * if &diff | se cursorbind | endif
1466   endif
1467 endif
1468
1469 " Mapping to reload the gundo window.
1470 if has("autocmd")
1471   au Mode BufEnter * if &ft == "gundo" | try | nnoremap <silent> <buffer> <unique> r :call gundo#GundoToggle()<CR>:call gundo#GundoToggle()<CR> | catch | endtry | endif
1472 endif
1473
1474 endif "}}}1
1475 "
1476 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1477 " Handle options only available in Vim 7.4 and above.
1478 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
1479 if version >= "704" "{{{1
1480 version 7.4
1481
1482 if has("syntax")
1483   se cursorline
1484 endif
1485
1486 endif "}}}1
1487
1488 " Resize after startup.
1489 if version >= "500" "{{{1
1490 if has("autocmd")
1491   au Display VimEnter * call Startup_Resize()
1492 endif
1493 endif "}}}1