xref: /vim-8.2.3635/runtime/indent/bzl.vim (revision 2bf24176)
1" Vim indent file
2" Language:	Bazel (http://bazel.io)
3" Maintainer:	David Barnett (https://github.com/google/vim-ft-bzl)
4" Last Change:	2015 Aug 11
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    " Vim 7.3.693 and later defines a shiftwidth() function to get the effective
45    " shiftwidth value. Fall back to &shiftwidth if the function doesn't exist.
46    let l:sw_expr = exists('*shiftwidth') ? 'shiftwidth()' : '&shiftwidth'
47    let g:pyindent_nested_paren = l:sw_expr . ' * 2'
48    let g:pyindent_open_paren = l:sw_expr . ' * 2'
49  endif
50
51  let l:indent = -1
52
53  " Indent inside parens.
54  " Align with the open paren unless it is at the end of the line.
55  " E.g.
56  "   open_paren_not_at_EOL(100,
57  "                         (200,
58  "                          300),
59  "                         400)
60  "   open_paren_at_EOL(
61  "       100, 200, 300, 400)
62  call cursor(a:lnum, 1)
63  let [l:par_line, l:par_col] = searchpairpos('(\|{\|\[', '', ')\|}\|\]', 'bW',
64      \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" .
65      \ " synIDattr(synID(line('.'), col('.'), 1), 'name')" .
66      \ " =~ '\\(Comment\\|String\\)$'")
67  if l:par_line > 0
68    call cursor(l:par_line, 1)
69    if l:par_col != col('$') - 1
70      let l:indent = l:par_col
71    endif
72  endif
73
74  " Delegate the rest to the original function.
75  if l:indent == -1
76    let l:indent = GetPythonIndent(a:lnum)
77  endif
78
79  if l:use_recursive_indent
80    " Restore global variables.
81    if exists('l:pyindent_nested_paren')
82      let g:pyindent_nested_paren = l:pyindent_nested_paren
83    else
84      unlet g:pyindent_nested_paren
85    endif
86    if exists('l:pyindent_open_paren')
87      let g:pyindent_open_paren = l:pyindent_open_paren
88    else
89      unlet g:pyindent_open_paren
90    endif
91  endif
92
93  return l:indent
94endfunction
95
96let &cpo = s:save_cpo
97unlet s:save_cpo
98