From b14cfbe15902e5ec9142271864ffaf5fe5ebb7dc Mon Sep 17 00:00:00 2001 From: Kai Tetzlaff Date: Tue, 22 Mar 2022 17:28:59 +0100 Subject: vim: Fix indentation of 'closing parens only lines' This commit changes the indentation of lines which contain only closing parentheses (`)`). Example: Change ``` add_library(mylib mysrc.c ) ``` to: ``` add_library(mylib mysrc.c ) ``` There are edge cases, where the indentation still doesn't really work. Example: This, admittedly weird, piece of code (manually formatted to what I would expect - this is already a personal preference ...): ``` if(4) if((0 OR 1 ) ) # could also be aligned with the `i` in `if` set(foobar ) endif() set(foobar) endif() ``` will be changed to: ``` if(4) if((0 OR 1 ) ) set(foobar ) endif() set(foobar) endif() ``` whereas with the previous vim indentation code the result would have been: ``` if(4) if((0 OR 1 ) ) set(foobar ) endif() set(foobar) endif() ``` which is not great but better than above. I hope that this is acceptable. Note: Apart from the actual indentation fixes, I based the change on a version of indent/cmake.vim I found in the debian/bookworm vim82 package which is newer than the one in the cmake repository (with `Last Change: 2017 Sep 24` comment instead of the cmake repo version with `Last Change: 2017 Aug 30`). This vim82/debian version moved these two lines: ``` let s:keepcpo= &cpo set cpo&vim ``` a bit further down (after an early exit check - which seems to make sense to me). Fixes: #22394 --- Auxiliary/vim/indent/cmake.vim | 48 ++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/Auxiliary/vim/indent/cmake.vim b/Auxiliary/vim/indent/cmake.vim index f7ab24a..672bdcc 100644 --- a/Auxiliary/vim/indent/cmake.vim +++ b/Auxiliary/vim/indent/cmake.vim @@ -3,7 +3,7 @@ " Author: Andy Cedilnik " Maintainer: Dimitri Merejkowsky " Former Maintainer: Karthik Krishnan -" Last Change: 2017 Aug 30 +" Last Change: 2022 Mar 22 " " License: The CMake license applies to this file. See " https://cmake.org/licensing @@ -14,9 +14,6 @@ if exists("b:did_indent") endif let b:did_indent = 1 -let s:keepcpo= &cpo -set cpo&vim - setlocal indentexpr=CMakeGetIndent(v:lnum) setlocal indentkeys+==ENDIF(,ENDFOREACH(,ENDMACRO(,ELSE(,ELSEIF(,ENDWHILE( @@ -24,6 +21,8 @@ setlocal indentkeys+==ENDIF(,ENDFOREACH(,ENDMACRO(,ELSE(,ELSEIF(,ENDWHILE( if exists("*CMakeGetIndent") finish endif +let s:keepcpo= &cpo +set cpo&vim fun! CMakeGetIndent(lnum) let this_line = getline(a:lnum) @@ -54,32 +53,41 @@ fun! CMakeGetIndent(lnum) let cmake_indent_open_regex = '^\s*' . cmake_regex_identifier . \ '\s*(' . cmake_regex_arguments . \ '\(' . cmake_regex_comment . '\)\?$' - let cmake_indent_close_regex = '^' . cmake_regex_arguments . \ ')\s*' . \ '\(' . cmake_regex_comment . '\)\?$' + let cmake_closing_parens_line = '^\s*\()\+\)\s*$' + let cmake_indent_begin_regex = '^\s*\(IF\|MACRO\|FOREACH\|ELSE\|ELSEIF\|WHILE\|FUNCTION\)\s*(' let cmake_indent_end_regex = '^\s*\(ENDIF\|ENDFOREACH\|ENDMACRO\|ELSE\|ELSEIF\|ENDWHILE\|ENDFUNCTION\)\s*(' - " Add - if previous_line =~? cmake_indent_comment_line " Handle comments - let ind = ind - else - if previous_line =~? cmake_indent_begin_regex - let ind = ind + shiftwidth() + if this_line =~? cmake_closing_parens_line + if previous_line !~? cmake_indent_open_regex + let ind = ind - shiftwidth() endif - if previous_line =~? cmake_indent_open_regex - let ind = ind + shiftwidth() + else + " Add + if previous_line =~? cmake_indent_comment_line " Handle comments + let ind = ind + else + if previous_line =~? cmake_indent_begin_regex + let ind = ind + shiftwidth() + endif + if previous_line =~? cmake_indent_open_regex + let ind = ind + shiftwidth() + endif endif - endif - " Subtract - if this_line =~? cmake_indent_end_regex - let ind = ind - shiftwidth() - endif - if previous_line =~? cmake_indent_close_regex - let ind = ind - shiftwidth() + " Subtract + if this_line =~? cmake_indent_end_regex + let ind = ind - shiftwidth() + endif + if previous_line !~? cmake_closing_parens_line + if previous_line =~? cmake_indent_close_regex + let ind = ind - shiftwidth() + endif + endif endif return ind -- cgit v0.12