Mercurial > vim
comparison runtime/indent/bst.vim @ 1125:96cd8222a819
updated for version 7.1a
author | vimboss |
---|---|
date | Sat, 05 May 2007 18:24:42 +0000 |
parents | |
children | 7bc41231fbc7 |
comparison
equal
deleted
inserted
replaced
1124:da2a955f150a | 1125:96cd8222a819 |
---|---|
1 " Vim indent file | |
2 " Language: bst | |
3 " Author: Tim Pope <vimNOSPAM@tpope.info> | |
4 " $Id$ | |
5 | |
6 if exists("b:did_indent") | |
7 finish | |
8 endif | |
9 let b:did_indent = 1 | |
10 | |
11 setlocal expandtab | |
12 setlocal indentexpr=GetBstIndent(v:lnum) | |
13 "setlocal smartindent | |
14 setlocal cinkeys& | |
15 setlocal cinkeys-=0# | |
16 setlocal indentkeys& | |
17 "setlocal indentkeys+=0% | |
18 | |
19 " Only define the function once. | |
20 if exists("*GetBstIndent") | |
21 finish | |
22 endif | |
23 | |
24 function! s:prevgood(lnum) | |
25 " Find a non-blank line above the current line. | |
26 " Skip over comments. | |
27 let lnum = a:lnum | |
28 while lnum > 0 | |
29 let lnum = prevnonblank(lnum - 1) | |
30 if getline(lnum) !~ '^\s*%.*$' | |
31 break | |
32 endif | |
33 endwhile | |
34 return lnum | |
35 endfunction | |
36 | |
37 function! s:strip(lnum) | |
38 let line = getline(a:lnum) | |
39 let line = substitute(line,'"[^"]*"','""','g') | |
40 let line = substitute(line,'%.*','','') | |
41 let line = substitute(line,'^\s\+','','') | |
42 return line | |
43 endfunction | |
44 | |
45 function! s:count(string,char) | |
46 let str = substitute(a:string,'[^'.a:char.']','','g') | |
47 return strlen(str) | |
48 endfunction | |
49 | |
50 function! GetBstIndent(lnum) abort | |
51 if a:lnum == 1 | |
52 return 0 | |
53 endif | |
54 let lnum = s:prevgood(a:lnum) | |
55 if lnum <= 0 | |
56 return indent(a:lnum - 1) | |
57 endif | |
58 let line = s:strip(lnum) | |
59 let cline = s:strip(a:lnum) | |
60 if cline =~ '^}' && exists("b:current_syntax") | |
61 call cursor(a:lnum,indent(a:lnum)) | |
62 if searchpair('{','','}','bW',"synIDattr(synID(line('.'),col('.'),1),'name') =~? 'comment\\|string'") | |
63 if col('.')+1 == col('$') | |
64 return indent('.') | |
65 else | |
66 return virtcol('.')-1 | |
67 endif | |
68 endif | |
69 endif | |
70 let fakeline = substitute(line,'^}','','').matchstr(cline,'^}') | |
71 let ind = indent(lnum) | |
72 let ind = ind + &sw * s:count(line,'{') | |
73 let ind = ind - &sw * s:count(fakeline,'}') | |
74 return ind | |
75 endfunction |