Snapshot 52
[MacVim.git] / runtime / indent / cmake.vim
blob4315ad23afa6e51e4fa8ac79327780f124a90b92
1 " =============================================================================
2
3 "   Program:   CMake - Cross-Platform Makefile Generator
4 "   Module:    $RCSfile: cmake-indent.vim,v $
5 "   Language:  VIM
6 "   Date:      $Date: 2006/09/23 21:09:08 $
7 "   Version:   $Revision: 1.7 $
8
9 " =============================================================================
11 " Vim indent file
12 " Language:     CMake (ft=cmake)
13 " Author:       Andy Cedilnik <andy.cedilnik@kitware.com>
14 " Maintainer:   Andy Cedilnik <andy.cedilnik@kitware.com>
15 " Last Change:  $Date: 2006/09/23 21:09:08 $
16 " Version:      $Revision: 1.7 $
18 " Licence:      The CMake license applies to this file. See
19 "               http://www.cmake.org/HTML/Copyright.html
20 "               This implies that distribution with Vim is allowed
22 if exists("b:did_indent")
23   finish
24 endif
25 let b:did_indent = 1
27 setlocal indentexpr=CMakeGetIndent(v:lnum)
29 " Only define the function once.
30 if exists("*CMakeGetIndent")
31   finish
32 endif
34 fun! CMakeGetIndent(lnum)
35   let this_line = getline(a:lnum)
37   " Find a non-blank line above the current line.
38   let lnum = a:lnum
39   let lnum = prevnonblank(lnum - 1)
40   let previous_line = getline(lnum)
42   " Hit the start of the file, use zero indent.
43   if lnum == 0
44     return 0
45   endif
47   let ind = indent(lnum)
49   let or = '\|'
50   " Regular expressions used by line indentation function.
51   let cmake_regex_comment = '#.*'
52   let cmake_regex_identifier = '[A-Za-z][A-Za-z0-9_]*'
53   let cmake_regex_quoted = '"\([^"\\]\|\\.\)*"'
54   let cmake_regex_arguments = '\(' . cmake_regex_quoted .
55                     \       or . '\$(' . cmake_regex_identifier . ')' .
56                     \       or . '[^()\\#"]' . or . '\\.' . '\)*'
58   let cmake_indent_comment_line = '^\s*' . cmake_regex_comment
59   let cmake_indent_blank_regex = '^\s*$'
60   let cmake_indent_open_regex = '^\s*' . cmake_regex_identifier .
61                     \           '\s*(' . cmake_regex_arguments .
62                     \           '\(' . cmake_regex_comment . '\)\?$'
64   let cmake_indent_close_regex = '^' . cmake_regex_arguments .
65                     \            ')\s*' .
66                     \            '\(' . cmake_regex_comment . '\)\?$'
68   let cmake_indent_begin_regex = '^\s*\(IF\|MACRO\|FOREACH\|ELSE\|ELSEIF\|WHILE\)\s*('
69   let cmake_indent_end_regex = '^\s*\(ENDIF\|ENDFOREACH\|ENDMACRO\|ELSE\|ELSEIF\|ENDWHILE\)\s*('
71   " Add
72   if previous_line =~? cmake_indent_comment_line " Handle comments
73     let ind = ind
74   else
75     if previous_line =~? cmake_indent_begin_regex
76       let ind = ind + &sw
77     endif
78     if previous_line =~? cmake_indent_open_regex
79       let ind = ind + &sw
80     endif
81   endif
83   " Subtract
84   if this_line =~? cmake_indent_end_regex
85     let ind = ind - &sw
86   endif
87   if previous_line =~? cmake_indent_close_regex
88     let ind = ind - &sw
89   endif
91   return ind
92 endfun