xref: /vim-8.2.3635/runtime/ftplugin/bzl.vim (revision e0e39175)
1" Vim filetype plugin file
2" Language:	Bazel (http://bazel.io)
3" Maintainer:	David Barnett (https://github.com/google/vim-ft-bzl)
4" Last Change:	2021 Jan 19
5
6""
7" @section Introduction, intro
8" Core settings for the bzl filetype, used for BUILD and *.bzl files for the
9" Bazel build system (http://bazel.io/).
10
11if exists('b:did_ftplugin')
12  finish
13endif
14
15
16" Vim 7.4.051 has opinionated settings in ftplugin/python.vim that try to force
17" PEP8 conventions on every python file, but these conflict with Google's
18" indentation guidelines. As a workaround, we explicitly source the system
19" ftplugin, but save indentation settings beforehand and restore them after.
20let s:save_expandtab = &l:expandtab
21let s:save_shiftwidth = &l:shiftwidth
22let s:save_softtabstop = &l:softtabstop
23let s:save_tabstop = &l:tabstop
24
25" NOTE: Vim versions before 7.3.511 had a ftplugin/python.vim that was broken
26" for compatible mode.
27let s:save_cpo = &cpo
28set cpo&vim
29
30" Load base python ftplugin (also defines b:did_ftplugin).
31source $VIMRUNTIME/ftplugin/python.vim
32
33" NOTE: Vim versions before 7.4.104 and later set this in ftplugin/python.vim.
34setlocal comments=b:#,fb:-
35
36" Restore pre-existing indentation settings.
37let &l:expandtab = s:save_expandtab
38let &l:shiftwidth = s:save_shiftwidth
39let &l:softtabstop = s:save_softtabstop
40let &l:tabstop = s:save_tabstop
41
42setlocal formatoptions-=t
43
44" Make gf work with imports in BUILD files.
45setlocal includeexpr=substitute(v:fname,'//','','')
46
47" Enable syntax-based folding, if specified.
48if get(g:, 'ft_bzl_fold', 0)
49  setlocal foldmethod=syntax
50  setlocal foldtext=BzlFoldText()
51endif
52
53if exists('*BzlFoldText')
54  let &cpo = s:save_cpo
55  unlet s:save_cpo
56  finish
57endif
58
59function BzlFoldText() abort
60  let l:start_num = nextnonblank(v:foldstart)
61  let l:end_num = prevnonblank(v:foldend)
62
63  if l:end_num <= l:start_num + 1
64    " If the fold is empty, don't print anything for the contents.
65    let l:content = ''
66  else
67    " Otherwise look for something matching the content regex.
68    " And if nothing matches, print an ellipsis.
69    let l:content = '...'
70    for l:line in getline(l:start_num + 1, l:end_num - 1)
71      let l:content_match = matchstr(l:line, '\m\C^\s*name = \zs.*\ze,$')
72      if !empty(l:content_match)
73        let l:content = l:content_match
74        break
75      endif
76    endfor
77  endif
78
79  " Enclose content with start and end
80  let l:start_text = getline(l:start_num)
81  let l:end_text = substitute(getline(l:end_num), '^\s*', '', '')
82  let l:text = l:start_text . ' ' . l:content . ' ' . l:end_text
83
84  " Compute the available width for the displayed text.
85  let l:width = winwidth(0) - &foldcolumn - (&number ? &numberwidth : 0)
86  let l:lines_folded = ' ' . string(1 + v:foldend - v:foldstart) . ' lines'
87
88  " Expand tabs, truncate, pad, and concatenate
89  let l:text = substitute(l:text, '\t', repeat(' ', &tabstop), 'g')
90  let l:text = strpart(l:text, 0, l:width - len(l:lines_folded))
91  let l:padding = repeat(' ', l:width - len(l:lines_folded) - len(l:text))
92  return l:text . l:padding . l:lines_folded
93endfunction
94
95let &cpo = s:save_cpo
96unlet s:save_cpo
97