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