diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 08:50:31 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 08:50:31 +0000 |
commit | aed8ce9da277f5ecffe968b324f242c41c3b752a (patch) | |
tree | d2e538394cb7a8a7c42a4aac6ccf1a8e3256999b /runtime/indent/make.vim | |
parent | Initial commit. (diff) | |
download | vim-aed8ce9da277f5ecffe968b324f242c41c3b752a.tar.xz vim-aed8ce9da277f5ecffe968b324f242c41c3b752a.zip |
Adding upstream version 2:9.0.1378.upstream/2%9.0.1378upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'runtime/indent/make.vim')
-rw-r--r-- | runtime/indent/make.vim | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/runtime/indent/make.vim b/runtime/indent/make.vim new file mode 100644 index 0000000..4d1838b --- /dev/null +++ b/runtime/indent/make.vim @@ -0,0 +1,119 @@ +" Vim indent file +" Language: Makefile +" Maintainer: Doug Kearns <dougkearns@gmail.com> +" Previous Maintainer: Nikolai Weibull <now@bitwi.se> +" Last Change: 2022 Apr 06 + +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal indentexpr=GetMakeIndent() +setlocal indentkeys=!^F,o,O,<:>,=else,=endif +setlocal nosmartindent + +let b:undo_indent = "setl inde< indk< si<" + +if exists("*GetMakeIndent") + finish +endif + +let s:comment_rx = '^\s*#' +let s:rule_rx = '^[^ \t#:][^#:]*:\{1,2}\%([^=:]\|$\)' +let s:continued_rule_rx = '^[^#:]*:\{1,2}\%([^=:]\|$\)' +let s:continuation_rx = '\\$' +let s:assignment_rx = '^\s*\h\w*\s*[+:?]\==\s*\zs.*\\$' +let s:folded_assignment_rx = '^\s*\h\w*\s*[+:?]\==' +" TODO: This needs to be a lot more restrictive in what it matches. +let s:just_inserted_rule_rx = '^\s*[^#:]\+:\{1,2}$' +let s:conditional_directive_rx = '^ *\%(ifn\=\%(eq\|def\)\|else\)\>' +let s:end_conditional_directive_rx = '^\s*\%(else\|endif\)\>' + +function s:remove_continuation(line) + return substitute(a:line, s:continuation_rx, "", "") +endfunction + +function GetMakeIndent() + " TODO: Should this perhaps be v:lnum -1? +" let prev_lnum = prevnonblank(v:lnum - 1) + let prev_lnum = v:lnum - 1 + if prev_lnum == 0 + return 0 + endif + let prev_line = getline(prev_lnum) + + let prev_prev_lnum = prev_lnum - 1 + let prev_prev_line = prev_prev_lnum != 0 ? getline(prev_prev_lnum) : "" + + " TODO: Deal with comments. In comments, continuations aren't interesting. + if prev_line =~ s:continuation_rx + if prev_prev_line =~ s:continuation_rx + return indent(prev_lnum) + elseif prev_line =~ s:rule_rx + return shiftwidth() + elseif prev_line =~ s:assignment_rx + call cursor(prev_lnum, 1) + if search(s:assignment_rx, 'W') != 0 + return virtcol('.') - 1 + else + " TODO: ? + return shiftwidth() + endif + else + " TODO: OK, this might be a continued shell command, so perhaps indent + " properly here? Leave this out for now, but in the next release this + " should be using indent/sh.vim somehow. + "if prev_line =~ '^\t' " s:rule_command_rx + " if prev_line =~ '^\s\+[@-]\%(if\)\>' + " return indent(prev_lnum) + 2 + " endif + "endif + return indent(prev_lnum) + shiftwidth() + endif + elseif prev_prev_line =~ s:continuation_rx + let folded_line = s:remove_continuation(prev_prev_line) . ' ' . s:remove_continuation(prev_line) + let lnum = prev_prev_lnum - 1 + let line = getline(lnum) + while line =~ s:continuation_rx + let folded_line = s:remove_continuation(line) . ' ' . folded_line + let lnum -= 1 + let line = getline(lnum) + endwhile + let folded_lnum = lnum + 1 + if folded_line =~ s:rule_rx + if getline(v:lnum) =~ s:rule_rx + return 0 + else + return &ts + endif + else +" elseif folded_line =~ s:folded_assignment_rx + if getline(v:lnum) =~ s:rule_rx + return 0 + else + return indent(folded_lnum) + endif +" else +" " TODO: ? +" return indent(prev_lnum) + endif + elseif prev_line =~ s:rule_rx + if getline(v:lnum) =~ s:rule_rx + return 0 + else + return &ts + endif + elseif prev_line =~ s:conditional_directive_rx + return shiftwidth() + else + let line = getline(v:lnum) + if line =~ s:just_inserted_rule_rx + return 0 + elseif line =~ s:end_conditional_directive_rx + return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1) - shiftwidth() + else + return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1) + endif + endif +endfunction |