xref: /vim-8.2.3635/runtime/indent/make.vim (revision 6e649224)
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