Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1 | " Vim indent file |
Bram Moolenaar | 6e64922 | 2021-10-04 21:32:54 +0100 | [diff] [blame] | 2 | " Language: Makefile |
| 3 | " Maintainer: Doug Kearns <dougkearns@gmail.com> |
| 4 | " Previous Maintainer: Nikolai Weibull <now@bitwi.se> |
Bram Moolenaar | cbaff5e | 2022-04-08 17:45:08 +0100 | [diff] [blame] | 5 | " Last Change: 2022 Apr 06 |
Eisuke Kawashima | 7bc9880 | 2025-04-22 20:20:46 +0200 | [diff] [blame] | 6 | " 2025 Apr 22 by Vim Project: do not indent after special targets #17183 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 7 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 8 | if exists("b:did_indent") |
| 9 | finish |
| 10 | endif |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 11 | let b:did_indent = 1 |
| 12 | |
| 13 | setlocal indentexpr=GetMakeIndent() |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 14 | setlocal indentkeys=!^F,o,O,<:>,=else,=endif |
Bram Moolenaar | f193fff | 2006-04-27 00:02:13 +0000 | [diff] [blame] | 15 | setlocal nosmartindent |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 16 | |
Bram Moolenaar | cbaff5e | 2022-04-08 17:45:08 +0100 | [diff] [blame] | 17 | let b:undo_indent = "setl inde< indk< si<" |
Bram Moolenaar | 6e64922 | 2021-10-04 21:32:54 +0100 | [diff] [blame] | 18 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 19 | if exists("*GetMakeIndent") |
| 20 | finish |
| 21 | endif |
| 22 | |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 23 | let s:comment_rx = '^\s*#' |
Bram Moolenaar | 57657d8 | 2006-04-21 22:12:41 +0000 | [diff] [blame] | 24 | let s:rule_rx = '^[^ \t#:][^#:]*:\{1,2}\%([^=:]\|$\)' |
Eisuke Kawashima | 7bc9880 | 2025-04-22 20:20:46 +0200 | [diff] [blame] | 25 | " .PHONY, .DELETE_ON_ERROR, etc |
| 26 | let s:rule_special = '^\.[A-Z_]\+\s*:' |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 27 | let s:continued_rule_rx = '^[^#:]*:\{1,2}\%([^=:]\|$\)' |
Bram Moolenaar | 57657d8 | 2006-04-21 22:12:41 +0000 | [diff] [blame] | 28 | let s:continuation_rx = '\\$' |
Bram Moolenaar | 4c29502 | 2021-05-02 17:19:11 +0200 | [diff] [blame] | 29 | let s:assignment_rx = '^\s*\h\w*\s*[+:?]\==\s*\zs.*\\$' |
| 30 | let s:folded_assignment_rx = '^\s*\h\w*\s*[+:?]\==' |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 31 | " TODO: This needs to be a lot more restrictive in what it matches. |
| 32 | let s:just_inserted_rule_rx = '^\s*[^#:]\+:\{1,2}$' |
| 33 | let s:conditional_directive_rx = '^ *\%(ifn\=\%(eq\|def\)\|else\)\>' |
| 34 | let s:end_conditional_directive_rx = '^\s*\%(else\|endif\)\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 35 | |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 36 | function s:remove_continuation(line) |
| 37 | return substitute(a:line, s:continuation_rx, "", "") |
| 38 | endfunction |
| 39 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 40 | function GetMakeIndent() |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 41 | " TODO: Should this perhaps be v:lnum -1? |
| 42 | " let prev_lnum = prevnonblank(v:lnum - 1) |
| 43 | let prev_lnum = v:lnum - 1 |
| 44 | if prev_lnum == 0 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 45 | return 0 |
| 46 | endif |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 47 | let prev_line = getline(prev_lnum) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 48 | |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 49 | let prev_prev_lnum = prev_lnum - 1 |
| 50 | let prev_prev_line = prev_prev_lnum != 0 ? getline(prev_prev_lnum) : "" |
Bram Moolenaar | 57657d8 | 2006-04-21 22:12:41 +0000 | [diff] [blame] | 51 | |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 52 | " TODO: Deal with comments. In comments, continuations aren't interesting. |
| 53 | if prev_line =~ s:continuation_rx |
| 54 | if prev_prev_line =~ s:continuation_rx |
| 55 | return indent(prev_lnum) |
Eisuke Kawashima | 7bc9880 | 2025-04-22 20:20:46 +0200 | [diff] [blame] | 56 | elseif prev_line =~ s:rule_rx && prev_line !~ s:rule_special |
Bram Moolenaar | 036986f | 2017-03-16 17:41:02 +0100 | [diff] [blame] | 57 | return shiftwidth() |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 58 | elseif prev_line =~ s:assignment_rx |
| 59 | call cursor(prev_lnum, 1) |
Bram Moolenaar | f193fff | 2006-04-27 00:02:13 +0000 | [diff] [blame] | 60 | if search(s:assignment_rx, 'W') != 0 |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 61 | return virtcol('.') - 1 |
| 62 | else |
| 63 | " TODO: ? |
Bram Moolenaar | 036986f | 2017-03-16 17:41:02 +0100 | [diff] [blame] | 64 | return shiftwidth() |
Bram Moolenaar | f193fff | 2006-04-27 00:02:13 +0000 | [diff] [blame] | 65 | endif |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 66 | else |
| 67 | " TODO: OK, this might be a continued shell command, so perhaps indent |
| 68 | " properly here? Leave this out for now, but in the next release this |
| 69 | " should be using indent/sh.vim somehow. |
| 70 | "if prev_line =~ '^\t' " s:rule_command_rx |
| 71 | " if prev_line =~ '^\s\+[@-]\%(if\)\>' |
| 72 | " return indent(prev_lnum) + 2 |
| 73 | " endif |
| 74 | "endif |
Bram Moolenaar | 036986f | 2017-03-16 17:41:02 +0100 | [diff] [blame] | 75 | return indent(prev_lnum) + shiftwidth() |
Bram Moolenaar | f193fff | 2006-04-27 00:02:13 +0000 | [diff] [blame] | 76 | endif |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 77 | elseif prev_prev_line =~ s:continuation_rx |
| 78 | let folded_line = s:remove_continuation(prev_prev_line) . ' ' . s:remove_continuation(prev_line) |
| 79 | let lnum = prev_prev_lnum - 1 |
| 80 | let line = getline(lnum) |
| 81 | while line =~ s:continuation_rx |
| 82 | let folded_line = s:remove_continuation(line) . ' ' . folded_line |
Bram Moolenaar | 57657d8 | 2006-04-21 22:12:41 +0000 | [diff] [blame] | 83 | let lnum -= 1 |
| 84 | let line = getline(lnum) |
| 85 | endwhile |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 86 | let folded_lnum = lnum + 1 |
Eisuke Kawashima | 7bc9880 | 2025-04-22 20:20:46 +0200 | [diff] [blame] | 87 | if folded_line =~ s:rule_rx && prev_line !~ s:rule_special |
| 88 | if getline(v:lnum) =~ s:rule_rx && prev_line !~ s:rule_special |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 89 | return 0 |
| 90 | else |
| 91 | return &ts |
| 92 | endif |
| 93 | else |
| 94 | " elseif folded_line =~ s:folded_assignment_rx |
Eisuke Kawashima | 7bc9880 | 2025-04-22 20:20:46 +0200 | [diff] [blame] | 95 | if getline(v:lnum) =~ s:rule_rx && prev_line !~ s:rule_special |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 96 | return 0 |
| 97 | else |
| 98 | return indent(folded_lnum) |
| 99 | endif |
| 100 | " else |
| 101 | " " TODO: ? |
| 102 | " return indent(prev_lnum) |
| 103 | endif |
Eisuke Kawashima | 7bc9880 | 2025-04-22 20:20:46 +0200 | [diff] [blame] | 104 | elseif prev_line =~ s:rule_rx && prev_line !~ s:rule_special |
| 105 | if getline(v:lnum) =~ s:rule_rx && prev_line !~ s:rule_special |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 106 | return 0 |
| 107 | else |
| 108 | return &ts |
| 109 | endif |
| 110 | elseif prev_line =~ s:conditional_directive_rx |
Bram Moolenaar | 036986f | 2017-03-16 17:41:02 +0100 | [diff] [blame] | 111 | return shiftwidth() |
Bram Moolenaar | f193fff | 2006-04-27 00:02:13 +0000 | [diff] [blame] | 112 | else |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 113 | let line = getline(v:lnum) |
| 114 | if line =~ s:just_inserted_rule_rx |
| 115 | return 0 |
| 116 | elseif line =~ s:end_conditional_directive_rx |
Bram Moolenaar | 036986f | 2017-03-16 17:41:02 +0100 | [diff] [blame] | 117 | return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1) - shiftwidth() |
Bram Moolenaar | 2bb8df2 | 2007-05-10 17:26:28 +0000 | [diff] [blame] | 118 | else |
| 119 | return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1) |
| 120 | endif |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 121 | endif |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 122 | endfunction |