diff runtime/indent/bzl.vim @ 7176:30042ddff503

commit https://github.com/vim/vim/commit/60cce2fb736c8ff6fdb9603f502d3c15f1f7a25d Author: Bram Moolenaar <Bram@vim.org> Date: Tue Oct 13 23:21:27 2015 +0200 Update runtime files.
author Christian Brabandt <cb@256bit.org>
date Tue, 13 Oct 2015 23:30:05 +0200
parents
children 63b0b7b79b25
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/runtime/indent/bzl.vim
@@ -0,0 +1,97 @@
+" Vim indent file
+" Language:	Bazel (http://bazel.io)
+" Maintainer:	David Barnett (https://github.com/google/vim-ft-bzl)
+" Last Change:	2015 Aug 11
+
+if exists('b:did_indent')
+  finish
+endif
+
+" Load base python indent.
+if !exists('*GetPythonIndent')
+  runtime! indent/python.vim
+endif
+
+let b:did_indent = 1
+
+" Only enable bzl google indent if python google indent is enabled.
+if !get(g:, 'no_google_python_indent')
+  setlocal indentexpr=GetBzlIndent(v:lnum)
+endif
+
+if exists('*GetBzlIndent')
+  finish
+endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Maximum number of lines to look backwards.
+let s:maxoff = 50
+
+""
+" Determine the correct indent level given an {lnum} in the current buffer.
+function GetBzlIndent(lnum) abort
+  let l:use_recursive_indent = !get(g:, 'no_google_python_recursive_indent')
+  if l:use_recursive_indent
+    " Backup and override indent setting variables.
+    if exists('g:pyindent_nested_paren')
+      let l:pyindent_nested_paren = g:pyindent_nested_paren
+    endif
+    if exists('g:pyindent_open_paren')
+      let l:pyindent_open_paren = g:pyindent_open_paren
+    endif
+    " Vim 7.3.693 and later defines a shiftwidth() function to get the effective
+    " shiftwidth value. Fall back to &shiftwidth if the function doesn't exist.
+    let l:sw_expr = exists('*shiftwidth') ? 'shiftwidth()' : '&shiftwidth'
+    let g:pyindent_nested_paren = l:sw_expr . ' * 2'
+    let g:pyindent_open_paren = l:sw_expr . ' * 2'
+  endif
+
+  let l:indent = -1
+
+  " Indent inside parens.
+  " Align with the open paren unless it is at the end of the line.
+  " E.g.
+  "   open_paren_not_at_EOL(100,
+  "                         (200,
+  "                          300),
+  "                         400)
+  "   open_paren_at_EOL(
+  "       100, 200, 300, 400)
+  call cursor(a:lnum, 1)
+  let [l:par_line, l:par_col] = searchpairpos('(\|{\|\[', '', ')\|}\|\]', 'bW',
+      \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" .
+      \ " synIDattr(synID(line('.'), col('.'), 1), 'name')" .
+      \ " =~ '\\(Comment\\|String\\)$'")
+  if l:par_line > 0
+    call cursor(l:par_line, 1)
+    if l:par_col != col('$') - 1
+      let l:indent = l:par_col
+    endif
+  endif
+
+  " Delegate the rest to the original function.
+  if l:indent == -1
+    let l:indent = GetPythonIndent(a:lnum)
+  endif
+
+  if l:use_recursive_indent
+    " Restore global variables.
+    if exists('l:pyindent_nested_paren')
+      let g:pyindent_nested_paren = l:pyindent_nested_paren
+    else
+      unlet g:pyindent_nested_paren
+    endif
+    if exists('l:pyindent_open_paren')
+      let g:pyindent_open_paren = l:pyindent_open_paren
+    else
+      unlet g:pyindent_open_paren
+    endif
+  endif
+
+  return l:indent
+endfunction
+
+let &cpo = s:save_cpo
+unlet s:save_cpo