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 | cbaff5e | 2022-04-08 17:45:08 +0100 | [diff] [blame] | 6 | " Last Change: 2022 Apr 06 |
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 | |
Bram Moolenaar | cbaff5e | 2022-04-08 17:45:08 +0100 | [diff] [blame] | 20 | let b:undo_indent = "setl inde< indk<" |
| 21 | |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 22 | " Only define the function once. |
| 23 | if exists("*CMakeGetIndent") |
| 24 | finish |
| 25 | endif |
Bram Moolenaar | 8e52a59 | 2012-05-18 21:49:28 +0200 | [diff] [blame] | 26 | let s:keepcpo= &cpo |
| 27 | set cpo&vim |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 28 | |
| 29 | fun! 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 |
Bram Moolenaar | 57657d8 | 2006-04-21 22:12:41 +0000 | [diff] [blame] | 54 | let cmake_indent_blank_regex = '^\s*$' |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | 945e2db | 2010-06-05 17:43:32 +0200 | [diff] [blame] | 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*(' |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | 24a98a0 | 2017-09-27 22:23:55 +0200 | [diff] [blame] | 71 | let ind = ind + shiftwidth() |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 72 | endif |
| 73 | if previous_line =~? cmake_indent_open_regex |
Bram Moolenaar | 24a98a0 | 2017-09-27 22:23:55 +0200 | [diff] [blame] | 74 | let ind = ind + shiftwidth() |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 75 | endif |
| 76 | endif |
| 77 | |
| 78 | " Subtract |
| 79 | if this_line =~? cmake_indent_end_regex |
Bram Moolenaar | 24a98a0 | 2017-09-27 22:23:55 +0200 | [diff] [blame] | 80 | let ind = ind - shiftwidth() |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 81 | endif |
| 82 | if previous_line =~? cmake_indent_close_regex |
Bram Moolenaar | 24a98a0 | 2017-09-27 22:23:55 +0200 | [diff] [blame] | 83 | let ind = ind - shiftwidth() |
Bram Moolenaar | c1e3790 | 2006-04-18 21:55:01 +0000 | [diff] [blame] | 84 | endif |
| 85 | |
| 86 | return ind |
| 87 | endfun |
Bram Moolenaar | 8e52a59 | 2012-05-18 21:49:28 +0200 | [diff] [blame] | 88 | |
| 89 | let &cpo = s:keepcpo |
| 90 | unlet s:keepcpo |