codekingpro/portable-devtools
114k
1" Vim indent file2" Language: Makefile3" Maintainer: Doug Kearns <dougkearns@gmail.com>4" Previous Maintainer: Nikolai Weibull <now@bitwi.se>5" Last Change: 2022 Apr 066" 2025 Apr 22 by Vim Project: do not indent after special targets #171837 8if exists("b:did_indent")9 finish10endif11let b:did_indent = 112 13setlocal indentexpr=GetMakeIndent()14setlocal indentkeys=!^F,o,O,<:>,=else,=endif15setlocal nosmartindent16 17let b:undo_indent = "setl inde< indk< si<"18 19if exists("*GetMakeIndent")20 finish21endif22 23let s:comment_rx = '^\s*#'24let s:rule_rx = '^[^ \t#:][^#:]*:\{1,2}\%([^=:]\|$\)'25" .PHONY, .DELETE_ON_ERROR, etc26let s:rule_special = '^\.[A-Z_]\+\s*:'27let s:continued_rule_rx = '^[^#:]*:\{1,2}\%([^=:]\|$\)'28let s:continuation_rx = '\\$'29let s:assignment_rx = '^\s*\h\w*\s*[+:?]\==\s*\zs.*\\$'30let s:folded_assignment_rx = '^\s*\h\w*\s*[+:?]\=='31" TODO: This needs to be a lot more restrictive in what it matches.32let s:just_inserted_rule_rx = '^\s*[^#:]\+:\{1,2}$'33let s:conditional_directive_rx = '^ *\%(ifn\=\%(eq\|def\)\|else\)\>'34let s:end_conditional_directive_rx = '^\s*\%(else\|endif\)\>'35 36function s:remove_continuation(line)37 return substitute(a:line, s:continuation_rx, "", "")38endfunction39 40function GetMakeIndent()41 " TODO: Should this perhaps be v:lnum -1?42" let prev_lnum = prevnonblank(v:lnum - 1)43 let prev_lnum = v:lnum - 144 if prev_lnum == 045 return 046 endif47 let prev_line = getline(prev_lnum)48 49 let prev_prev_lnum = prev_lnum - 150 let prev_prev_line = prev_prev_lnum != 0 ? getline(prev_prev_lnum) : ""51 52 " TODO: Deal with comments. In comments, continuations aren't interesting.53 if prev_line =~ s:continuation_rx54 if prev_prev_line =~ s:continuation_rx55 return indent(prev_lnum)56 elseif prev_line =~ s:rule_rx && prev_line !~ s:rule_special57 return shiftwidth()58 elseif prev_line =~ s:assignment_rx59 call cursor(prev_lnum, 1)60 if search(s:assignment_rx, 'W') != 061 return virtcol('.') - 162 else63 " TODO: ?64 return shiftwidth()65 endif66 else67 " TODO: OK, this might be a continued shell command, so perhaps indent68 " properly here? Leave this out for now, but in the next release this69 " should be using indent/sh.vim somehow.70 "if prev_line =~ '^\t' " s:rule_command_rx71 " if prev_line =~ '^\s\+[@-]\%(if\)\>'72 " return indent(prev_lnum) + 273 " endif74 "endif75 return indent(prev_lnum) + shiftwidth()76 endif77 elseif prev_prev_line =~ s:continuation_rx78 let folded_line = s:remove_continuation(prev_prev_line) . ' ' . s:remove_continuation(prev_line)79 let lnum = prev_prev_lnum - 180 let line = getline(lnum)81 while line =~ s:continuation_rx82 let folded_line = s:remove_continuation(line) . ' ' . folded_line83 let lnum -= 184 let line = getline(lnum)85 endwhile86 let folded_lnum = lnum + 187 if folded_line =~ s:rule_rx && prev_line !~ s:rule_special88 if getline(v:lnum) =~ s:rule_rx && prev_line !~ s:rule_special89 return 090 else91 return &ts92 endif93 else94" elseif folded_line =~ s:folded_assignment_rx95 if getline(v:lnum) =~ s:rule_rx && prev_line !~ s:rule_special96 return 097 else98 return indent(folded_lnum)99 endif100" else101" " TODO: ?102" return indent(prev_lnum)103 endif104 elseif prev_line =~ s:rule_rx && prev_line !~ s:rule_special105 if getline(v:lnum) =~ s:rule_rx && prev_line !~ s:rule_special106 return 0107 else108 return &ts109 endif110 elseif prev_line =~ s:conditional_directive_rx111 return shiftwidth()112 else113 let line = getline(v:lnum)114 if line =~ s:just_inserted_rule_rx115 return 0116 elseif line =~ s:end_conditional_directive_rx117 return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1) - shiftwidth()118 else119 return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1)120 endif121 endif122endfunction123 