1071d4279SBram Moolenaar" Vim indent file 2071d4279SBram Moolenaar" Language: Makefile 3*6e649224SBram Moolenaar" Maintainer: Doug Kearns <[email protected]> 4214641f7SBram Moolenaar" Previous Maintainer: Nikolai Weibull <[email protected]> 5*6e649224SBram Moolenaar" Last Change: 24 Sep 2021 6071d4279SBram Moolenaar 7071d4279SBram Moolenaarif exists("b:did_indent") 8071d4279SBram Moolenaar finish 9071d4279SBram Moolenaarendif 10071d4279SBram Moolenaarlet b:did_indent = 1 11071d4279SBram Moolenaar 12071d4279SBram Moolenaarsetlocal indentexpr=GetMakeIndent() 132bb8df23SBram Moolenaarsetlocal indentkeys=!^F,o,O,<:>,=else,=endif 14f193fffdSBram Moolenaarsetlocal nosmartindent 15071d4279SBram Moolenaar 16*6e649224SBram Moolenaarlet b:undo_indent = "setl ai< inde< indk<" 17*6e649224SBram Moolenaar 18071d4279SBram Moolenaarif exists("*GetMakeIndent") 19071d4279SBram Moolenaar finish 20071d4279SBram Moolenaarendif 21071d4279SBram Moolenaar 222bb8df23SBram Moolenaarlet s:comment_rx = '^\s*#' 2357657d85SBram Moolenaarlet s:rule_rx = '^[^ \t#:][^#:]*:\{1,2}\%([^=:]\|$\)' 242bb8df23SBram Moolenaarlet s:continued_rule_rx = '^[^#:]*:\{1,2}\%([^=:]\|$\)' 2557657d85SBram Moolenaarlet s:continuation_rx = '\\$' 264c295027SBram Moolenaarlet s:assignment_rx = '^\s*\h\w*\s*[+:?]\==\s*\zs.*\\$' 274c295027SBram Moolenaarlet s:folded_assignment_rx = '^\s*\h\w*\s*[+:?]\==' 282bb8df23SBram Moolenaar" TODO: This needs to be a lot more restrictive in what it matches. 292bb8df23SBram Moolenaarlet s:just_inserted_rule_rx = '^\s*[^#:]\+:\{1,2}$' 302bb8df23SBram Moolenaarlet s:conditional_directive_rx = '^ *\%(ifn\=\%(eq\|def\)\|else\)\>' 312bb8df23SBram Moolenaarlet s:end_conditional_directive_rx = '^\s*\%(else\|endif\)\>' 32071d4279SBram Moolenaar 332bb8df23SBram Moolenaarfunction s:remove_continuation(line) 342bb8df23SBram Moolenaar return substitute(a:line, s:continuation_rx, "", "") 352bb8df23SBram Moolenaarendfunction 362bb8df23SBram Moolenaar 37071d4279SBram Moolenaarfunction GetMakeIndent() 382bb8df23SBram Moolenaar " TODO: Should this perhaps be v:lnum -1? 392bb8df23SBram Moolenaar" let prev_lnum = prevnonblank(v:lnum - 1) 402bb8df23SBram Moolenaar let prev_lnum = v:lnum - 1 412bb8df23SBram Moolenaar if prev_lnum == 0 42071d4279SBram Moolenaar return 0 43071d4279SBram Moolenaar endif 442bb8df23SBram Moolenaar let prev_line = getline(prev_lnum) 45071d4279SBram Moolenaar 462bb8df23SBram Moolenaar let prev_prev_lnum = prev_lnum - 1 472bb8df23SBram Moolenaar let prev_prev_line = prev_prev_lnum != 0 ? getline(prev_prev_lnum) : "" 482bb8df23SBram Moolenaar 492bb8df23SBram Moolenaar " TODO: Deal with comments. In comments, continuations aren't interesting. 502bb8df23SBram Moolenaar if prev_line =~ s:continuation_rx 512bb8df23SBram Moolenaar if prev_prev_line =~ s:continuation_rx 522bb8df23SBram Moolenaar return indent(prev_lnum) 532bb8df23SBram Moolenaar elseif prev_line =~ s:rule_rx 54036986f1SBram Moolenaar return shiftwidth() 552bb8df23SBram Moolenaar elseif prev_line =~ s:assignment_rx 562bb8df23SBram Moolenaar call cursor(prev_lnum, 1) 572bb8df23SBram Moolenaar if search(s:assignment_rx, 'W') != 0 582bb8df23SBram Moolenaar return virtcol('.') - 1 592bb8df23SBram Moolenaar else 602bb8df23SBram Moolenaar " TODO: ? 61036986f1SBram Moolenaar return shiftwidth() 622bb8df23SBram Moolenaar endif 632bb8df23SBram Moolenaar else 642bb8df23SBram Moolenaar " TODO: OK, this might be a continued shell command, so perhaps indent 652bb8df23SBram Moolenaar " properly here? Leave this out for now, but in the next release this 662bb8df23SBram Moolenaar " should be using indent/sh.vim somehow. 672bb8df23SBram Moolenaar "if prev_line =~ '^\t' " s:rule_command_rx 682bb8df23SBram Moolenaar " if prev_line =~ '^\s\+[@-]\%(if\)\>' 692bb8df23SBram Moolenaar " return indent(prev_lnum) + 2 702bb8df23SBram Moolenaar " endif 712bb8df23SBram Moolenaar "endif 72036986f1SBram Moolenaar return indent(prev_lnum) + shiftwidth() 732bb8df23SBram Moolenaar endif 742bb8df23SBram Moolenaar elseif prev_prev_line =~ s:continuation_rx 752bb8df23SBram Moolenaar let folded_line = s:remove_continuation(prev_prev_line) . ' ' . s:remove_continuation(prev_line) 762bb8df23SBram Moolenaar let lnum = prev_prev_lnum - 1 7742eeac35SBram Moolenaar let line = getline(lnum) 782bb8df23SBram Moolenaar while line =~ s:continuation_rx 792bb8df23SBram Moolenaar let folded_line = s:remove_continuation(line) . ' ' . folded_line 80f193fffdSBram Moolenaar let lnum -= 1 81f193fffdSBram Moolenaar let line = getline(lnum) 822bb8df23SBram Moolenaar endwhile 832bb8df23SBram Moolenaar let folded_lnum = lnum + 1 842bb8df23SBram Moolenaar if folded_line =~ s:rule_rx 852bb8df23SBram Moolenaar if getline(v:lnum) =~ s:rule_rx 862bb8df23SBram Moolenaar return 0 872bb8df23SBram Moolenaar else 882bb8df23SBram Moolenaar return &ts 89f193fffdSBram Moolenaar endif 902bb8df23SBram Moolenaar else 912bb8df23SBram Moolenaar" elseif folded_line =~ s:folded_assignment_rx 922bb8df23SBram Moolenaar if getline(v:lnum) =~ s:rule_rx 932bb8df23SBram Moolenaar return 0 942bb8df23SBram Moolenaar else 952bb8df23SBram Moolenaar return indent(folded_lnum) 962bb8df23SBram Moolenaar endif 972bb8df23SBram Moolenaar" else 982bb8df23SBram Moolenaar" " TODO: ? 992bb8df23SBram Moolenaar" return indent(prev_lnum) 1002bb8df23SBram Moolenaar endif 1012bb8df23SBram Moolenaar elseif prev_line =~ s:rule_rx 1022bb8df23SBram Moolenaar if getline(v:lnum) =~ s:rule_rx 1032bb8df23SBram Moolenaar return 0 1042bb8df23SBram Moolenaar else 1052bb8df23SBram Moolenaar return &ts 1062bb8df23SBram Moolenaar endif 1072bb8df23SBram Moolenaar elseif prev_line =~ s:conditional_directive_rx 108036986f1SBram Moolenaar return shiftwidth() 109f193fffdSBram Moolenaar else 110f193fffdSBram Moolenaar let line = getline(v:lnum) 1112bb8df23SBram Moolenaar if line =~ s:just_inserted_rule_rx 112f193fffdSBram Moolenaar return 0 1132bb8df23SBram Moolenaar elseif line =~ s:end_conditional_directive_rx 114036986f1SBram Moolenaar return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1) - shiftwidth() 115f193fffdSBram Moolenaar else 1162bb8df23SBram Moolenaar return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1) 1172bb8df23SBram Moolenaar endif 118071d4279SBram Moolenaar endif 119071d4279SBram Moolenaarendfunction 120