From f028cfae59d793753829ad54a1a4842440e36d64 Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Tue, 26 Jul 2016 13:58:55 +0200 Subject: Add lua --- indent/lua.vim | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 indent/lua.vim (limited to 'indent') diff --git a/indent/lua.vim b/indent/lua.vim new file mode 100644 index 00000000..901ac854 --- /dev/null +++ b/indent/lua.vim @@ -0,0 +1,126 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'lua') == -1 + +" Vim indent file +" Language: Lua +" URL: https://github.com/tbastos/vim-lua + +" Initialization ------------------------------------------{{{1 + +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal autoindent +setlocal nosmartindent + +setlocal indentexpr=GetLuaIndent() +setlocal indentkeys+=0=end,0=until,0=elseif,0=else + +" Only define the function once. +if exists("*GetLuaIndent") + finish +endif + +" Variables -----------------------------------------------{{{1 + +let s:open_patt = '\%(\<\%(function\|if\|repeat\|do\)\>\|(\|{\)' +let s:middle_patt = '\<\%(else\|elseif\)\>' +let s:close_patt = '\%(\<\%(end\|until\)\>\|)\|}\)' + +let s:anon_func_start = '\S\+\s*[({].*\ 0 + let i += num_pairs + endif + + " special case: call(with, {anon = function() -- should indent only once + if num_pairs > 1 && contents_prev =~ s:anon_func_start + let i = 1 + endif + + " check if current line closes blocks + call cursor(prev_line, col([prev_line,'$'])) + let num_pairs = searchpair(s:open_patt, s:middle_patt, s:close_patt, + \ 'mr', s:skip_expr, v:lnum) + if num_pairs > 0 + let i -= num_pairs + endif + + " special case: end}) -- end of call with anon func should unindent once + if num_pairs > 1 && contents_cur =~ s:anon_func_end + let i = -1 + endif + + " if the previous line closed a paren, unindent (except with anon funcs) + call cursor(prev_line - 1, col([prev_line - 1, '$'])) + let num_pairs = searchpair('(', '', ')', 'mr', s:skip_expr, prev_line) + if num_pairs > 0 && contents_prev !~ s:anon_func_end + let i -= 1 + endif + + " if this line closed a paren, indent (except with anon funcs) + call cursor(prev_line, col([prev_line, '$'])) + let num_pairs = searchpair('(', '', ')', 'mr', s:skip_expr, v:lnum) + if num_pairs > 0 && contents_cur !~ s:anon_func_end + let i += 1 + endif + + " restore cursor + call setpos(".", original_cursor_pos) + + return indent(prev_line) + (&sw * i) + +endfunction + +endif -- cgit v1.2.3