blob: 4315ad23afa6e51e4fa8ac79327780f124a90b92 [file] [log] [blame]
Bram Moolenaarc1e37902006-04-18 21:55:01 +00001" =============================================================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00002"
Bram Moolenaarc1e37902006-04-18 21:55:01 +00003" Program: CMake - Cross-Platform Makefile Generator
Bram Moolenaar5c736222010-01-06 20:54:52 +01004" Module: $RCSfile: cmake-indent.vim,v $
Bram Moolenaarc1e37902006-04-18 21:55:01 +00005" Language: VIM
Bram Moolenaar5c736222010-01-06 20:54:52 +01006" Date: $Date: 2006/09/23 21:09:08 $
7" Version: $Revision: 1.7 $
Bram Moolenaar446cb832008-06-24 21:56:24 +00008"
Bram Moolenaarc1e37902006-04-18 21:55:01 +00009" =============================================================================
10
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>
Bram Moolenaar5c736222010-01-06 20:54:52 +010015" Last Change: $Date: 2006/09/23 21:09:08 $
16" Version: $Revision: 1.7 $
Bram Moolenaarc1e37902006-04-18 21:55:01 +000017"
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
21
22if exists("b:did_indent")
23 finish
24endif
25let b:did_indent = 1
26
27setlocal indentexpr=CMakeGetIndent(v:lnum)
28
29" Only define the function once.
30if exists("*CMakeGetIndent")
31 finish
32endif
33
34fun! CMakeGetIndent(lnum)
35 let this_line = getline(a:lnum)
36
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)
41
42 " Hit the start of the file, use zero indent.
43 if lnum == 0
44 return 0
45 endif
46
47 let ind = indent(lnum)
48
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 . '\\.' . '\)*'
57
58 let cmake_indent_comment_line = '^\s*' . cmake_regex_comment
Bram Moolenaar57657d82006-04-21 22:12:41 +000059 let cmake_indent_blank_regex = '^\s*$'
Bram Moolenaarc1e37902006-04-18 21:55:01 +000060 let cmake_indent_open_regex = '^\s*' . cmake_regex_identifier .
61 \ '\s*(' . cmake_regex_arguments .
62 \ '\(' . cmake_regex_comment . '\)\?$'
63
64 let cmake_indent_close_regex = '^' . cmake_regex_arguments .
65 \ ')\s*' .
66 \ '\(' . cmake_regex_comment . '\)\?$'
67
Bram Moolenaar446cb832008-06-24 21:56:24 +000068 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*('
Bram Moolenaarc1e37902006-04-18 21:55:01 +000070
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
82
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
90
91 return ind
92endfun