1" Vim indent file 2" Language: Bazel (http://bazel.io) 3" Maintainer: David Barnett (https://github.com/google/vim-ft-bzl) 4" Last Change: 2021 Jul 08 5 6if exists('b:did_indent') 7 finish 8endif 9 10" Load base python indent. 11if !exists('*GetPythonIndent') 12 runtime! indent/python.vim 13endif 14 15let b:did_indent = 1 16 17" Only enable bzl google indent if python google indent is enabled. 18if !get(g:, 'no_google_python_indent') 19 setlocal indentexpr=GetBzlIndent(v:lnum) 20endif 21 22if exists('*GetBzlIndent') 23 finish 24endif 25 26let s:save_cpo = &cpo 27set cpo-=C 28 29" Maximum number of lines to look backwards. 30let s:maxoff = 50 31 32"" 33" Determine the correct indent level given an {lnum} in the current buffer. 34function GetBzlIndent(lnum) abort 35 let l:use_recursive_indent = !get(g:, 'no_google_python_recursive_indent') 36 if l:use_recursive_indent 37 " Backup and override indent setting variables. 38 if exists('g:pyindent_nested_paren') 39 let l:pyindent_nested_paren = g:pyindent_nested_paren 40 endif 41 if exists('g:pyindent_open_paren') 42 let l:pyindent_open_paren = g:pyindent_open_paren 43 endif 44 let g:pyindent_nested_paren = 'shiftwidth()' 45 let g:pyindent_open_paren = 'shiftwidth()' 46 endif 47 48 let l:indent = -1 49 50 call cursor(a:lnum, 1) 51 let [l:par_line, l:par_col] = searchpairpos('(\|{\|\[', '', ')\|}\|\]', 'bW', 52 \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" . 53 \ " synIDattr(synID(line('.'), col('.'), 1), 'name')" . 54 \ " =~ '\\(Comment\\|String\\)$'") 55 if l:par_line > 0 56 " Indent inside parens. 57 if searchpair('(\|{\|\[', '', ')\|}\|\]', 'W', 58 \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" . 59 \ " synIDattr(synID(line('.'), col('.'), 1), 'name')" . 60 \ " =~ '\\(Comment\\|String\\)$'") && line('.') == a:lnum 61 " If cursor is at close parens, match indent with open parens. 62 " E.g. 63 " foo( 64 " ) 65 let l:indent = indent(l:par_line) 66 else 67 " Align with the open paren unless it is at the end of the line. 68 " E.g. 69 " open_paren_not_at_EOL(100, 70 " (200, 71 " 300), 72 " 400) 73 " open_paren_at_EOL( 74 " 100, 200, 300, 400) 75 call cursor(l:par_line, 1) 76 if l:par_col != col('$') - 1 77 let l:indent = l:par_col 78 endif 79 endif 80 endif 81 82 " Delegate the rest to the original function. 83 if l:indent == -1 84 let l:indent = GetPythonIndent(a:lnum) 85 endif 86 87 if l:use_recursive_indent 88 " Restore global variables. 89 if exists('l:pyindent_nested_paren') 90 let g:pyindent_nested_paren = l:pyindent_nested_paren 91 else 92 unlet g:pyindent_nested_paren 93 endif 94 if exists('l:pyindent_open_paren') 95 let g:pyindent_open_paren = l:pyindent_open_paren 96 else 97 unlet g:pyindent_open_paren 98 endif 99 endif 100 101 return l:indent 102endfunction 103 104let &cpo = s:save_cpo 105unlet s:save_cpo 106