Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 1 | " Vim indent file |
| 2 | " Language: CMake (ft=cmake) |
| 3 | " Author: Andy Cedilnik <andy.cedilnik@kitware.com> |
Bram Moolenaar | 37c64c7 | 2017-09-19 22:06:03 +0200 | [diff] [blame] | 4 | " Maintainer: Dimitri Merejkowsky <d.merej@gmail.com> |
| 5 | " Former Maintainer: Karthik Krishnan <karthik.krishnan@kitware.com> |
Bram Moolenaar | 24a98a0 | 2017-09-27 22:23:55 +0200 | [diff] [blame] | 6 | " Last Change: 2017 Sep 24 |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 7 | " |
| 8 | " Licence: The CMake license applies to this file. See |
Bram Moolenaar | 37c64c7 | 2017-09-19 22:06:03 +0200 | [diff] [blame] | 9 | " https://cmake.org/licensing |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 10 | " This implies that distribution with Vim is allowed |
| 11 | |
| 12 | if exists("b:did_indent") |
| 13 | finish |
| 14 | endif |
| 15 | let b:did_indent = 1 |
| 16 | |
| 17 | setlocal indentexpr=CMakeGetIndent(v:lnum) |
Bram Moolenaar | 945e2db | 2010-06-05 17:43:32 +0200 | [diff] [blame] | 18 | setlocal indentkeys+==ENDIF(,ENDFOREACH(,ENDMACRO(,ELSE(,ELSEIF(,ENDWHILE( |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 19 | |
| 20 | " Only define the function once. |
| 21 | if exists("*CMakeGetIndent") |
| 22 | finish |
| 23 | endif |
Bram Moolenaar | 8e52a59 | 2012-05-18 21:49:28 +0200 | [diff] [blame] | 24 | let s:keepcpo= &cpo |
| 25 | set cpo&vim |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 26 | |
| 27 | fun! CMakeGetIndent(lnum) |
| 28 | let this_line = getline(a:lnum) |
| 29 | |
| 30 | " Find a non-blank line above the current line. |
| 31 | let lnum = a:lnum |
| 32 | let lnum = prevnonblank(lnum - 1) |
| 33 | let previous_line = getline(lnum) |
| 34 | |
| 35 | " Hit the start of the file, use zero indent. |
| 36 | if lnum == 0 |
| 37 | return 0 |
| 38 | endif |
| 39 | |
| 40 | let ind = indent(lnum) |
| 41 | |
| 42 | let or = '\|' |
| 43 | " Regular expressions used by line indentation function. |
| 44 | let cmake_regex_comment = '#.*' |
| 45 | let cmake_regex_identifier = '[A-Za-z][A-Za-z0-9_]*' |
| 46 | let cmake_regex_quoted = '"\([^"\\]\|\\.\)*"' |
| 47 | let cmake_regex_arguments = '\(' . cmake_regex_quoted . |
| 48 | \ or . '\$(' . cmake_regex_identifier . ')' . |
| 49 | \ or . '[^()\\#"]' . or . '\\.' . '\)*' |
| 50 | |
| 51 | let cmake_indent_comment_line = '^\s*' . cmake_regex_comment |
Bram Moolenaar | 57657d8 | 2006-04-21 22:12:41 +0000 | [diff] [blame] | 52 | let cmake_indent_blank_regex = '^\s*$' |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 53 | let cmake_indent_open_regex = '^\s*' . cmake_regex_identifier . |
| 54 | \ '\s*(' . cmake_regex_arguments . |
| 55 | \ '\(' . cmake_regex_comment . '\)\?$' |
| 56 | |
| 57 | let cmake_indent_close_regex = '^' . cmake_regex_arguments . |
| 58 | \ ')\s*' . |
| 59 | \ '\(' . cmake_regex_comment . '\)\?$' |
| 60 | |
Bram Moolenaar | 945e2db | 2010-06-05 17:43:32 +0200 | [diff] [blame] | 61 | let cmake_indent_begin_regex = '^\s*\(IF\|MACRO\|FOREACH\|ELSE\|ELSEIF\|WHILE\|FUNCTION\)\s*(' |
| 62 | let cmake_indent_end_regex = '^\s*\(ENDIF\|ENDFOREACH\|ENDMACRO\|ELSE\|ELSEIF\|ENDWHILE\|ENDFUNCTION\)\s*(' |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 63 | |
| 64 | " Add |
| 65 | if previous_line =~? cmake_indent_comment_line " Handle comments |
| 66 | let ind = ind |
| 67 | else |
| 68 | if previous_line =~? cmake_indent_begin_regex |
Bram Moolenaar | 24a98a0 | 2017-09-27 22:23:55 +0200 | [diff] [blame] | 69 | let ind = ind + shiftwidth() |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 70 | endif |
| 71 | if previous_line =~? cmake_indent_open_regex |
Bram Moolenaar | 24a98a0 | 2017-09-27 22:23:55 +0200 | [diff] [blame] | 72 | let ind = ind + shiftwidth() |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 73 | endif |
| 74 | endif |
| 75 | |
| 76 | " Subtract |
| 77 | if this_line =~? cmake_indent_end_regex |
Bram Moolenaar | 24a98a0 | 2017-09-27 22:23:55 +0200 | [diff] [blame] | 78 | let ind = ind - shiftwidth() |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 79 | endif |
| 80 | if previous_line =~? cmake_indent_close_regex |
Bram Moolenaar | 24a98a0 | 2017-09-27 22:23:55 +0200 | [diff] [blame] | 81 | let ind = ind - shiftwidth() |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 82 | endif |
| 83 | |
| 84 | return ind |
| 85 | endfun |
Bram Moolenaar | 8e52a59 | 2012-05-18 21:49:28 +0200 | [diff] [blame] | 86 | |
| 87 | let &cpo = s:keepcpo |
| 88 | unlet s:keepcpo |