7abde90783356fb17b84ce9e40f68b32cb183690
[profile.git] / .vimrc
1 " $Id$
2 se nocp
3 se ts=2
4 se bs=2
5 se sw=2
6 se expandtab
7 se ruler
8 se cindent
9 se cinkeys=0{,0},0),:,!^F,o,O,e
10 se showcmd
11 se go=agilmrtT
12 se hlsearch
13 se incsearch
14 se ignorecase
15 se smartcase
16 se shm=aot
17 se laststatus=2
18 syn enable
19 if has("gui_running")
20   se guifont=Bitstream\ Vera\ Sans\ Mono\ 12
21   colo darkblue
22 endif
23 highlight StatusLine guifg=white guibg=blue ctermbg=white ctermfg=blue
24 if has("win32")
25   se guifont=Bitstream_Vera_Sans_Mono:h10:cANSI
26 endif
27 :autocmd!
28
29 " Set up our variables.
30 fun! Iain_Vars()
31   if ! exists("b:iainlist") | let b:iainlist = 0 | endif
32   if ! exists("b:iainhex") | let b:iainhex = 0 | endif
33   if ! exists("b:iainfold") | let b:iainfold = 0 | endif
34 endfun
35
36 " Change list mode.
37 fun! Cycle_List()
38   let basic='tab:\\_,trail:_,extends:<,precedes:>'
39   call Iain_Vars()
40   let b:iainlist = b:iainlist + 1
41   if b:iainlist > 2 | let b:iainlist = 0 | endif
42   if b:iainlist == 0
43     set nolist
44   elseif b:iainlist == 1
45     exec "set lcs=" . basic
46     set list
47   else
48     exec "set lcs=" . basic . ",eol:$"
49     set list
50   endif
51 endfun
52
53 " Toggle folds.
54 fun! Cycle_Fold()
55   call Iain_Vars()
56   let b:iainfold = ! b:iainfold
57   if b:iainfold | foldclose | else | foldopen | endif
58 endfun
59
60 fun! Show_List()
61   call Iain_Vars()
62   if b:iainlist == 0
63     " No list.
64     return " "
65   elseif b:iainlist == 1
66     " Just tabs.
67     return "_"
68   else
69     " Full list.
70     return "\$"
71   endif
72 endfun
73
74 " Cycle between hex and decimal display of toolbar stuff.
75 fun! Cycle_HexStatusLine()
76   call Iain_Vars()
77   let b:iainhex = ! b:iainhex
78   call Show_StatusLine()
79 endfun
80
81 fun! Show_StatusLine()
82   call Iain_Vars()
83   let sl1='%2n\:\ %<%f\ [%{Show_List()}%{Show_Case()}%{Show_Tabstop()}%{Show_Paste()}%Y%M%R]\ %='
84   let sl2='\ \|\ P:%4.6o\ L:%4.6l/%-4.6L\ C:%3.6c\ \|\ %P'
85   let hexformat='%b'
86   if b:iainhex
87     let hexformat='0\x%02B'
88   endif
89   exec "set statusline=" . sl1 . hexformat . sl2
90 endfun
91
92 " Save the current window width so if we change it we can restore it
93 " when we quit.
94 let andyoldcols=&columns
95
96 " This expands the terminal to display two 80-column files side-by-side
97 " when vim is opened in diff mode.
98 if &diff | let &columns = 164 | endif
99
100 map <C-"> viwvbi"<ESC>ea"<ESC>
101 map - yyp:s/./-/g<RETURN>:let @/=''<RETURN>:<RETURN>
102 map = yyp:s/./=/g<RETURN>:let @/=''<RETURN>:<RETURN>
103 command! W :w
104 se tags=~/.ctags
105
106 " Make * and # work the way you expect in visual mode.
107 vnoremap * y/\V<C-R>=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")<CR><CR>
108 vnoremap # y?\V<C-R>=substitute(escape(@@,"?\\"),"\n","\\\\n","ge")<CR><CR>
109
110 fun! Invert_Case()
111   let &ic = ! &ic
112 endfun
113
114 fun! Show_Case()
115   if &ic | return "c" | else | return "C" | endif
116 endfun
117
118 fun! Show_Tabstop()
119   return &ts
120 endfun
121
122 fun! Show_Paste()
123   if &paste | return "p" | else | return "" | endif
124 endfun
125
126 " Clear Q as we will use it for commands.
127 map Q <Nop>
128
129 " Swap hex/decimal statusline with Qx
130 map Qx :call Cycle_HexStatusLine()<CR>:<CR>
131 " Swap case-sensitivity with Qc.
132 map Qc :call Invert_Case()<CR>:<CR>
133 " Cycle list styles with Ql.
134 map Ql :call Cycle_List()<CR>:<CR>
135 " Change to ts=2 with Q2.
136 map Q2 :se ts=2<CR>:<CR>
137 " Change to ts=4 with Q4.
138 map Q4 :se ts=4<CR>:<CR>
139 " Change to ts=8 with Q8.
140 map Q8 :se ts=8<CR>:<CR>
141 " Change to ts=16 with Q6.
142 map Q6 :se ts=16<CR>:<CR>
143 " Change to ts=32 with Q3.
144 map Q3 :se ts=32<CR>:<CR>
145 " Change foldmethod with Qf.
146 map Qf :call Cycle_Fold()<CR>:<CR>
147 " Change number mode with Qn.
148 map Qn :se number!<CR>:<CR>
149
150 " Vim 7 has tabs.  Default "next tab" mapping is gt.  Add "previous tab" as gb.
151 map gb :tabPrev<CR>
152
153 call Show_StatusLine()
154
155 au VimLeave * if exists("andyoldcols") | let &columns=andyoldcols | endif
156
157 " Autocommands to setup features we only want in certain modes...
158
159 " ... For C/C++ files:
160
161 au BufEnter * if &ft == "c" || &ft == "cpp" | call CMode_map() | endif
162 au BufLeave * if &ft == "c" || &ft == "cpp" | call CMode_unmap() | endif
163
164 " ... For Perl files:
165
166 au BufEnter * if &ft == "perl" | call PerlMode_map() | endif
167 au BufLeave * if &ft == "perl" | call PerlMode_unmap() | endif
168
169 " ... For makefiles:
170
171 au BufEnter * if &ft == "make" | call MakeMode_map() | endif
172 au BufLeave * if &ft == "make" | call MakeMode_unmap() | endif
173
174 " Functions to call when we enter/leave a programming language buffer...
175
176 " ... For C-like languages:
177
178 fun! CMode_map()
179   set cinkeys=0{,0},:,0#,!^F,o,O,e
180   set cinwords=if,else,while,do,for,switch
181 endfun
182
183 fun! CMode_unmap()
184 endfun
185
186 " .. For Perl files:
187
188 fun! PerlMode_map()
189   set cinkeys=0{,0},:,!^F,o,O,e
190   set cinwords=if,else,while,do,for,eval
191 endfun
192
193 fun! PerlMode_unmap()
194   set foldmethod=manual
195 endfun
196
197 " ... For makefiles:
198
199 fun! MakeMode_map()
200   set list
201   set noexpandtab
202 endfun
203
204 fun! MakeMode_unmap()
205   set nolist
206   set expandtab
207 endfun