neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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