1 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
2 " Multi-version vimrc compatible with version 4 and above.
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 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
17 " No compatibility mode.
22 " And use spaces not tabs.
24 " And << and >> indent by 2.
27 " Allow backspace to delete before start of line.
32 " Show partial commands in the ruler.
34 " And always show the status line.
39 se cinkeys=0{,0},0),:,!^F,o,O,e
45 " Don't be bugged by messages at the bottom of the screen.
51 " Case-insensitive search.
53 " But override by typing capitals.
56 " Look for ctags in home directory first.
57 se tags=~/.tags,./tags,tags
59 " Don't timeout waiting to interpet, eg, <ESC>OA as an escape code.
62 " Use ^B to search backward when completing.
64 " Use ^L to show matching completions but don't select one.
65 inoremap <C-l> <C-n><C-p>
67 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
68 " Handle options only available in Vim 5 and above.
69 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
73 " Tell Vim we use dark backgrounds in our terminals.
74 if ! has("gui_running")
78 " Allow mouse use in a terminal.
81 " Update more quickly. For use with sign highlighting as polling for
82 " CursorMove makes redrawing slow.
87 " Enable tab-completion prompting for commands.
89 " Don't list object files when globbing files to load.
90 se wildignore+=*.o,*.obj
91 " So there's no need to assign them low priority.
92 se suffixes-=*.o,*.obj
94 " Save sessions in UNIX format with / as file separator. This is
98 " Nuke any pre-existing autocommands.
111 " Save the current window width so we can restore it when we quit.
112 if ! exists("oldcols")
116 " More GUI options. Add icon, tearoffs and toolbar.
119 " Allow dynamic window resize even if we aren't in an xterm.
120 se t_WS=
\e[8;%p1%d;%p2%dt
122 " Highlight search results.
125 " Set graphical window title.
126 se titlestring=%{Show_TitleString()}
128 " Syntax highlighting. New versions will use syn enable instead.
133 " Use a discernably different colour to highlight the cursor which shows
134 " matching brackets. Our regular cursor is green so use blue instead of cyan.
135 hi MatchParen ctermbg=blue
142 " Set up our variables.
144 if ! exists("b:iainlist")
147 if ! exists("b:iainhex")
150 if ! exists("b:iainverbose")
151 let b:iainverbose = 0
153 if ! exists("b:iainstatus")
154 " Window Flags: (F)ocused, (I)nsert mode, Cursor (H)old.
155 let b:iainstatus = "Fih"
157 if ! exists("g:iainextracolumns")
158 let g:iainextracolumns = 0
161 if ! exists("g:marksigns")
164 if ! exists("g:firstsign")
165 let g:firstsign = 100
170 " Helper for status line.
171 " Show space, underscore or dollar sign depending on list mode.
177 elseif b:iainlist == 1
186 " Helper for status line.
187 " Show c or C to denote case-sensitivity.
196 " Helper for status line.
197 " Show the size of the tabstop.
202 " Helper for status line.
203 " Show p when paste mode is on.
212 " Show the window title.
213 fun! Show_TitleString()
217 let l:ts1=printf("%2d: %s", bufnr(""), expand('%t'))
219 return printf("%s (%s) %s", l:ts1, getcwd(), v:servername)
222 " Show the status line.
223 fun! Show_StatusLine()
225 let l:sl1='%2n\:\ %<%f\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ %='
226 let l:sl3='L:%4.6l/%-4.6L\ C:%3.6c\ \|\ %P'
229 let l:hexformat='0\x%02B'
232 let l:sl2=l:hexformat . '\ \|\ P:%4.6o\ '
236 exec "set statusline=" . l:sl1 . l:sl2 . l:sl3
239 " Toggle case-sensitivity.
244 " Grow or shrink the window size.
245 fun! Resize_Columns(op, ...)
247 " Vim 5 hardcodes the size of numbers column to 8.
249 let l:columns = &numberwidth
257 let l:resize = "se columns" . a:op . "=" . l:columns
259 " HACK: Inside screen there is an extra line for the status bar. Vim
260 " manages the resize by sending an escape sequence to set the number of
261 " lines and number of columns in one action. To do this it will first query
262 " the number of lines and then set <same number of lines> by <new number of
263 " columns>. Because of the extra line for the status bar this results in
264 " the real terminal being shrunk by a line. We ask for the terminal to grow
265 " by a line so it ends up actually being the same.
266 if &term =~ '^screen'
267 let l:resize .= " lines+=1"
273 " Toggle number display.
276 let &number = ! &number
280 let l:num_numbers = 0
281 while l:i <= winnr("$")
282 if getwinvar(l:i, "&number") == 1
283 let l:num_numbers = l:num_numbers + 1
288 if l:num_numbers == 0
289 let g:iainextracolumns = 0
291 call Resize_Columns("-")
293 elseif g:iainextracolumns == 0
294 let g:iainextracolumns = 1
296 call Resize_Columns("+")
302 " Restore window size.
303 au Display VimLeave * if exists("oldcols") | call Resize_Columns("-", (&columns - oldcols)) | endif
306 au Mode BufEnter * if &ft == "make" | call MakeMode_map() | endif
307 au Mode BufLeave * if &ft == "make" | call MakeMode_unmap() | endif
309 " Entering Make mode.
319 fun! MakeMode_unmap()
325 " Show the status line for the first time.
326 call Show_StatusLine()
328 " Function to create mappings with either a hardcoded \ or <Leader>.
329 fun! Mapping(keysequence,mapping)
331 exec "map \\" . a:keysequence . " " . a:mapping
333 exec "map <Leader>" . a:keysequence . " " . a:mapping
337 " Use - and = to create underlines.
338 call Mapping("-", "yyp:s/./-/g<RETURN>:let @/=''<RETURN>:<RETURN>")
339 call Mapping("=", "yyp:s/./=/g<RETURN>:let @/=''<RETURN>:<RETURN>")
341 " Change to ts=2 with \2.
342 call Mapping("2", ":se ts=2<CR>:<CR>")
343 " Change to ts=4 with \4.
344 call Mapping("4", ":se ts=4<CR>:<CR>")
345 " Change to ts=8 with \8.
346 call Mapping("8", ":se ts=8<CR>:<CR>")
347 " Change to ts=16 with \6.
348 call Mapping("6", ":se ts=16<CR>:<CR>")
349 " Change to ts=32 with \3.
350 call Mapping("3", ":se ts=32<CR>:<CR>")
351 " Toggle paste mode with \p.
352 call Mapping("p", ":se paste!<CR>:<CR>")
353 " Swap case-sensitivity with \c.
354 call Mapping("c", ":call Invert_Case()<CR>:<CR>")
355 " Change number mode with \n.
356 call Mapping("n", ":call Number(1)<CR>:<CR>")
357 " Expand or shrink window size with \> and \<.
358 call Mapping(">", ":call Resize_Columns('+')<CR>:<CR>")
359 call Mapping("<", ":call Resize_Columns('-')<CR>:<CR>")
360 " Clear search pattern with \/.
361 call Mapping("/", ":let @/=\"\"<CR>:<CR>")
363 " Forget the Ex mode mapping.
366 " Vim tip 99: What's the highlighting group under the cursor?
367 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>")
369 fun! <SID>Startup_Resize()
370 " Resize for numbers.
372 let l:columns = &numberwidth
384 call Resize_Columns("+", l:columns)
387 " Show numbers by default.
388 au Display VimEnter * call Number(0)
390 " Resize after startup.
391 au Display VimEnter * call <SID>Startup_Resize()
394 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
395 " Handle options only available in Vim 6 and above.
396 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
400 " Remember quickfix state.
403 " Set indenting by filetype.
406 " Less intrusive syntax highlighting.
410 if has("gui_running")
413 se guifont=DejaVu_Sans_Mono:h10:cANSI
415 se guifont=DejaVu\ Sans\ Mono\ 10
420 if has("gui_running") || &t_Co > 16
427 " Ignore whitespace when diffing.
428 se diffopt=filler,iwhite
430 " Expand window when doing a vertical diff.
435 " Remember that we are opening the quickfix window.
436 au Mode BufWinEnter quickfix let g:quickfixing=1
437 au Mode BufUnload * if &ft == "qf" | let g:quickfixing=0 | endif
439 " Allow in-place editing of crontabs.
440 au Mode FileType crontab set backupcopy=yes
442 " Make * and # work the way you expect in visual mode.
443 vnoremap * y/\V<C-R>=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")<CR><CR>
444 vnoremap # y?\V<C-R>=substitute(escape(@@,"?\\"),"\n","\\\\n","ge")<CR><CR>
446 " Set mark and update highlighting.
448 au Signs BufEnter * call <SID>Highlight_Signs()
449 au Signs CursorHold * call <SID>Highlight_Signs()
452 fun! <SID>Prep_Signs()
453 if ! exists("b:signdot") || ! g:marksigns
456 if ! exists("b:signdash") || ! g:marksigns
459 if ! exists("b:signquote") || ! g:marksigns
462 if ! exists("b:signcaret") || ! g:marksigns
465 if ! exists("b:signless") || ! g:marksigns
468 if ! exists("b:signgreater") || ! g:marksigns
471 if ! exists("b:signleft") || ! g:marksigns
474 if ! exists("b:signright") || ! g:marksigns
477 if ! exists("b:signa") || ! g:marksigns
480 if ! exists("b:signb") || ! g:marksigns
483 if ! exists("b:signc") || ! g:marksigns
486 if ! exists("b:signd") || ! g:marksigns
489 if ! exists("b:signe") || ! g:marksigns
492 if ! exists("b:signf") || ! g:marksigns
495 if ! exists("b:signA") || ! g:marksigns
498 if ! exists("b:signB") || ! g:marksigns
501 if ! exists("b:signC") || ! g:marksigns
504 if ! exists("b:signD") || ! g:marksigns
507 if ! exists("b:signE") || ! g:marksigns
510 if ! exists("b:signF") || ! g:marksigns
515 fun! <SID>Place_Sign(number, line, old, name)
520 exe "sign unplace " . (g:firstsign + a:number) . " buffer=" . bufnr("")
521 " Don't place the sign if it would conflict with the last change sign.
522 exe "sign place " . (g:firstsign + a:number) . " line=" . a:line . " name=" . a:name . " buffer=" . bufnr("")
526 fun! <SID>Highlight_Signs(...)
527 if ! has("signs") || ! g:marksigns
531 call <SID>Prep_Signs()
533 let b:signdot = <SID>Place_Sign(0, line("'."), b:signdot, "MarkDot")
534 let b:signdash = <SID>Place_Sign(1, line("''"), b:signdash, "MarkDash")
535 let b:signquote = <SID>Place_Sign(2, line("'\""), b:signquote, "MarkQuote")
536 let b:signcaret = <SID>Place_Sign(3, line("'^"), b:signcaret, "MarkCaret")
537 let b:signless = <SID>Place_Sign(4, line("'<"), b:signcaret, "MarkLess")
538 let b:signgreater = <SID>Place_Sign(5, line("'>"), b:signcaret, "MarkGreater")
539 let b:signleft = <SID>Place_Sign(6, line("'["), b:signcaret, "MarkLeft")
540 let b:signright = <SID>Place_Sign(7, line("']"), b:signcaret, "MarkRight")
542 let b:signa = <SID>Place_Sign(8, line("'a"), b:signa, "Marka")
543 let b:signb = <SID>Place_Sign(9, line("'b"), b:signb, "Markb")
544 let b:signc = <SID>Place_Sign(10, line("'c"), b:signc, "Markc")
545 let b:signd = <SID>Place_Sign(11, line("'d"), b:signd, "Markd")
546 let b:signe = <SID>Place_Sign(12, line("'e"), b:signe, "Marke")
547 let b:signf = <SID>Place_Sign(13, line("'f"), b:signf, "Markf")
548 let b:signA = <SID>Place_Sign(14, line("'A"), b:signA, "MarkA")
549 let b:signB = <SID>Place_Sign(15, line("'B"), b:signB, "MarkB")
550 let b:signC = <SID>Place_Sign(16, line("'C"), b:signC, "MarkC")
551 let b:signD = <SID>Place_Sign(17, line("'D"), b:signD, "MarkD")
552 let b:signE = <SID>Place_Sign(18, line("'E"), b:signE, "MarkE")
553 let b:signF = <SID>Place_Sign(19, line("'F"), b:signF, "MarkF")
557 fun! <SID>Cycle_Signs(resize)
562 let g:marksigns = ! g:marksigns
565 " Signs to highlight marks.
566 " Syntax won't work properly in Vim 6.
567 sign define MarkDash text=' texthl=MarkSign
568 sign define MarkDot text=* texthl=MarkDot
569 sign define MarkQuote text=" texthl=MarkSign
570 sign define MarkCaret text=^ texthl=MarkSign
571 sign define MarkLess text=< texthl=MarkSign
572 sign define MarkGreater text=> texthl=MarkSign
573 sign define MarkLeft text=[ texthl=MarkSign
574 sign define MarkRight text=] texthl=MarkSign
575 sign define Marka text=a texthl=MarkSign linehl=MarkLine
576 sign define Markb text=b texthl=MarkSign linehl=MarkLine
577 sign define Markc text=c texthl=MarkSign linehl=MarkLine
578 sign define Markd text=d texthl=MarkSign linehl=MarkLine
579 sign define Marke text=e texthl=MarkSign linehl=MarkLine
580 sign define Markf text=f texthl=MarkSign linehl=MarkLine
581 sign define MarkA text=A texthl=MarkSign linehl=MarkLine
582 sign define MarkB text=B texthl=MarkSign linehl=MarkLine
583 sign define MarkC text=C texthl=MarkSign linehl=MarkLine
584 sign define MarkD text=D texthl=MarkSign linehl=MarkLine
585 sign define MarkE text=E texthl=MarkSign linehl=MarkLine
586 sign define MarkF text=F texthl=MarkSign linehl=MarkLine
589 call Resize_Columns("+", 2)
591 call <SID>Highlight_Signs()
593 exe "sign unplace " . (g:firstsign + 0)
594 exe "sign unplace " . (g:firstsign + 1)
595 exe "sign unplace " . (g:firstsign + 2)
596 exe "sign unplace " . (g:firstsign + 3)
597 exe "sign unplace " . (g:firstsign + 4)
598 exe "sign unplace " . (g:firstsign + 5)
599 exe "sign unplace " . (g:firstsign + 6)
600 exe "sign unplace " . (g:firstsign + 7)
601 exe "sign unplace " . (g:firstsign + 8)
602 exe "sign unplace " . (g:firstsign + 9)
603 exe "sign unplace " . (g:firstsign + 10)
604 exe "sign unplace " . (g:firstsign + 11)
605 exe "sign unplace " . (g:firstsign + 12)
606 exe "sign unplace " . (g:firstsign + 13)
607 exe "sign unplace " . (g:firstsign + 14)
608 exe "sign unplace " . (g:firstsign + 15)
609 exe "sign unplace " . (g:firstsign + 16)
610 exe "sign unplace " . (g:firstsign + 17)
611 exe "sign unplace " . (g:firstsign + 18)
612 exe "sign unplace " . (g:firstsign + 19)
614 sign undefine MarkDash
615 sign undefine MarkDot
616 sign undefine MarkQuote
617 sign undefine MarkCaret
618 sign undefine MarkLess
619 sign undefine MarkGreater
620 sign undefine MarkLeft
621 sign undefine MarkRight
635 call <SID>Prep_Signs()
637 call Resize_Columns("-", 2)
644 let basic='tab:\\_,trail:_,extends:<,precedes:>'
646 let b:iainlist = b:iainlist + 1
652 elseif b:iainlist == 1
653 exec "set lcs=" . basic
656 exec "set lcs=" . basic . ",eol:$"
661 " Cycle between hex and decimal display of toolbar stuff.
662 fun! Cycle_HexStatusLine()
664 let b:iainhex = ! b:iainhex
665 call Show_StatusLine()
668 " Cycle verbose display of toolbar stuff.
669 fun! Cycle_VerboseStatusLine()
671 let b:iainverbose = ! b:iainverbose
672 call Show_StatusLine()
675 " Toggle quickfix window.
676 fun! Cycle_Quickfix()
677 if g:quickfixing == 1
685 " Swap hex/decimal statusline with \x.
686 call Mapping("x", ":call Cycle_HexStatusLine()<CR>:<CR>")
687 " Change statusline verbosity with \v.
688 call Mapping("v", ":call Cycle_VerboseStatusLine()<CR>:<CR>")
689 " Cycle list styles with \l.
690 call Mapping("l", ":call Cycle_List()<CR>:<CR>")
691 " Toggle tags with \t.
692 call Mapping("t", ":Tlist<CR>")
693 " Change foldmethod with \f.
694 call Mapping("f", ":se foldenable!<CR>:<CR>")
695 " Toggle quickfix window with \q.
696 call Mapping("q", ":call Cycle_Quickfix()<CR>:<CR>")
697 " Rerun filetype detection with \s. The s is for syntax, as this will be
698 " updated as a side-effect.
699 call Mapping("s", ":filetype detect<CR>:<CR>")
700 " Toggle marks with \m.
701 call Mapping("m", ":call <SID>Cycle_Signs(1)<CR>:<CR>")
703 fun! <SID>Iain_Colour(colour)
705 if a:colour == "darkblue"
707 elseif a:colour == "darkmagenta"
709 elseif a:colour == "darkred"
711 elseif a:colour == "red"
715 if a:colour == "darkblue"
717 elseif a:colour == "darkmagenta"
719 elseif a:colour == "darkred"
721 elseif a:colour == "red"
729 " Change status bar colour when various things happen.
730 " Flags: H/h: Cursor held/moved.
731 " F/f: Focus gained/lost.
732 " I/i: Insert mode entered/left.
733 fun! Highlight_StatusLine(flag)
734 " Get current status.
737 " Change the status based on the flag. XXX: Does Vim let us to do flags?
738 let re = "[" . tolower(a:flag) . toupper(a:flag) . "]"
739 let b:iainstatus = substitute(b:iainstatus, re, a:flag, "")
741 let l:normalcolour = "darkblue"
742 let l:editingcolour = "darkmagenta"
743 let l:warningcolour = "darkred"
744 let l:readonlycolour = "red"
747 let l:colour = l:normalcolour
748 " Maybe override depending on status.
749 if b:iainstatus =~# "H"
750 if b:iainstatus =~# "I"
751 " Held in insert mode. Add extra highlight if we don't have focus.
752 if b:iainstatus =~# "f"
753 let l:colour = l:warningcolour
755 let l:colour = l:editingcolour
759 if b:iainstatus =~# "I"
760 " Regular insert mode.
761 let l:colour = l:editingcolour
765 " Override again if readonly.
766 if l:colour != l:normalcolour
767 if getbufvar("", "&ro")
768 let l:colour = l:readonlycolour
772 let l:termcolour = <SID>Iain_Colour(l:colour)
774 exec "highlight StatusLine gui=bold term=bold cterm=bold guifg=white guibg=" . l:colour . " ctermfg=white ctermbg=" . l:termcolour
777 au Display VimEnter * call Highlight_StatusLine("")
779 " Show signs by default.
780 au Display VimEnter * call <SID>Cycle_Signs(0)
783 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
784 " Handle options only available in Vim 7 and above.
785 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
789 " Helper to show tab name.
790 fun! <SID>TabName(label, gui)
791 let l:label = a:label
793 let l:label = "No Name"
795 let l:label = "[" . l:label . "]"
798 let l:label = fnamemodify(l:label, ":t")
799 if strlen(l:label) >= 18
800 let l:label = l:label[0:17] . ".."
806 " Find out if any buffer was modified.
807 fun! <SID>TabModified(buflist)
809 while i < len(a:buflist)
810 if getbufvar(a:buflist[l:i], "&modified") == 1
820 let l:s = "%#TabLineFill#Tabs:"
823 while l:i < tabpagenr("$")
826 let l:buflist = tabpagebuflist(l:i)
827 let l:winnr = tabpagewinnr(l:i)
828 let l:n = tabpagewinnr(l:i, "$")
829 let l:label = <SID>TabName(bufname(l:buflist[l:winnr - 1]), 0)
830 let l:modified = <SID>TabModified(l:buflist)
832 " Choose highlighting.
833 if l:i == tabpagenr()
834 let l:s .= "%#TabLineSel#[" . l:n . l:modified . " " . l:label . "]"
836 let l:s .= "%#TabLine# " . l:n . l:modified . " " . l:label . " "
841 let l:s .= "%#TabLine#%T"
845 " Per tab label for the GUI.
846 fun! Show_GUITabLine()
847 let l:buflist = tabpagebuflist(v:lnum)
848 let l:winnr = tabpagewinnr(v:lnum)
849 let l:s = tabpagewinnr(v:lnum, "$")
850 let l:label = <SID>TabName(bufname(l:buflist[l:winnr - 1]), 1)
851 let l:modified = <SID>TabModified(l:buflist)
853 let l:s .= l:modified . " " . l:label
857 se tabline=%!Show_TabLine()
858 se guitablabel=%!Show_GUITabLine()
860 au StatusLine CursorHoldI * call Highlight_StatusLine("H")
861 au StatusLine CursorMovedI * call Highlight_StatusLine("h")
862 au StatusLine FocusGained * call Highlight_StatusLine("F")
863 au StatusLine FocusLost * call Highlight_StatusLine("f")
864 au StatusLine InsertEnter * call Highlight_StatusLine("I")
865 au StatusLine InsertLeave * call Highlight_StatusLine("i")
868 au Signs InsertEnter * call <SID>Highlight_Signs()
869 au Signs InsertLeave * call <SID>Highlight_Signs()
872 " Limit the size of the popup menu when completing.
875 " Make diffs vertical by default.
878 " Set size of numbers column.
881 " Add "previous tab" mapping as gb.
882 map gb :tabprevious<CR>:<CR>
889 " Yet more GUI options. Add tabs.
894 let g:p4Presets='P4CONFIG'