1 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
3 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
4 " Multi-version vimrc compatible with version 4 and above.
5 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
7 " Note that "if <condition> | call Something() | endif" syntax is unsupported
8 " in Vim 4 so we write all our functions out the long way. It does work in
9 " autocommand definitions, however.
11 " Vim 4 complains if version isn't set in the configuration file.
14 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
15 " Handle options safe to use in version 4. Vim 4 parses but ignores the
16 " "if version" syntax used later in this file so we don't use it. No attempt
17 " is made to make this configuration compatible with Vim 3.
18 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
19 " No compatibility mode.
24 " And use spaces not tabs.
26 " And << and >> indent by 2.
29 " Allow backspace to delete before start of line.
34 " Show partial commands in the ruler.
36 " And always show the status line.
41 se cinkeys=0{,0},0),:,!^F,o,O,e
47 " Don't be bugged by messages at the bottom of the screen.
53 " Case-insensitive search.
55 " But override by typing capitals.
58 " Look for ctags in home directory first.
59 se tags=~/.tags,./tags,tags
61 " Use - and = to create underlines.
62 map - yyp:s/./-/g<RETURN>:let @/=''<RETURN>:<RETURN>
63 map = yyp:s/./=/g<RETURN>:let @/=''<RETURN>:<RETURN>
65 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
66 " Handle options only available in Vim 5 and above.
67 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
71 " Save sessions in UNIX format with / as file separator. This is
75 " Nuke any pre-existing autocommands.
78 " Save the current window width so we can restore it when we quit.
81 " More GUI options. Add icon, tearoffs and toolbar.
84 " Allow dynamic window resize even if we aren't in an xterm.
85 se t_WS=
\e[8;%p1%d;%p2%dt
87 " Highlight search results.
90 " Syntax highlighting.
98 " Set up our variables.
100 if ! exists("b:iainlist")
103 if ! exists("b:iainhex")
106 if ! exists("b:iainverbose")
107 let b:iainverbose = 0
111 " Helper for status line.
112 " Show space, underscore or dollar sign depending on list mode.
118 elseif b:iainlist == 1
127 " Helper for status line.
128 " Show c or C to denote case-sensitivity.
137 " Helper for status line.
138 " Show the size of the tabstop.
143 " Helper for status line.
144 " Show p when paste mode is on.
153 " Show the status line.
154 fun! Show_StatusLine()
156 let sl1='%2n\:\ %<%f\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ %='
157 let sl3='L:%4.6l/%-4.6L\ C:%3.6c\ \|\ %P'
160 let hexformat='0\x%02B'
163 let sl2=hexformat . '\ \|\ P:%4.6o\ '
167 exec "set statusline=" . sl1 . sl2 . sl3
170 " Restore window size.
171 au VimLeave * if exists("oldcols") | let &columns=oldcols | endif
174 au BufEnter * if &ft == "c" || &ft == "cpp" | call CMode_map() | endif
175 au BufLeave * if &ft == "c" || &ft == "cpp" | call CMode_unmap() | endif
178 au BufEnter * if &ft == "perl" | call PerlMode_map() | endif
179 au BufLeave * if &ft == "perl" | call PerlMode_unmap() | endif
182 au BufEnter * if &ft == "make" | call MakeMode_map() | endif
183 au BufLeave * if &ft == "make" | call MakeMode_unmap() | endif
187 let oldcinkeys=&cinkeys
188 let oldcinwords=&cinwords
189 set cinkeys=0{,0},:,0#,!^F,o,O,e
190 set cinwords=if,else,while,do,for,switch
195 set cinkeys=oldcinkeys
196 set cinwords=oldcinwords
199 " Entering Perl mode.
201 let oldcinkeys=&cinkeys
202 let oldcinwords=&cinwords
203 set cinkeys=0{,0},:,!^F,o,O,e
204 set cinwords=if,else,while,do,for,eval
208 fun! PerlMode_unmap()
209 set cinkeys=oldcinkeys
210 set cinwords=oldcinwords
213 " Entering Make mode.
220 fun! MakeMode_unmap()
225 " Show the status line for the first time.
226 call Show_StatusLine()
229 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
230 " Handle options only available in Vim 6 and above.
231 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
235 " Track changing number mode.
236 let g:numbercols=&columns
237 let g:numberchanges=0
239 " Less intrusive syntax highlighting.
243 if has("gui_running")
244 se guifont=Bitstream\ Vera\ Sans\ Mono\ 10
248 se guifont=Bitstream_Vera_Sans_Mono:h10:cANSI
251 " Ignore whitespace when diffing.
252 se diffopt=filler,iwhite
254 " Expand window when doing a vertical diff.
259 " Status bar matches the colour.
260 highlight StatusLine guifg=white guibg=blue ctermbg=white ctermfg=blue
263 highlight LineNr term=underline cterm=bold guifg=blue ctermfg=blue
265 " Make * and # work the way you expect in visual mode.
266 vnoremap * y/\V<C-R>=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")<CR><CR>
267 vnoremap # y?\V<C-R>=substitute(escape(@@,"?\\"),"\n","\\\\n","ge")<CR><CR>
271 let basic='tab:\\_,trail:_,extends:<,precedes:>'
273 let b:iainlist = b:iainlist + 1
279 elseif b:iainlist == 1
280 exec "set lcs=" . basic
283 exec "set lcs=" . basic . ",eol:$"
288 " Cycle between hex and decimal display of toolbar stuff.
289 fun! Cycle_HexStatusLine()
291 let b:iainhex = ! b:iainhex
292 call Show_StatusLine()
295 " Cycle verbose display of toolbar stuff.
296 fun! Cycle_VerboseStatusLine()
298 let b:iainverbose = ! b:iainverbose
299 call Show_StatusLine()
302 " Cycle between number mode.
303 " FIXME: Toggling in a split window doesn't work properly. We need to track
304 " the number of windows and number modes. Something for later...
305 " Perhaps have a redraw callback that checks width and original column number.
311 let g:numberchanges=g:numberchanges-1
316 " Change size back if this was the last window.
317 if g:numberchanges == 0
318 let &columns=g:numbercols
323 " Save width between number toggling.
325 " Expand if this was the first change.
326 if g:numberchanges == 0
327 let g:numbercols=&columns
329 " Expand column by our preferred width.
330 let &columns=&columns+&numberwidth
332 " Vim 6 hardcodes width to 8.
333 let &columns=&columns+8
338 let g:numberchanges=g:numberchanges+1
344 " Toggle case-sensitivity.
349 " We'll use Q for various commands. Unmap it.
352 " Change to ts=2 with Q2.
353 map Q2 :se ts=2<CR>:<CR>
354 " Change to ts=4 with Q4.
355 map Q4 :se ts=4<CR>:<CR>
356 " Change to ts=8 with Q8.
357 map Q8 :se ts=8<CR>:<CR>
358 " Change to ts=16 with Q6.
359 map Q6 :se ts=16<CR>:<CR>
360 " Change to ts=32 with Q3.
361 map Q3 :se ts=32<CR>:<CR>
362 " Change foldmethod with Qf.
363 map Qf :se foldenable!<CR>:<CR>
364 " Toggle paste mode with Qp.
365 map Qp :se paste!<CR>:<CR>
366 " Swap hex/decimal statusline with Qx
367 map Qx :call Cycle_HexStatusLine()<CR>:<CR>
368 " Change statusline verbosity with Qv
369 map Qv :call Cycle_VerboseStatusLine()<CR>:<CR>
370 " Swap case-sensitivity with Qc.
371 map Qc :call Invert_Case()<CR>:<CR>
372 " Cycle list styles with Ql.
373 map Ql :call Cycle_List()<CR>:<CR>
374 " Change number mode with Qn.
375 map Qn :call Cycle_Number()<CR>:<CR>
376 " Toggle tags with Qt.
378 " Clear search pattern with Q/.
379 map Q/ :let @/=""<CR>:<CR>
382 fun! PerlMode_unmap()
383 set cinkeys=oldcinkeys
384 set cinwords=oldcinwords
385 set foldmethod=manual
389 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
390 " Handle options only available in Vim 7 and above.
391 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
395 " Make diffs vertical by default.
398 " Set size of numbers column.
401 " Add "previous tab" mapping as gb.