cmake.vim (3049B)
1 " Vim indent file 2 " Language: CMake (ft=cmake) 3 " Author: Andy Cedilnik <andy.cedilnik@kitware.com> 4 " Maintainer: Dimitri Merejkowsky <d.merej@gmail.com> 5 " Former Maintainer: Karthik Krishnan <karthik.krishnan@kitware.com> 6 " Last Change: 2023 Dec 12 7 " 8 " License: The CMake license applies to this file. See 9 " https://cmake.org/licensing 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) 18 setlocal indentkeys+==ENDIF(,ENDFOREACH(,ENDMACRO(,ELSE(,ELSEIF(,ENDWHILE( 19 20 let b:undo_indent = "setl inde< indk<" 21 22 " Only define the function once. 23 if exists("*CMakeGetIndent") 24 finish 25 endif 26 let s:keepcpo= &cpo 27 set cpo&vim 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 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 let cmake_indent_close_regex = '^' . cmake_regex_arguments . 59 \ ')\s*' . 60 \ '\(' . cmake_regex_comment . '\)\?$' 61 62 let cmake_closing_parens_line = '^\s*\()\+\)\s*$' 63 64 let cmake_indent_begin_regex = '^\s*\(BLOCK\|IF\|MACRO\|FOREACH\|ELSE\|ELSEIF\|WHILE\|FUNCTION\)\s*(' 65 let cmake_indent_end_regex = '^\s*\(ENDBLOCK\|ENDIF\|ENDFOREACH\|ENDMACRO\|ELSE\|ELSEIF\|ENDWHILE\|ENDFUNCTION\)\s*(' 66 67 if this_line =~? cmake_closing_parens_line 68 if previous_line !~? cmake_indent_open_regex 69 let ind = ind - shiftwidth() 70 endif 71 else 72 " Add 73 if previous_line =~? cmake_indent_comment_line " Handle comments 74 let ind = ind 75 else 76 if previous_line =~? cmake_indent_begin_regex 77 let ind = ind + shiftwidth() 78 endif 79 if previous_line =~? cmake_indent_open_regex 80 let ind = ind + shiftwidth() 81 endif 82 endif 83 84 " Subtract 85 if this_line =~? cmake_indent_end_regex 86 let ind = ind - shiftwidth() 87 endif 88 if previous_line !~? cmake_closing_parens_line 89 if previous_line =~? cmake_indent_close_regex 90 let ind = ind - shiftwidth() 91 endif 92 endif 93 endif 94 95 return ind 96 endfun 97 98 let &cpo = s:keepcpo 99 unlet s:keepcpo