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