xref: /vim-8.2.3635/runtime/indent/bst.vim (revision 3ec574f2)
1" Vim indent file
2" Language:	bst
3" Author:	Tim Pope <[email protected]>
4" $Id: bst.vim,v 1.1 2007/05/05 18:11:12 vimboss Exp $
5
6if exists("b:did_indent")
7    finish
8endif
9let b:did_indent = 1
10
11setlocal expandtab
12setlocal indentexpr=GetBstIndent(v:lnum)
13"setlocal smartindent
14setlocal cinkeys&
15setlocal cinkeys-=0#
16setlocal indentkeys&
17"setlocal indentkeys+=0%
18
19" Only define the function once.
20if exists("*GetBstIndent")
21    finish
22endif
23
24function! 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
35endfunction
36
37function! 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
43endfunction
44
45function! s:count(string,char)
46    let str = substitute(a:string,'[^'.a:char.']','','g')
47    return strlen(str)
48endfunction
49
50function! 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 + shiftwidth() * s:count(line,'{')
73    let ind = ind - shiftwidth() * s:count(fakeline,'}')
74    return ind
75endfunction
76