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