summaryrefslogtreecommitdiff
path: root/runtime/indent/make.vim
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2007-05-10 17:26:28 +0000
committerBram Moolenaar <Bram@vim.org>2007-05-10 17:26:28 +0000
commit2bb8df23dc2065304d9fab28be07ba6a7362be6d (patch)
tree1c90266c5851ee9a19cc7b62b4ad7a3582465a01 /runtime/indent/make.vim
parentff1d0d4cf5b9ec789cb0223154d7b76510d32d7b (diff)
downloadvim-git-2bb8df23dc2065304d9fab28be07ba6a7362be6d.tar.gz
updated for version 7.1b
Diffstat (limited to 'runtime/indent/make.vim')
-rw-r--r--runtime/indent/make.vim221
1 files changed, 85 insertions, 136 deletions
diff --git a/runtime/indent/make.vim b/runtime/indent/make.vim
index 3fe5a493e..8412fbb4d 100644
--- a/runtime/indent/make.vim
+++ b/runtime/indent/make.vim
@@ -1,7 +1,7 @@
" Vim indent file
-" Language: Makefile
-" Maintainer: Nikolai Weibull <now@bitwi.se>
-" Latest Revision: 2006-04-26
+" Language: Makefile
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-05-07
if exists("b:did_indent")
finish
@@ -9,159 +9,108 @@ endif
let b:did_indent = 1
setlocal indentexpr=GetMakeIndent()
-setlocal indentkeys=!^F,o,O
+setlocal indentkeys=!^F,o,O,<:>,=else,=endif
setlocal nosmartindent
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: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
-" TODO: Deal with comments, string, and all kinds of other crap, e.g., defines.
-" TODO: Unwrap the whole logic of this function into something that requires a
-" lot less 'return's.
function GetMakeIndent()
- let lnum = v:lnum - 1
- if lnum == 0
+ " 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)
- " Figure out if the previous line is part of a rule or not. If it is, then
- " we more or less just indent by a 'tabstop', the previous' lines indent, or
- " remove all indent if the current line is itself a rule. Also, if the line
- " in question is part of a continuation-line set constituting the rule line
- " itself, we indent by either a 'shiftwidth', if the line is the first in the
- " continuation, or use the indent of the previous line, if not.
- while lnum > 0
- let line = getline(lnum)
- if line[0] != "\t"
- " We found a non-shell-command line, i.e., one that doesn't have a
- " leading tab.
- if line =~ s:rule_rx
- " The line looks like a rule line, so we must therefore either be inside a
- " rule or we are a continuation line to that rule line.
- if line =~ s:continuation_rx
- " Ah, the rule line was continued, so look up the last continuation
- " line that's above the current line.
- while line =~ s:continuation_rx && lnum < v:lnum
- let lnum += 1
- let line = getline(lnum)
- endwhile
- let lnum -= 1
- let line = getline(lnum)
- endif
-
- " If the line that we've found is right above the current line, deal
- " with it specifically.
- if lnum == v:lnum - 1
- " If it was continued, indent the current line by a shiftwidth, as it
- " is the first to follow it. Otherwise, depending on if the current
- " line is a rule line, i.e, a rule line following another rule line,
- " then indent to the left margin. Otherwise, the current line is the
- " first shell-command line in the rule, so indent by a 'tabstop'
- if line =~ s:continuation_rx
- return &sw
- else
- return getline(v:lnum) =~ s:rule_rx ? 0 : &ts
- endif
- else
- " If the previous line was a continuation line, then unless it was
- " itself a part of a continuation line, add a 'shiftwidth''s worth of
- " indent. Otherwise, just use the indent of the previous line.
- " Otherwise, if the previous line wasn't a continuation line, check
- " if the one above it was. If it was then indent to whatever level
- " the 'owning' line had. Otherwise, indent to the previous line's
- " level.
- let lnum = v:lnum - 1
- let line = getline(lnum)
- if line =~ s:continuation_rx
- let pnum = v:lnum - 2
- let pine = getline(pnum)
- if pine =~ s:continuation_rx
- return indent(lnum)
- else
- return indent(lnum) + &sw
- endif
- else
- let lnum = v:lnum - 2
- let line = getline(lnum)
- if line =~ s:continuation_rx
- while lnum > 0
- if line !~ s:continuation_rx
- let lnum += 1
- let line = getline(lnum)
- break
- endif
- let lnum -= 1
- let line = getline(lnum)
- endwhile
- " We've found the owning line. Indent to it's level.
- return indent(lnum)
- else
- return indent(v:lnum - 1)
- endif
- endif
- endif
- endif
-
- " The line wasn't a rule line, so the current line is part of a series
- " of tab-indented lines that don't belong to any rule.
- break
- endif
- let lnum -= 1
- endwhile
+ let prev_prev_lnum = prev_lnum - 1
+ let prev_prev_line = prev_prev_lnum != 0 ? getline(prev_prev_lnum) : ""
- " If the line before the one we are currently indenting ended with a
- " continuation, then try to figure out what 'owns' that line and indent
- " appropriately.
- let lnum = v:lnum - 1
- let line = getline(lnum)
- if line =~ s:continuation_rx
- let indent = indent(lnum)
- if line =~ s:assignment_rx
- " The previous line is a continuation line that begins a variable-
- " assignment expression, so set the indent to just beyond the whitespace
- " following the assignment operator ('=').
- call cursor(lnum, 1)
+ " 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 &sw
+ elseif prev_line =~ s:assignment_rx
+ call cursor(prev_lnum, 1)
if search(s:assignment_rx, 'W') != 0
- let indent = virtcol('.') - 1
+ return virtcol('.') - 1
+ else
+ " TODO: ?
+ return &sw
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) + &sw
endif
-
- " The previous line didn't constitute an assignment, so just indent to
- " whatever level it had.
- return indent
- endif
-
- " If the line above the line above the current line ended was continued,
- " then the line above the current line was part of a continued line. Find
- " the 'owning' line and indent to its level.
- let lnum = v:lnum - 2
- let line = getline(lnum)
- if line =~ s:continuation_rx
- while lnum > 0
- if line !~ s:continuation_rx
- let lnum += 1
- let line = getline(lnum)
- break
- 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
- " We've found the owning line. Indent to it's level.
- return indent(lnum)
- endif
-
- " If nothing else caught on, then check if this line is a rule line. If it
- " is, indent it to the left margin. Otherwise, simply use the indent of the
- " previous line.
- let line = getline(v:lnum)
- if line =~ s:rule_rx
- return 0
+ 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 &sw
else
- return indent(v:lnum - 1)
+ 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) - &sw
+ else
+ return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1)
+ endif
endif
endfunction