1 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
2 " Multi-version vimrc compatible with version 4 and above. vim:set fdm=marker:
3 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
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.
9 " Vim 4 complains if version isn't set in the configuration file.
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 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
18 " No compatibility mode.
23 se rtp=~/.vim,$VIMRUNTIME
28 " And use spaces not tabs.
30 " And << and >> indent by 2.
32 " Backspace deletes full tab width at the start of a line.
35 " Allow backspace to delete before start of line.
38 " Don't jump to the start of the line when using H, L etc.
43 " Show partial commands in the ruler.
45 " And always show the status line.
50 se cinkeys=0{,0},0),:,!^F,o,O,e
56 " Don't be bugged by messages at the bottom of the screen.
62 " Case-insensitive search.
64 " But override by typing capitals.
67 " Look for ctags in home directory first.
68 se tags=~/.tags,./tags,tags
70 " Don't timeout waiting to interpet, eg, <ESC>OA as an escape code.
73 " Use ^B to search backward when completing.
75 " Use ^L to show matching completions but don't select one.
76 inoremap <C-l> <C-n><C-p>
83 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
84 " Handle options only available in Vim 5 and above.
85 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
86 if version >= "500" "{{{1
89 " Tell Vim we use dark backgrounds in our terminals.
90 if ! has("gui_running")
94 " Allow mouse use in a terminal but only if it can work.
95 if has("xterm_clipboard")
99 " Update more quickly. For use with sign highlighting as polling for
100 " CursorMove makes redrawing slow.
105 " Enable tab-completion prompting for commands.
107 " Don't list object files when globbing files to load.
108 se wildignore+=*.o,*.obj
109 " So there's no need to assign them low priority.
110 se suffixes-=*.o,*.obj
112 " Save sessions in UNIX format with / as file separator. This is
116 " How often do we need to use ^A/^X on octals?
119 " Nuke any pre-existing autocommands.
132 " Save the current window width so we can restore it when we quit.
133 if ! exists("g:oldcols")
134 let g:oldcols=&columns
137 " More GUI options. Add icon and tearoffs.
141 " Allow dynamic window resize even if we aren't in an xterm.
142 se t_WS=
\e[8;%p1%d;%p2%dt
144 " Highlight search results.
147 " Set graphical window title.
148 se titlestring=%{Show_TitleString()}
150 " Syntax highlighting. New versions will use syn enable instead.
160 " Helper to initialise a variable.
161 fun! Prep_Var(var, value) "{{{2
165 exe "let " . a:var . "=" . a:value
168 " Set up our variables.
169 fun! Iain_Vars() "{{{2
170 call Prep_Var("w:iainlist", 0)
171 call Prep_Var("b:iainhex", 0)
172 call Prep_Var("b:iainverbose", 0)
173 " Window Flags: (F)ocused, (I)nsert mode, Cursor (H)old.
174 call Prep_Var("b:iainstatus", "'Fih'")
175 call Prep_Var("g:iainextracolumnsnumber", "''")
176 call Prep_Var("g:iainextracolumnslist", "''")
177 call Prep_Var("b:iaincul", 0)
179 call Prep_Var("g:marksigns", 0)
180 call Prep_Var("g:firstsign", 100)
184 " Helper for status line.
185 " Show space, underscore or dollar sign depending on list mode.
186 fun! Show_List() "{{{2
191 elseif <SID>Has_Unicode()
208 " Helper for status line.
209 " Show c or C to denote case-sensitivity.
210 fun! Show_Case() "{{{2
218 " Helper for status line.
219 " Show the size of the tabstop.
220 fun! Show_Tabstop() "{{{2
224 " Helper for status line.
225 " Show p when paste mode is on.
226 fun! Show_Paste() "{{{2
234 " Show the window title.
235 fun! Show_TitleString() "{{{2
239 " Vim 5 doesn't have printf.
242 let l:ts1=" " . l:ts1
244 let l:ts1=l:ts1 . ": " . expand('%t')
246 let l:ts1=l:ts1 . " (" . getcwd() . ")"
247 if has("clientserver")
248 let l:ts1=l:ts1 . " " . v:servername
253 " Show the status line.
254 fun! Show_StatusLine() "{{{2
256 let l:sl1='%2n\:\ %<%1*%f%0*\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ '
257 let l:sl3='L:%1*%4.6l%0*/%-4.6L\ C:%1*%3.6c%0*\ \|\ %P'
260 let l:hexformat='0\x%02B'
263 let l:sl1=l:sl1 . v:version . '\ %='
264 let l:sl2=l:hexformat . '\ \|\ P:%4.6o\ '
266 let l:sl1=l:sl1 . '%='
269 exec "set statusline=" . l:sl1 . l:sl2 . l:sl3
272 " Toggle case-sensitivity.
273 fun! Invert_Case() "{{{2
277 " Grow or shrink the window size.
278 fun! Resize_Columns(op, ...) "{{{2
284 " Vim 5 hardcodes the size of numbers column to 8.
286 let l:columns = &numberwidth
294 exe "let l:resize=" . &columns . a:op . l:columns
295 let l:resize = "se columns=" . l:resize
297 " HACK: Inside screen there is an extra line for the status bar. Vim
298 " manages the resize by sending an escape sequence to set the number of
299 " lines and number of columns in one action. To do this it will first query
300 " the number of lines and then set <same number of lines> by <new number of
301 " columns>. Because of the extra line for the status bar this results in
302 " the real terminal being shrunk by a line. We ask for the terminal to grow
303 " by a line so it ends up actually being the same.
304 if &term =~ '^screen'
305 let l:resize = l:resize . " lines=" . (&lines + 1)
311 " Set extra columns depending on window status.
312 fun! Extra_Columns(extra, var, ...) "{{{2
313 " Vim 6 doesn't have winnr("$"). Determine which windows are open
314 " ourselves by using :windo to incremement a counter. As Vim 5
315 " doesn't have :windo we require Vim 6 for this.
320 " Remember which window we're in.
321 let l:winnr = winnr()
322 let l:num_windows = 0
323 windo let l:num_windows = l:num_windows + 1
324 " Switch back to the window we were in.
325 exe l:winnr . "wincmd w"
332 let l:condition = a:1
338 while l:n < l:num_windows
339 " If window w exists then getwinvar(w, "&modified") will be 0 or 1.
340 if getwinvar(l:i, "&modified") =~ '^\d'
344 exe "if getwinvar(" . l:i . ", '" . a:var . "') " . l:condition . " | let l:val = 1 | endif"
346 exe "let l:windows = '" . l:windows . ":" . l:i . "'"
352 let l:extra = "g:iainextracolumns" . a:extra
353 exe "let l:val = " . l:extra
354 exe "let " . l:extra . " = '" . l:windows . "'"
356 if l:windows == l:val
367 " Toggle number display.
368 fun! Number(resize) "{{{2
370 let &number = ! &number
372 " Ensure we keep track of any extra columns even if we aren't resizing.
373 " This prevents confusion when number is set at startup.
374 let l:extra = Extra_Columns("number", "&number")
377 call Resize_Columns(l:extra)
381 " Restore window size.
382 au Display VimLeave * if exists("g:oldcols") | call Resize_Columns("-", (&columns - g:oldcols)) | endif
385 au Mode BufEnter * if &ft == "make" | call MakeMode_map() | endif
386 au Mode BufLeave * if &ft == "make" | call MakeMode_unmap() | endif
388 " Entering Make mode.
389 fun! MakeMode_map() "{{{2
398 fun! MakeMode_unmap() "{{{2
404 " Show the status line for the first time.
405 call Show_StatusLine()
407 " Function to create mappings with either a hardcoded \ or <Leader>.
408 fun! Mapping(keysequence,mapping) "{{{2
410 exec "map \\" . a:keysequence . " " . a:mapping
412 exec "map <Leader>" . a:keysequence . " " . a:mapping
416 " Use - and = to create underlines.
417 call Mapping("-", "yyp:s/./-/g<RETURN>:let @/=''<RETURN>:<RETURN>")
418 call Mapping("=", "yyp:s/./=/g<RETURN>:let @/=''<RETURN>:<RETURN>")
420 " Change to ts=2 with \2.
421 call Mapping("2", ":se ts=2<CR>:<CR>")
422 " Change to ts=4 with \4.
423 call Mapping("4", ":se ts=4<CR>:<CR>")
424 " Change to ts=8 with \8.
425 call Mapping("8", ":se ts=8<CR>:<CR>")
426 " Change to ts=16 with \6.
427 call Mapping("6", ":se ts=16<CR>:<CR>")
428 " Change to ts=32 with \3.
429 call Mapping("3", ":se ts=32<CR>:<CR>")
430 " Toggle paste mode with \p.
431 call Mapping("p", ":se paste!<CR>:<CR>")
432 " Swap case-sensitivity with \c.
433 call Mapping("C", ":call Invert_Case()<CR>:<CR>")
434 " Change number mode with \n.
435 call Mapping("n", ":call Number(1)<CR>:<CR>")
436 " Expand or shrink window size with \> and \<.
437 call Mapping(">", ":call Resize_Columns('+')<CR>:<CR>")
438 call Mapping("<", ":call Resize_Columns('-')<CR>:<CR>")
439 " Clear search pattern with \/.
440 call Mapping("/", ":let @/=\"\"<CR>:<CR>")
442 " Forget the Ex mode mapping.
445 " Vim tip 99: What's the highlighting group under the cursor?
446 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>")
448 fun! Uncluttered_Buffer() "{{{2
449 if exists("uncluttered_buffer")
450 if uncluttered_buffer == 1
469 if &ft == 'gitcommit'
476 fun! Startup_Resize() "{{{2
479 " Resize for numbers.
482 let l:columns = &numberwidth
492 let l:columns = l:columns + 2
497 if g:oldcols < (80 + l:columns)
498 call Resize_Columns("+", l:columns)
502 " Change status bar colour when various things happen.
503 " Flags: H/h: Cursor held/moved.
504 " F/f: Focus gained/lost.
505 " I/i: Insert mode entered/left.
506 fun! Highlight_StatusLine(flag) "{{{2
507 " Get current status.
510 " Change the status based on the flag. XXX: Does Vim let us to do flags?
513 let b:iainstatus = substitute(b:iainstatus, a:flag, a:flag, "")
516 let l:normalcolour = "darkblue"
517 let l:editingcolour = "darkmagenta"
518 let l:warningcolour = "darkred"
519 let l:readonlycolour = "red"
522 let l:colour = l:normalcolour
523 " Maybe override depending on status.
524 if b:iainstatus =~# "H"
525 if b:iainstatus =~# "I"
526 " Held in insert mode. Add extra highlight if we don't have focus.
527 if b:iainstatus =~# "f"
528 let l:colour = l:warningcolour
530 let l:colour = l:editingcolour
534 if b:iainstatus =~# "I"
535 " Regular insert mode.
536 let l:colour = l:editingcolour
540 " Override again if readonly.
541 if l:colour != l:normalcolour
542 if getbufvar("", "&ro")
543 let l:colour = l:readonlycolour
547 let l:termcolour = Iain_Colour(l:colour)
549 exec "highlight StatusLine gui=none term=none cterm=none guifg=white guibg=" . l:colour . " ctermfg=white ctermbg=" . l:termcolour
550 exec "highlight User1 gui=bold term=bold cterm=bold guifg=white guibg=" . l:colour . " ctermfg=white ctermbg=" . l:termcolour
553 fun! Iain_Colour(colour) "{{{2
555 if a:colour == "darkblue"
557 elseif a:colour == "darkmagenta"
559 elseif a:colour == "darkred"
561 elseif a:colour == "red"
565 if a:colour == "darkblue"
567 elseif a:colour == "darkmagenta"
569 elseif a:colour == "darkred"
571 elseif a:colour == "red"
579 au StatusLine VimEnter * call Highlight_StatusLine("")
581 " Show numbers by default.
582 au Display VimEnter * if ! Uncluttered_Buffer() | call Number(0) | endif
584 " Position the compview plugin window.
585 au Display BufEnter -SearchResults- set buftype=nowrite | set nonumber | wincmd J
588 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
589 " Handle options only available in Vim 6 and above.
590 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
591 if version >= "600" "{{{1
598 " Remember quickfix state.
601 " Set indenting by filetype.
604 " Less intrusive syntax highlighting.
608 if has("gui_running")
610 silent se guifont=DejaVu_Sans_Mono:h10:cANSI
612 silent se guifont=DejaVu\ Sans\ Mono\ 10
615 if has("gui_running") || &t_Co > 16
619 " Ignore whitespace when diffing.
620 se diffopt=filler,iwhite
622 " Expand window when doing a vertical diff.
625 let &columns = &columns * 2
629 " Remember that we are opening the quickfix window.
630 au Mode BufWinEnter quickfix let g:quickfixing=1
631 au Mode BufUnload * if &ft == "qf" | let g:quickfixing=0 | endif
633 " Allow in-place editing of crontabs.
634 au Mode FileType crontab set backupcopy=yes
636 " Make * and # work the way you expect in visual mode.
637 vnoremap * y/\V<C-R>=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")<CR><CR>
638 vnoremap # y?\V<C-R>=substitute(escape(@@,"?\\"),"\n","\\\\n","ge")<CR><CR>
640 " Set mark and update highlighting.
642 au Signs BufReadPost * call <SID>Highlight_Signs()
643 au Signs CursorHold * call <SID>Highlight_Signs()
646 " Helper to set buffer variable for a given sign.
647 fun! <SID>Prep_Sign(sign) "{{{2
648 if ! exists("b:sign" . a:sign) || ! g:marksigns
649 exe "let b:sign" . a:sign . "=0"
653 fun! <SID>Prep_Signs() "{{{2
654 call <SID>Prep_Sign("dot")
655 call <SID>Prep_Sign("dash")
656 call <SID>Prep_Sign("quote")
657 call <SID>Prep_Sign("caret")
658 call <SID>Prep_Sign("less")
659 call <SID>Prep_Sign("greater")
660 call <SID>Prep_Sign("left")
661 call <SID>Prep_Sign("right")
662 call <SID>Prep_Sign("squareleft")
663 call <SID>Prep_Sign("squareright")
664 call <SID>Prep_Sign("braceleft")
665 call <SID>Prep_Sign("braceright")
666 call <SID>Prep_Sign("a")
667 call <SID>Prep_Sign("b")
668 call <SID>Prep_Sign("c")
669 call <SID>Prep_Sign("d")
670 call <SID>Prep_Sign("e")
671 call <SID>Prep_Sign("f")
672 call <SID>Prep_Sign("A")
673 call <SID>Prep_Sign("B")
674 call <SID>Prep_Sign("C")
675 call <SID>Prep_Sign("D")
676 call <SID>Prep_Sign("E")
677 call <SID>Prep_Sign("F")
680 fun! <SID>Place_Sign(number, line, old, name) "{{{2
685 exe "sign unplace " . (g:firstsign + a:number) . " buffer=" . bufnr("")
686 " Don't place the sign if it would conflict with the last change sign.
687 exe "sign place " . (g:firstsign + a:number) . " line=" . a:line . " name=" . a:name . " buffer=" . bufnr("")
691 fun! <SID>Highlight_Signs(...) "{{{2
692 if ! has("signs") || ! g:marksigns || Uncluttered_Buffer()
696 call <SID>Prep_Signs()
698 let b:signdot = <SID>Place_Sign(0, line("'."), b:signdot, "MarkDot")
699 let b:signdash = <SID>Place_Sign(1, line("''"), b:signdash, "MarkDash")
700 let b:signquote = <SID>Place_Sign(2, line("'\""), b:signquote, "MarkQuote")
701 let b:signcaret = <SID>Place_Sign(3, line("'^"), b:signcaret, "MarkCaret")
702 let b:signless = <SID>Place_Sign(4, line("'<"), b:signless, "MarkLess")
703 let b:signgreater = <SID>Place_Sign(5, line("'>"), b:signgreater, "MarkGreater")
704 let b:signleft = <SID>Place_Sign(6, line("'("), b:signleft, "MarkLeft")
705 let b:signright = <SID>Place_Sign(7, line("')"), b:signright, "MarkRight")
706 let b:signsquareleft = <SID>Place_Sign(8, line("'["), b:signsquareleft, "MarkSquareLeft")
707 let b:signsquareright = <SID>Place_Sign(9, line("']"), b:signsquareright, "MarkSquareRight")
708 let b:signbraceleft = <SID>Place_Sign(10, line("'{"), b:signbraceleft, "MarkBraceLeft")
709 let b:signbraceright = <SID>Place_Sign(11, line("'}"), b:signbraceright, "MarkBraceRight")
711 let b:signa = <SID>Place_Sign(12, line("'a"), b:signa, "Marka")
712 let b:signb = <SID>Place_Sign(13, line("'b"), b:signb, "Markb")
713 let b:signc = <SID>Place_Sign(15, line("'c"), b:signc, "Markc")
714 let b:signd = <SID>Place_Sign(16, line("'d"), b:signd, "Markd")
715 let b:signe = <SID>Place_Sign(17, line("'e"), b:signe, "Marke")
716 let b:signf = <SID>Place_Sign(18, line("'f"), b:signf, "Markf")
717 let b:signA = <SID>Place_Sign(19, line("'A"), b:signA, "MarkA")
718 let b:signB = <SID>Place_Sign(20, line("'B"), b:signB, "MarkB")
719 let b:signC = <SID>Place_Sign(21, line("'C"), b:signC, "MarkC")
720 let b:signD = <SID>Place_Sign(22, line("'D"), b:signD, "MarkD")
721 let b:signE = <SID>Place_Sign(23, line("'E"), b:signE, "MarkE")
722 let b:signF = <SID>Place_Sign(24, line("'F"), b:signF, "MarkF")
726 fun! <SID>Cycle_Signs(resize) "{{{2
731 let g:marksigns = ! g:marksigns
734 " Signs to highlight marks.
735 " Syntax won't work properly in Vim 6.
736 if <SID>Has_Unicode()
737 sign define MarkDash text=’ texthl=MarkSign
738 sign define MarkDot text=• texthl=MarkDot
739 sign define MarkQuote text=” texthl=MarkSign
740 sign define MarkCaret text=ʌ texthl=MarkDot
742 sign define MarkDash text=' texthl=MarkSign
743 sign define MarkDot text=* texthl=MarkDot
744 sign define MarkQuote text=" texthl=MarkSign
745 sign define MarkCaret text=^ texthl=MarkDot
747 sign define MarkLess text=< texthl=MarkSign
748 sign define MarkGreater text=> texthl=MarkSign
749 sign define MarkLeft text=( texthl=MarkSign
750 sign define MarkRight text=) texthl=MarkSign
751 sign define MarkSquareLeft text=[ texthl=MarkSign
752 sign define MarkSquareRight text=] texthl=MarkSign
753 sign define MarkBraceLeft text={ texthl=MarkSign
754 sign define MarkBraceRight text=} texthl=MarkSign
755 sign define Marka text=a texthl=MarkSign linehl=MarkLine
756 sign define Markb text=b texthl=MarkSign linehl=MarkLine
757 sign define Markc text=c texthl=MarkSign linehl=MarkLine
758 sign define Markd text=d texthl=MarkSign linehl=MarkLine
759 sign define Marke text=e texthl=MarkSign linehl=MarkLine
760 sign define Markf text=f texthl=MarkSign linehl=MarkLine
761 sign define MarkA text=A texthl=MarkSign linehl=MarkLine
762 sign define MarkB text=B texthl=MarkSign linehl=MarkLine
763 sign define MarkC text=C texthl=MarkSign linehl=MarkLine
764 sign define MarkD text=D texthl=MarkSign linehl=MarkLine
765 sign define MarkE text=E texthl=MarkSign linehl=MarkLine
766 sign define MarkF text=F texthl=MarkSign linehl=MarkLine
769 call Resize_Columns("+", 2)
771 call <SID>Highlight_Signs()
773 exe "sign unplace " . (g:firstsign + 0)
774 exe "sign unplace " . (g:firstsign + 1)
775 exe "sign unplace " . (g:firstsign + 2)
776 exe "sign unplace " . (g:firstsign + 3)
777 exe "sign unplace " . (g:firstsign + 4)
778 exe "sign unplace " . (g:firstsign + 5)
779 exe "sign unplace " . (g:firstsign + 6)
780 exe "sign unplace " . (g:firstsign + 7)
781 exe "sign unplace " . (g:firstsign + 8)
782 exe "sign unplace " . (g:firstsign + 9)
783 exe "sign unplace " . (g:firstsign + 10)
784 exe "sign unplace " . (g:firstsign + 11)
785 exe "sign unplace " . (g:firstsign + 12)
786 exe "sign unplace " . (g:firstsign + 13)
787 exe "sign unplace " . (g:firstsign + 14)
788 exe "sign unplace " . (g:firstsign + 15)
789 exe "sign unplace " . (g:firstsign + 16)
790 exe "sign unplace " . (g:firstsign + 17)
791 exe "sign unplace " . (g:firstsign + 18)
792 exe "sign unplace " . (g:firstsign + 19)
793 exe "sign unplace " . (g:firstsign + 20)
794 exe "sign unplace " . (g:firstsign + 21)
795 exe "sign unplace " . (g:firstsign + 22)
796 exe "sign unplace " . (g:firstsign + 23)
797 exe "sign unplace " . (g:firstsign + 24)
799 sign undefine MarkDash
800 sign undefine MarkDot
801 sign undefine MarkQuote
802 sign undefine MarkCaret
803 sign undefine MarkLess
804 sign undefine MarkGreater
805 sign undefine MarkLeft
806 sign undefine MarkRight
807 sign undefine MarkSquareLeft
808 sign undefine MarkSquareRight
809 sign undefine MarkBraceLeft
810 sign undefine MarkBraceRight
824 call <SID>Prep_Signs()
826 call Resize_Columns("-", 2)
831 " Do we have Unicode?
832 fun! <SID>Has_Unicode() "{{{2
833 if ! has('multi_byte')
841 if &tenc =~? '^u\(tf\|cs\)'
845 if ! strlen(&tenc) && &enc =~? '^u\(tf\|cs\)'
853 fun! Cycle_List() "{{{2
854 " Pretty UTF-8 listchars.
855 if <SID>Has_Unicode()
856 let basic='tab:»·,trail:…,extends:«,precedes:»'
859 let basic=basic . ',nbsp:•'
862 let basic='tab:\\_,trail:_,extends:<,precedes:>'
865 let basic=basic . ',nbsp:+'
869 let w:iainlist = w:iainlist + 1
875 elseif w:iainlist == 1
876 exec "setlocal lcs=" . basic
879 exec "setlocal lcs=" . basic . "," . eol
883 call Resize_Columns(Extra_Columns("list", "iainlist", " == 2"), 1)
886 " Cycle between hex and decimal display of toolbar stuff.
887 fun! Cycle_HexStatusLine() "{{{2
889 let b:iainhex = ! b:iainhex
890 call Show_StatusLine()
893 " Cycle verbose display of toolbar stuff.
894 fun! Cycle_VerboseStatusLine() "{{{2
896 let b:iainverbose = ! b:iainverbose
897 call Show_StatusLine()
900 " Toggle quickfix window.
901 fun! Cycle_Quickfix() "{{{2
902 if g:quickfixing == 1
910 " Swap hex/decimal statusline with \x.
911 call Mapping("x", ":call Cycle_HexStatusLine()<CR>:<CR>")
912 " Change statusline verbosity with \v.
913 call Mapping("V", ":call Cycle_VerboseStatusLine()<CR>:<CR>")
914 " Cycle list styles with \l.
915 call Mapping("l", ":call Cycle_List()<CR>:<CR>")
916 " Toggle tags with \t.
917 call Mapping("t", ":Tlist<CR>")
918 " Change foldmethod with \f.
919 call Mapping("f", ":se foldenable!<CR>:<CR>")
920 " Toggle quickfix window with \q.
921 call Mapping("q", ":call Cycle_Quickfix()<CR>:<CR>")
922 " Rerun filetype detection with \s. The s is for syntax, as this will be
923 " updated as a side-effect.
924 call Mapping("S", ":filetype detect<CR>:<CR>")
925 " Toggle marks with \m.
926 call Mapping("m", ":call <SID>Cycle_Signs(1)<CR>:<CR>")
928 " Show signs by default.
929 au Display VimEnter * call <SID>Cycle_Signs(0)
932 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
933 " Handle options only available in Vim 7 and above.
934 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
935 if version >= "700" "{{{1
938 " Helper to show tab name.
939 fun! <SID>TabName(label, gui) "{{{2
940 let l:label = a:label
942 let l:label = "No Name"
944 let l:label = "[" . l:label . "]"
947 let l:label = fnamemodify(l:label, ":t")
948 if strlen(l:label) >= 18
949 let l:label = l:label[0:17] . ".."
955 " Find out if any buffer was modified.
956 fun! <SID>TabModified(buflist) "{{{2
958 while l:i < len(a:buflist)
959 if getbufvar(a:buflist[l:i], "&modified") == 1
968 fun! Show_TabLine() "{{{2
969 let l:s = "%#TabLineFill#Tabs:"
972 while l:i < tabpagenr("$")
975 let l:buflist = tabpagebuflist(l:i)
976 let l:winnr = tabpagewinnr(l:i)
977 let l:n = tabpagewinnr(l:i, "$")
978 let l:label = <SID>TabName(bufname(l:buflist[l:winnr - 1]), 0)
979 let l:modified = <SID>TabModified(l:buflist)
981 " Choose highlighting.
982 if l:i == tabpagenr()
983 let l:s .= "%#TabLineSel#[" . l:n . l:modified . " " . l:label . "]"
985 let l:s .= "%#TabLine# " . l:n . l:modified . " " . l:label . " "
990 let l:s .= "%#TabLine#%T"
994 " Per tab label for the GUI.
995 fun! Show_GUITabLine() "{{{2
996 let l:buflist = tabpagebuflist(v:lnum)
997 let l:winnr = tabpagewinnr(v:lnum)
998 let l:s = tabpagewinnr(v:lnum, "$")
999 let l:label = <SID>TabName(bufname(l:buflist[l:winnr - 1]), 1)
1000 let l:modified = <SID>TabModified(l:buflist)
1002 let l:s .= l:modified . " " . l:label
1006 " Toggle highlighting cursor line when focus changes.
1007 fun! <SID>ToggleCursorLine() "{{{2
1010 if b:iainstatus =~# "f" && b:iainstatus =~# "H" && b:iainstatus =~# "I"
1011 " Focus lost while held in insert mode.
1012 let b:iaincul = getbufvar("", "&cursorline")
1015 setlocal nocursorline
1019 se tabline=%!Show_TabLine()
1020 se guitablabel=%!Show_GUITabLine()
1022 au StatusLine CursorHoldI * call Highlight_StatusLine("H")
1023 au StatusLine CursorMovedI * call Highlight_StatusLine("h")
1024 au StatusLine FocusGained * call Highlight_StatusLine("F")
1025 au StatusLine FocusLost * call Highlight_StatusLine("f")
1026 au StatusLine InsertEnter * call Highlight_StatusLine("I")
1027 au StatusLine InsertLeave * call Highlight_StatusLine("i")
1029 au Display FocusGained,FocusLost * call <SID>ToggleCursorLine()
1032 au Signs InsertEnter * call <SID>Highlight_Signs()
1033 au Signs InsertLeave * call <SID>Highlight_Signs()
1036 " Limit the size of the popup menu when completing.
1039 " Make diffs vertical by default.
1040 se diffopt+=vertical
1042 " Set size of numbers column.
1045 " Add "previous tab" mapping as gb.
1046 map gb :tabprevious<CR>:<CR>
1049 if has("gui_macvim")
1053 " Yet more GUI options. Add tabs.
1057 let g:p4EnableMenu=1
1058 let g:p4Presets='P4CONFIG'
1061 let g:bufExplorerShowRelativePath=1
1062 let g:bufExplorerSplitOutPathName=0
1065 " Resize after startup.
1066 if version >= "500" "{{{1
1067 au Display VimEnter * call Startup_Resize()