[ADD] add .vim conf, replace old _vim, some xinitrc change, will use xsession later.
[arrow.git] / conf_slk120 / vim / _vim / ftplugin / viki.vim
blob1eba808b1e76f251b3211f510e9bedc3901e2c00
1 " viki.vim -- the viki ftplugin
2 " @Author:      Thomas Link (micathom AT gmail com?subject=vim)
3 " @License:     GPL (see http://www.gnu.org/licenses/gpl.txt)
4 " @Created:     12-Jän-2004.
5 " @Last Change: 2008-02-14.
6 " @Revision: 404
8 " if !g:vikiEnabled
9 "     finish
10 " endif
12 if exists("b:did_ftplugin") "{{{2
13     finish
14 endif
15 let b:did_ftplugin = 1
16 " if exists("b:did_viki_ftplugin")
17 "     finish
18 " endif
19 " let b:did_viki_ftplugin = 1
21 let b:vikiCommentStart = "%"
22 let b:vikiCommentEnd   = ""
23 let b:vikiHeadingMaxLevel = -1
24 if !exists("b:vikiMaxFoldLevel") | let b:vikiMaxFoldLevel = 5 | endif "{{{2
25 if !exists("b:vikiInverseFold")  | let b:vikiInverseFold  = 0 | endif "{{{2
27 exec "setlocal commentstring=". substitute(b:vikiCommentStart, "%", "%%", "g") 
28             \ ."%s". substitute(b:vikiCommentEnd, "%", "%%", "g")
29 exec "setlocal comments=fb:-,fb:+,fb:*,fb:#,fb:?,fb:@,:". b:vikiCommentStart
31 setlocal foldmethod=expr
32 setlocal foldexpr=VikiFoldLevel(v:lnum)
33 setlocal foldtext=VikiFoldText()
34 setlocal expandtab
35 " setlocal iskeyword+=#,{
36 setlocal iskeyword+={
37 setlocal iskeyword-=_
39 let &include='\(^\s*#INC.\{-}\(\sfile=\|:\)\)'
40 " let &include='\(^\s*#INC.\{-}\(\sfile=\|:\)\|\[\[\)'
41 " set includeexpr=substitute(v:fname,'\].*$','','')
43 let &define='^\s*\(#Def.\{-}id=\|#\(Fn\|Footnote\).\{-}\(:\|id=\)\|#VAR.\{-}\s\)'
45 " if !exists('b:vikiHideBody') | let b:vikiHideBody = 0 | endif
47 " if !hasmapto(":VikiFind")
48 "     nnoremap <buffer> <c-tab>   :VikiFindNext<cr>
49 "     nnoremap <buffer> <LocalLeader>vn :VikiFindNext<cr>
50 "     nnoremap <buffer> <c-s-tab> :VikiFindPrev<cr>
51 "     nnoremap <buffer> <LocalLeader>vN :VikiFindPrev<cr>
52 " endif
54 " compiler deplate
56 map <buffer> <silent> [[ :call viki#FindPrevHeading()<cr>
57 map <buffer> <silent> ][ :call viki#FindNextHeading()<cr>
58 map <buffer> <silent> ]] ][
59 map <buffer> <silent> [] [[
61 let b:undo_ftplugin = 'setlocal iskeyword< expandtab< foldtext< foldexpr< foldmethod< comments< commentstring< '
62             \ .'define< include<'
63             \ .'| unlet b:vikiHeadingMaxLevel b:vikiCommentStart b:vikiCommentEnd b:vikiInverseFold b:vikiMaxFoldLevel '
64             \ .' b:vikiEnabled '
65             \ .'| unmap <buffer> [['
66             \ .'| unmap <buffer> ]]'
67             \ .'| unmap <buffer> ]['
68             \ .'| unmap <buffer> []'
70 let b:vikiEnabled = 2
72 if exists('*VikiFoldLevel') "{{{2
73     finish
74 endif
76 function! VikiFoldText() "{{{3
77   let line = getline(v:foldstart)
78   if synIDattr(synID(v:foldstart, 1, 1), 'name') =~ '^vikiFiles'
79       let line = fnamemodify(viki#FilesGetFilename(line), ':h')
80   else
81       let ctxtlev = tlib#var#Get('vikiFoldsContext', 'wbg')
82       let ctxt    = get(ctxtlev, v:foldlevel, 0)
83       " TLogVAR ctxt
84       " TLogDBG type(ctxt)
85       if type(ctxt) == 3
86           let [ctxtbeg, ctxtend] = ctxt
87       else
88           let ctxtbeg = 1
89           let ctxtend = ctxt
90       end
91       let line = matchstr(line, '^\s*\zs.*$')
92       for li in range(ctxtbeg, ctxtend)
93           let li = v:foldstart + li
94           if li > v:foldend
95               break
96           endif
97           let lp = matchstr(getline(li), '^\s*\zs.\{-}\ze\s*$')
98           if !empty(lp)
99               let lp = substitute(lp, '\s\+', ' ', 'g')
100               let line .= ' | '. lp
101           endif
102       endfor
103   endif
104   return v:folddashes . line
105 endf
107 function! s:VikiFolds() "{{{3
108     let vikiFolds = tlib#var#Get('vikiFolds', 'bg')
109     " TLogVAR vikiFolds
110     if vikiFolds == 'ALL'
111         let vikiFolds = 'hlsfb'
112         " let vikiFolds = 'hHlsfb'
113     elseif vikiFolds == 'DEFAULT'
114         let vikiFolds = 'hf'
115     endif
116     " TLogVAR vikiFolds
117     return vikiFolds
118 endf
120 function! s:SetMaxLevel() "{{{3
121     let pos = getpos('.')
122     " TLogVAR b:vikiHeadingStart
123     let vikiHeadingRx = '\V\^'. b:vikiHeadingStart .'\+\ze\s'
124     let b:vikiHeadingMaxLevel = 0
125     exec 'keepjumps g/'. vikiHeadingRx .'/let l = matchend(getline("."), vikiHeadingRx) | if l > b:vikiHeadingMaxLevel | let b:vikiHeadingMaxLevel = l | endif'
126     " TLogVAR b:vikiHeadingMaxLevel
127     call setpos('.', pos)
128 endf
130 if g:vikiFoldMethodVersion == 5
132     function! VikiFoldLevel(lnum) "{{{3
133         " TLogVAR a:lnum
134         let vikiFolds = s:VikiFolds()
135         if vikiFolds =~# 'h'
136             " TLogVAR b:vikiHeadingStart
137             let lt = getline(a:lnum)
138             let fh = matchend(lt, '\V\^'. b:vikiHeadingStart .'\+\ze\s')
139             if fh != -1
140                 " TLogVAR fh, b:vikiHeadingMaxLevel
141                 if b:vikiHeadingMaxLevel == -1
142                     " TLogDBG 'SetMaxLevel'
143                     call s:SetMaxLevel()
144                 endif
145                 if fh > b:vikiHeadingMaxLevel
146                     let b:vikiHeadingMaxLevel = fh
147                 endif
148                 if vikiFolds =~# 'H'
149                     " TLogDBG 'inverse folds'
150                     let fh = b:vikiHeadingMaxLevel - fh + 1
151                 endif
152                 " TLogVAR fh, lt
153                 return '>'.fh
154             endif
155             let body_level = indent(a:lnum) / &sw + 1
156             return b:vikiHeadingMaxLevel + body_level
157         endif
158     endf
160 elseif g:vikiFoldMethodVersion == 4
162     function! VikiFoldLevel(lnum) "{{{3
163         " TLogVAR a:lnum
164         let vikiFolds = s:VikiFolds()
165         if vikiFolds =~# 'h'
166             " TLogVAR b:vikiHeadingStart
167             let lt = getline(a:lnum)
168             let fh = matchend(lt, '\V\^'. b:vikiHeadingStart .'\+\ze\s')
169             if fh != -1
170                 " TLogVAR fh, b:vikiHeadingMaxLevel
171                 if b:vikiHeadingMaxLevel == -1
172                     " TLogDBG 'SetMaxLevel'
173                     call s:SetMaxLevel()
174                 endif
175                 if fh > b:vikiHeadingMaxLevel
176                     let b:vikiHeadingMaxLevel = fh
177                 endif
178                 if vikiFolds =~# 'H'
179                     " TLogDBG 'inverse folds'
180                     let fh = b:vikiHeadingMaxLevel - fh + 1
181                 endif
182                 " TLogVAR fh, lt
183                 return '>'.fh
184             endif
185             if b:vikiHeadingMaxLevel <= 0
186                 return b:vikiHeadingMaxLevel + 1
187             else
188                 return '='
189             endif
190         endif
191     endf
193 elseif g:vikiFoldMethodVersion == 3
195     function! VikiFoldLevel(lnum) "{{{3
196         let lt = getline(a:lnum)
197         if lt !~ '\S'
198             return '='
199         endif
200         let fh = matchend(lt, '\V\^'. b:vikiHeadingStart .'\+\ze\s')
201         if fh != -1
202             " let fh += 1
203             if b:vikiHeadingMaxLevel == -1
204                 call s:SetMaxLevel()
205             endif
206             if fh > b:vikiHeadingMaxLevel
207                 let b:vikiHeadingMaxLevel = fh
208                 " TLogVAR b:vikiHeadingMaxLevel
209             endif
210             " TLogVAR fh
211             return fh
212         endif
213         let li = indent(a:lnum)
214         let tf = b:vikiHeadingMaxLevel + 1 + (li / &sw)
215         " TLogVAR tf
216         return tf
217     endf
219 elseif g:vikiFoldMethodVersion == 2
221     function! VikiFoldLevel(lnum) "{{{3
222         let lt = getline(a:lnum)
223         let fh = matchend(lt, '\V\^'. b:vikiHeadingStart .'\+\ze\s')
224         if fh != -1
225             return fh
226         endif
227         let ll = prevnonblank(a:lnum)
228         if ll != a:lnum
229             return '='
230         endif
231         let li = indent(a:lnum)
232         let pl = prevnonblank(a:lnum - 1)
233         let pi = indent(pl)
234         if li == pi || pl == 0
235             return '='
236         elseif li > pi
237             return 'a'. ((li - pi) / &sw)
238         else
239             return 's'. ((pi - li) / &sw)
240         endif
241     endf
243 else
245     function! VikiFoldLevel(lnum) "{{{3
246         let lc = getpos('.')
247         " TLogVAR lc
248         let w0 = line('w0')
249         let lr = &lazyredraw
250         set lazyredraw
251         try
252             let vikiFolds = s:VikiFolds()
253             if vikiFolds == ''
254                 " TLogDBG 'no folds'
255                 return
256             endif
257             if b:vikiHeadingMaxLevel == -1
258                 call s:SetMaxLevel()
259             endif
260             if vikiFolds =~# 'f'
261                 let idt = indent(a:lnum)
262                 if synIDattr(synID(a:lnum, idt, 1), 'name') =~ '^vikiFiles'
263                     call s:SetHeadingMaxLevel(1)
264                     " TLogDBG 'vikiFiles: '. idt
265                     return b:vikiHeadingMaxLevel + idt / &shiftwidth
266                 endif
267             endif
268             if stridx(vikiFolds, 'h') >= 0
269                 if vikiFolds =~? 'h'
270                     let fl = s:ScanHeading(a:lnum, a:lnum, vikiFolds)
271                     if fl != ''
272                         " TLogDBG 'heading: '. fl
273                         return fl
274                     endif
275                 endif
276                 if vikiFolds =~# 'l' 
277                     let list = s:MatchList(a:lnum)
278                     if list > 0
279                         call s:SetHeadingMaxLevel(1)
280                         " TLogVAR list
281                         " return '>'. (b:vikiHeadingMaxLevel + (list / &sw))
282                         return (b:vikiHeadingMaxLevel + (list / &sw))
283                     elseif getline(a:lnum) !~ '^[[:blank:]]' && s:MatchList(a:lnum - 1) > 0
284                         let fl = s:ScanHeading(a:lnum - 1, 1, vikiFolds)
285                         if fl != ''
286                             if fl[0] == '>'
287                                 let fl = strpart(fl, 1)
288                             endif
289                             " TLogDBG 'list indent: '. fl
290                             return '<'. (fl + 1)
291                         endif
292                     endif
293                 endif
294                 " I have no idea what this is about.
295                 " Is this about "inverse" folding?
296                 " if vikiFolds =~# 's'
297                 "     if exists('b:vikiFoldDef')
298                 "         exec b:vikiFoldDef
299                 "         if vikiFoldLine == a:lnum
300                 "             return vikiFoldLevel
301                 "         endif
302                 "     endif
303                 "     let i = 1
304                 "     while i > a:lnum
305                 "         let vfl = VikiFoldLevel(a:lnum - i)
306                 "         if vfl[0] == '>'
307                 "             let b:vikiFoldDef = 'let vikiFoldLine='. a:lnum 
308                 "                         \ .'|let vikiFoldLevel="'. vfl .'"'
309                 "             return vfl
310                 "         elseif vfl == '='
311                 "             let i = i + 1
312                 "         endif
313                 "     endwh
314                 " endif
315                 call s:SetHeadingMaxLevel(1)
316                 " if b:vikiHeadingMaxLevel == 0
317                 "     return 0
318                 " elseif vikiFolds =~# 'b'
319                 if vikiFolds =~# 'b'
320                     let bl = exists('b:vikiFoldBodyLevel') ? b:vikiFoldBodyLevel : g:vikiFoldBodyLevel
321                     if bl > 0
322                         " TLogDBG 'body: '. bl
323                         return bl
324                     else
325                         " TLogDBG 'body fallback: '. b:vikiHeadingMaxLevel
326                         return b:vikiHeadingMaxLevel + 1
327                     endif
328                 else
329                     " TLogDBG 'else'
330                     return "="
331                 endif
332             endif
333             " TLogDBG 'zero'
334             return 0
335         finally
336             exec 'norm! '. w0 .'zt'
337             " TLogVAR lc
338             call setpos('.', lc)
339             let &lazyredraw = lr
340         endtry
341     endfun
343     function! s:ScanHeading(lnum, top, vikiFolds) "{{{3
344         " TLogVAR a:lnum, a:top
345         let [lhead, head] = s:SearchHead(a:lnum, a:top)
346         " TLogVAR head
347         if head > 0
348             if head > b:vikiHeadingMaxLevel
349                 let b:vikiHeadingMaxLevel = head
350             endif
351             if b:vikiInverseFold || a:vikiFolds =~# 'H'
352                 if b:vikiMaxFoldLevel > head
353                     return ">". (b:vikiMaxFoldLevel - head)
354                 else
355                     return ">0"
356                 end
357             else
358                 return ">". head
359             endif
360         endif
361         return ''
362     endf
364     function! s:SetHeadingMaxLevel(once) "{{{3
365         if a:once && b:vikiHeadingMaxLevel == 0
366             return
367         endif
368         let pos = getpos('.')
369         " TLogVAR pos
370         try
371             silent! keepjumps exec 'g/\V\^'. b:vikiHeadingStart .'\+\s/call s:SetHeadingMaxLevelAtCurrentLine(line(".")'
372         finally
373             " TLogVAR pos
374             call setpos('.', pos)
375         endtry
376     endf
378     function! s:SetHeadingMaxLevelAtCurrentLine(lnum) "{{{3
379         let m = s:MatchHead(lnum)
380         if m > b:vikiHeadingMaxLevel
381             let b:vikiHeadingMaxLevel = m
382         endif
383     endf
385     function! s:SearchHead(lnum, top) "{{{3
386         let pos = getpos('.')
387         " TLogVAR pos
388         try
389             exec a:lnum
390             norm! $
391             let ln = search('\V\^'. b:vikiHeadingStart .'\+\s', 'bWcs', a:top)
392             if ln
393                 return [ln, s:MatchHead(ln)]
394             endif
395             return [0, 0]
396         finally
397             " TLogVAR pos
398             call setpos('.', pos)
399         endtry
400     endf
402     function! s:MatchHead(lnum) "{{{3
403         " let head = matchend(getline(a:lnum), '\V\^'. escape(b:vikiHeadingStart, '\') .'\ze\s\+')
404         return matchend(getline(a:lnum), '\V\^'. b:vikiHeadingStart .'\+\ze\s')
405     endf
407     function! s:MatchList(lnum) "{{{3
408         let rx = '^[[:blank:]]\+\ze\(#[A-F]\d\?\|#\d[A-F]\?\|[-+*#?@]\|[0-9#]\+\.\|[a-zA-Z?]\.\|.\{-1,}[[:blank:]]::\)[[:blank:]]'
409         return matchend(getline(a:lnum), rx)
410     endf
412 endif