changeset 20621:d30b16692ce0 v8.2.0864

patch 8.2.0864: pragmas are indented all the way to the left Commit: https://github.com/vim/vim/commit/d881b516da0184052d2f9d33c3f72c5c014316bd Author: Bram Moolenaar <Bram@vim.org> Date: Sun May 31 17:49:30 2020 +0200 patch 8.2.0864: pragmas are indented all the way to the left Problem: Pragmas are indented all the way to the left. Solution: Add an option to indent progmas like normal code. (Max Rumpf, closes #5468)
author Bram Moolenaar <Bram@vim.org>
date Sun, 31 May 2020 18:00:03 +0200
parents 3c6739c316cc
children d487701a608e
files runtime/doc/indent.txt src/cindent.c src/structs.h src/testdir/test_cindent.vim src/version.c
diffstat 5 files changed, 58 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/indent.txt
+++ b/runtime/doc/indent.txt
@@ -570,9 +570,15 @@ The examples below assume a 'shiftwidth'
 	      with "#" does not work.
 
 
+	PN    When N is non-zero recognize C pragmas, and indent them like any
+	      other code; does not concern other preprocessor directives.
+	      When N is zero (default): don't recognize C pragmas, treating
+	      them like every other preprocessor directive.
+
+
 The defaults, spelled out in full, are:
 	cinoptions=>s,e0,n0,f0,{0,}0,^0,L-1,:s,=s,l0,b0,gs,hs,N0,E0,ps,ts,is,+s,
-			c3,C0,/0,(2s,us,U0,w0,W0,k0,m0,j0,J0,)20,*70,#0
+			c3,C0,/0,(2s,us,U0,w0,W0,k0,m0,j0,J0,)20,*70,#0,P0
 
 Vim puts a line in column 1 if:
 - It starts with '#' (preprocessor directives), if 'cinkeys' contains '#0'.
--- a/src/cindent.c
+++ b/src/cindent.c
@@ -1845,6 +1845,9 @@ parse_cino(buf_T *buf)
     // Handle C++ extern "C" or "C++"
     buf->b_ind_cpp_extern_c = 0;
 
+    // Handle C #pragma directives
+    buf->b_ind_pragma = 0;
+
     for (p = buf->b_p_cino; *p; )
     {
 	l = p++;
@@ -1920,6 +1923,7 @@ parse_cino(buf_T *buf)
 	    case 'N': buf->b_ind_cpp_namespace = n; break;
 	    case 'k': buf->b_ind_if_for_while = n; break;
 	    case 'E': buf->b_ind_cpp_extern_c = n; break;
+	    case 'P': buf->b_ind_pragma = n; break;
 	}
 	if (*p == ',')
 	    ++p;
@@ -2116,11 +2120,16 @@ get_c_indent(void)
 	goto laterend;
     }
 
-    // #defines and so on always go at the left when included in 'cinkeys'.
+    // #defines and so on go at the left when included in 'cinkeys',
+    // exluding pragmas when customized in 'cinoptions'
     if (*theline == '#' && (*linecopy == '#' || in_cinkeys('#', ' ', TRUE)))
     {
-	amount = curbuf->b_ind_hash_comment;
-	goto theend;
+	char_u *directive = skipwhite(theline + 1);
+	if (curbuf->b_ind_pragma == 0 || STRNCMP(directive, "pragma", 6) != 0)
+	{
+	    amount = curbuf->b_ind_hash_comment;
+	    goto theend;
+	}
     }
 
     // Is it a non-case label?	Then that goes at the left margin too unless:
--- a/src/structs.h
+++ b/src/structs.h
@@ -2803,6 +2803,7 @@ struct file_buffer
     int		b_ind_cpp_namespace;
     int		b_ind_if_for_while;
     int		b_ind_cpp_extern_c;
+    int		b_ind_pragma;
 #endif
 
     linenr_T	b_no_eol_lnum;	// non-zero lnum when last line of next binary
--- a/src/testdir/test_cindent.vim
+++ b/src/testdir/test_cindent.vim
@@ -5272,4 +5272,40 @@ func Test_cindent_change_multline()
   close!
 endfunc
 
+func Test_cindent_pragma()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=Ps
+
+  let code =<< trim [CODE]
+  {
+  #pragma omp parallel
+  {
+  #pragma omp task
+  foo();
+  # pragma omp taskwait
+  }
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal =G
+
+  let expected =<< trim [CODE]
+  {
+	#pragma omp parallel
+	{
+		#pragma omp task
+		foo();
+		# pragma omp taskwait
+	}
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    864,
+/**/
     863,
 /**/
     862,