neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

bst.vim (1907B)


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