xref: /vim-8.2.3635/runtime/ftplugin/bzl.vim (revision e0e39175)
160cce2fbSBram Moolenaar" Vim filetype plugin file
260cce2fbSBram Moolenaar" Language:	Bazel (http://bazel.io)
360cce2fbSBram Moolenaar" Maintainer:	David Barnett (https://github.com/google/vim-ft-bzl)
4*e0e39175SBram Moolenaar" Last Change:	2021 Jan 19
560cce2fbSBram Moolenaar
660cce2fbSBram Moolenaar""
760cce2fbSBram Moolenaar" @section Introduction, intro
860cce2fbSBram Moolenaar" Core settings for the bzl filetype, used for BUILD and *.bzl files for the
960cce2fbSBram Moolenaar" Bazel build system (http://bazel.io/).
1060cce2fbSBram Moolenaar
1160cce2fbSBram Moolenaarif exists('b:did_ftplugin')
1260cce2fbSBram Moolenaar  finish
1360cce2fbSBram Moolenaarendif
1460cce2fbSBram Moolenaar
1560cce2fbSBram Moolenaar
1660cce2fbSBram Moolenaar" Vim 7.4.051 has opinionated settings in ftplugin/python.vim that try to force
1760cce2fbSBram Moolenaar" PEP8 conventions on every python file, but these conflict with Google's
1860cce2fbSBram Moolenaar" indentation guidelines. As a workaround, we explicitly source the system
1960cce2fbSBram Moolenaar" ftplugin, but save indentation settings beforehand and restore them after.
2060cce2fbSBram Moolenaarlet s:save_expandtab = &l:expandtab
2160cce2fbSBram Moolenaarlet s:save_shiftwidth = &l:shiftwidth
2260cce2fbSBram Moolenaarlet s:save_softtabstop = &l:softtabstop
2360cce2fbSBram Moolenaarlet s:save_tabstop = &l:tabstop
2460cce2fbSBram Moolenaar
2560cce2fbSBram Moolenaar" NOTE: Vim versions before 7.3.511 had a ftplugin/python.vim that was broken
2660cce2fbSBram Moolenaar" for compatible mode.
2760cce2fbSBram Moolenaarlet s:save_cpo = &cpo
2860cce2fbSBram Moolenaarset cpo&vim
2960cce2fbSBram Moolenaar
3060cce2fbSBram Moolenaar" Load base python ftplugin (also defines b:did_ftplugin).
3160cce2fbSBram Moolenaarsource $VIMRUNTIME/ftplugin/python.vim
3260cce2fbSBram Moolenaar
3360cce2fbSBram Moolenaar" NOTE: Vim versions before 7.4.104 and later set this in ftplugin/python.vim.
3460cce2fbSBram Moolenaarsetlocal comments=b:#,fb:-
3560cce2fbSBram Moolenaar
3660cce2fbSBram Moolenaar" Restore pre-existing indentation settings.
3760cce2fbSBram Moolenaarlet &l:expandtab = s:save_expandtab
3860cce2fbSBram Moolenaarlet &l:shiftwidth = s:save_shiftwidth
3960cce2fbSBram Moolenaarlet &l:softtabstop = s:save_softtabstop
4060cce2fbSBram Moolenaarlet &l:tabstop = s:save_tabstop
4160cce2fbSBram Moolenaar
4260cce2fbSBram Moolenaarsetlocal formatoptions-=t
4360cce2fbSBram Moolenaar
4460cce2fbSBram Moolenaar" Make gf work with imports in BUILD files.
4560cce2fbSBram Moolenaarsetlocal includeexpr=substitute(v:fname,'//','','')
4660cce2fbSBram Moolenaar
4760cce2fbSBram Moolenaar" Enable syntax-based folding, if specified.
4860cce2fbSBram Moolenaarif get(g:, 'ft_bzl_fold', 0)
4960cce2fbSBram Moolenaar  setlocal foldmethod=syntax
5060cce2fbSBram Moolenaar  setlocal foldtext=BzlFoldText()
5160cce2fbSBram Moolenaarendif
5260cce2fbSBram Moolenaar
5360cce2fbSBram Moolenaarif exists('*BzlFoldText')
54*e0e39175SBram Moolenaar  let &cpo = s:save_cpo
55*e0e39175SBram Moolenaar  unlet s:save_cpo
5660cce2fbSBram Moolenaar  finish
5760cce2fbSBram Moolenaarendif
5860cce2fbSBram Moolenaar
5960cce2fbSBram Moolenaarfunction BzlFoldText() abort
6060cce2fbSBram Moolenaar  let l:start_num = nextnonblank(v:foldstart)
6160cce2fbSBram Moolenaar  let l:end_num = prevnonblank(v:foldend)
6260cce2fbSBram Moolenaar
6360cce2fbSBram Moolenaar  if l:end_num <= l:start_num + 1
6460cce2fbSBram Moolenaar    " If the fold is empty, don't print anything for the contents.
6560cce2fbSBram Moolenaar    let l:content = ''
6660cce2fbSBram Moolenaar  else
6760cce2fbSBram Moolenaar    " Otherwise look for something matching the content regex.
6860cce2fbSBram Moolenaar    " And if nothing matches, print an ellipsis.
6960cce2fbSBram Moolenaar    let l:content = '...'
7060cce2fbSBram Moolenaar    for l:line in getline(l:start_num + 1, l:end_num - 1)
7160cce2fbSBram Moolenaar      let l:content_match = matchstr(l:line, '\m\C^\s*name = \zs.*\ze,$')
7260cce2fbSBram Moolenaar      if !empty(l:content_match)
7360cce2fbSBram Moolenaar        let l:content = l:content_match
7460cce2fbSBram Moolenaar        break
7560cce2fbSBram Moolenaar      endif
7660cce2fbSBram Moolenaar    endfor
7760cce2fbSBram Moolenaar  endif
7860cce2fbSBram Moolenaar
7960cce2fbSBram Moolenaar  " Enclose content with start and end
8060cce2fbSBram Moolenaar  let l:start_text = getline(l:start_num)
8160cce2fbSBram Moolenaar  let l:end_text = substitute(getline(l:end_num), '^\s*', '', '')
8260cce2fbSBram Moolenaar  let l:text = l:start_text . ' ' . l:content . ' ' . l:end_text
8360cce2fbSBram Moolenaar
8460cce2fbSBram Moolenaar  " Compute the available width for the displayed text.
8560cce2fbSBram Moolenaar  let l:width = winwidth(0) - &foldcolumn - (&number ? &numberwidth : 0)
8660cce2fbSBram Moolenaar  let l:lines_folded = ' ' . string(1 + v:foldend - v:foldstart) . ' lines'
8760cce2fbSBram Moolenaar
8860cce2fbSBram Moolenaar  " Expand tabs, truncate, pad, and concatenate
8960cce2fbSBram Moolenaar  let l:text = substitute(l:text, '\t', repeat(' ', &tabstop), 'g')
9060cce2fbSBram Moolenaar  let l:text = strpart(l:text, 0, l:width - len(l:lines_folded))
9160cce2fbSBram Moolenaar  let l:padding = repeat(' ', l:width - len(l:lines_folded) - len(l:text))
9260cce2fbSBram Moolenaar  return l:text . l:padding . l:lines_folded
9360cce2fbSBram Moolenaarendfunction
9460cce2fbSBram Moolenaar
9560cce2fbSBram Moolenaarlet &cpo = s:save_cpo
9660cce2fbSBram Moolenaarunlet s:save_cpo
97