changeset 28353:8bc8071928ed v8.2.4702

patch 8.2.4702: C++ scope labels are hard-coded Commit: https://github.com/vim/vim/commit/3506cf34c17c5eae6c2d1317db1fcd5a8493c288 Author: Tom Praschan <13141438+tom-anders@users.noreply.github.com> Date: Thu Apr 7 12:39:08 2022 +0100 patch 8.2.4702: C++ scope labels are hard-coded Problem: C++ scope labels are hard-coded. Solution: Add 'cinscopedecls' to define the labels. (Rom Praschan, closes #10109)
author Bram Moolenaar <Bram@vim.org>
date Thu, 07 Apr 2022 13:45:04 +0200
parents 10886e23615f
children 24a848f4d593
files runtime/doc/indent.txt runtime/doc/options.txt runtime/doc/quickref.txt runtime/optwin.vim src/buffer.c src/cindent.c src/option.c src/option.h src/optiondefs.h src/optionstr.c src/structs.h src/testdir/test_cindent.vim src/version.c
diffstat 13 files changed, 113 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/indent.txt
+++ b/runtime/doc/indent.txt
@@ -42,11 +42,12 @@ is not a C compiler: it does not recogni
 that toplevel functions have a '{' in the first column.  Otherwise they are
 easily confused with declarations.
 
-These four options control C program indenting:
+These five options control C program indenting:
 'cindent'	Enables Vim to perform C program indenting automatically.
 'cinkeys'	Specifies which keys trigger reindenting in insert mode.
 'cinoptions'	Sets your preferred indent style.
 'cinwords'	Defines keywords that start an extra indent in the next line.
+'cinscopedecls'	Defines strings that are recognized as a C++ scope declaration.
 
 If 'lisp' is not on and 'equalprg' is empty, the "=" operator indents using
 Vim's built-in algorithm rather than calling an external program.
@@ -293,8 +294,9 @@ The examples below assume a 'shiftwidth'
 <
 							*cino-g*
 	gN    Place C++ scope declarations N characters from the indent of the
-	      block they are in.  (default 'shiftwidth').  A scope declaration
-	      can be "public:", "protected:" or "private:".
+	      block they are in.  (default 'shiftwidth'). By default, a scope 
+	      declaration is "public:", "protected:" or "private:". This can
+	      be adjusted with the 'cinscopedecls' option.
 
 		cino=		    cino=g0 >
 		  {		      {
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -1661,13 +1661,23 @@ A jump table for the options with a shor
 	matter, include the keyword both the uppercase and lowercase:
 	"if,If,IF".
 
-						*'clipboard'* *'cb'*
+						*'cinscopedecls'* *'cinsd'*
+'cinscopedecls' 'cinsd'	string	(default "public,protected,private")
+			local to buffer
+			{not available when compiled without the |+cindent|
+			feature}
+	Keywords that are interpreted as a C++ scope declaration by |cino-g|.
+	Useful e.g. for working with the Qt framework that defines additional
+	scope declarations "signals", "public slots" and "private slots": >
+		set cinscopedecls+=signals,public\ slots,private\ slots
+
+<						*'clipboard'* *'cb'*
 'clipboard' 'cb'	string	(default "autoselect,exclude:cons\|linux"
 						  for X-windows, "" otherwise)
 			global
 			{only in GUI versions or when the |+xterm_clipboard|
 			feature is included}
-	This option is a list of comma separated names.
+	This option is a list of comma-separated names.
 	Note: if one of the items is "exclude:", then you can't add an item
 	after that.  Therefore do append an item with += but use ^= to
 	prepend, e.g.: >
--- a/runtime/doc/quickref.txt
+++ b/runtime/doc/quickref.txt
@@ -643,6 +643,7 @@ Short explanation of each option:		*opti
 'cinkeys'	  'cink'    keys that trigger indent when 'cindent' is set
 'cinoptions'	  'cino'    how to do indenting when 'cindent' is set
 'cinwords'	  'cinw'    words where 'si' and 'cin' add an indent
+'cinscopedecls'	  'cinsd'   words that are recognized by 'cino-g' 
 'clipboard'	  'cb'	    use the clipboard as the unnamed register
 'cmdheight'	  'ch'	    number of lines to use for the command-line
 'cmdwinheight'	  'cwh'     height of the command-line window
--- a/runtime/optwin.vim
+++ b/runtime/optwin.vim
@@ -624,6 +624,8 @@ call <SID>BinOptionG("scf", &scf)
 if has("gui")
   call <SID>AddOption("mousehide", gettext("hide the mouse pointer while typing"))
   call <SID>BinOptionG("mh", &mh)
+  call <SID>AddOption("mousemoveevent", gettext("report mouse movement events"))
+  call <SID>BinOptionG("mousemev", &mousemev)
 endif
 call <SID>AddOption("mousemodel", gettext("\"extend\", \"popup\" or \"popup_setpos\"; what the right\nmouse button is used for"))
 call <SID>OptionG("mousem", &mousem)
@@ -927,6 +929,9 @@ if has("cindent")
   call <SID>AddOption("cinwords", gettext("list of words that cause more C-indent"))
   call append("$", "\t" .. s:local_to_buffer)
   call <SID>OptionL("cinw")
+  call <SID>AddOption("cinscopedecls", gettext("list of scope declaration names used by cino-g"))
+  call append("$", "\t" .. s:local_to_buffer)
+  call <SID>OptionL("cinsd")
   call <SID>AddOption("indentexpr", gettext("expression used to obtain the indent of a line"))
   call append("$", "\t" .. s:local_to_buffer)
   call <SID>OptionL("inde")
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -2353,6 +2353,7 @@ free_buf_options(
 #ifdef FEAT_CINDENT
     clear_string_option(&buf->b_p_cink);
     clear_string_option(&buf->b_p_cino);
+    clear_string_option(&buf->b_p_cinsd);
 #endif
 #if defined(FEAT_CINDENT) || defined(FEAT_SMARTINDENT)
     clear_string_option(&buf->b_p_cinw);
--- a/src/cindent.c
+++ b/src/cindent.c
@@ -423,20 +423,34 @@ cin_islabel_skip(char_u **s)
  * Recognize a "public/private/protected" scope declaration label.
  */
     static int
-cin_isscopedecl(char_u *s)
+cin_isscopedecl(char_u *p)
 {
-    int		i;
-
-    s = cin_skipcomment(s);
-    if (STRNCMP(s, "public", 6) == 0)
-	i = 6;
-    else if (STRNCMP(s, "protected", 9) == 0)
-	i = 9;
-    else if (STRNCMP(s, "private", 7) == 0)
-	i = 7;
-    else
-	return FALSE;
-    return (*(s = cin_skipcomment(s + i)) == ':' && s[1] != ':');
+    size_t cinsd_len;
+    char_u *cinsd_buf;
+    char_u *cinsd;
+    size_t len;
+    char_u *skip;
+    char_u *s = cin_skipcomment(p);
+
+    cinsd_len = STRLEN(curbuf->b_p_cinsd) + 1;
+    cinsd_buf = alloc(cinsd_len);
+    if (cinsd_buf != NULL)
+    {
+	for (cinsd = curbuf->b_p_cinsd; *cinsd; )
+	{
+	    len = copy_option_part(&cinsd, cinsd_buf, cinsd_len, ",");
+	    if (STRNCMP(s, cinsd_buf, len) == 0)
+	    {
+		skip = cin_skipcomment(s + len);
+		if (*skip == ':' && skip[1] != ':')
+		    return TRUE;
+	    }
+	}
+
+	vim_free(cinsd_buf);
+    }
+
+    return FALSE;
 }
 
 /*
--- a/src/option.c
+++ b/src/option.c
@@ -5449,6 +5449,7 @@ get_varp(struct vimoption *p)
 	case PV_CIN:	return (char_u *)&(curbuf->b_p_cin);
 	case PV_CINK:	return (char_u *)&(curbuf->b_p_cink);
 	case PV_CINO:	return (char_u *)&(curbuf->b_p_cino);
+	case PV_CINSD:	return (char_u *)&(curbuf->b_p_cinsd);
 #endif
 #if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT)
 	case PV_CINW:	return (char_u *)&(curbuf->b_p_cinw);
@@ -6020,6 +6021,8 @@ buf_copy_options(buf_T *buf, int flags)
 	    COPY_OPT_SCTX(buf, BV_CINK);
 	    buf->b_p_cino = vim_strsave(p_cino);
 	    COPY_OPT_SCTX(buf, BV_CINO);
+	    buf->b_p_cinsd = vim_strsave(p_cinsd);
+	    COPY_OPT_SCTX(buf, BV_CINSD);
 #endif
 	    // Don't copy 'filetype', it must be detected
 	    buf->b_p_ft = empty_option;
--- a/src/option.h
+++ b/src/option.h
@@ -400,6 +400,7 @@ EXTERN int	p_bl;		// 'buflisted'
 #ifdef FEAT_CINDENT
 EXTERN int	p_cin;		// 'cindent'
 EXTERN char_u	*p_cink;	// 'cinkeys'
+EXTERN char_u	*p_cinsd;	// 'cinscopedecls'
 #endif
 #if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT)
 EXTERN char_u	*p_cinw;	// 'cinwords'
@@ -1126,6 +1127,7 @@ enum
     , BV_CIN
     , BV_CINK
     , BV_CINO
+    , BV_CINSD
 #endif
 #if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT)
     , BV_CINW
--- a/src/optiondefs.h
+++ b/src/optiondefs.h
@@ -44,6 +44,7 @@
 # define PV_CIN		OPT_BUF(BV_CIN)
 # define PV_CINK	OPT_BUF(BV_CINK)
 # define PV_CINO	OPT_BUF(BV_CINO)
+# define PV_CINSD	OPT_BUF(BV_CINSD)
 #endif
 #if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT)
 # define PV_CINW	OPT_BUF(BV_CINW)
@@ -603,6 +604,15 @@ static struct vimoption options[] =
 			    (char_u *)NULL, PV_NONE,
 #endif
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
+    {"cinscopedecls", "cinsd", P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA|P_NODUP,
+#ifdef FEAT_CINDENT
+			    (char_u *)&p_cinsd, PV_CINSD,
+			    {(char_u *)"public,protected,private", (char_u *)0L}
+#else
+			    (char_u *)NULL, PV_NONE,
+			    {(char_u *)0L, (char_u *)0L}
+#endif
+			    SCTX_INIT},
     {"cinwords",    "cinw", P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA|P_NODUP,
 #if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT)
 			    (char_u *)&p_cinw, PV_CINW,
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -260,6 +260,7 @@ check_buf_options(buf_T *buf)
 #ifdef FEAT_CINDENT
     check_string_option(&buf->b_p_cink);
     check_string_option(&buf->b_p_cino);
+    check_string_option(&buf->b_p_cinsd);
     parse_cino(buf);
 #endif
     check_string_option(&buf->b_p_ft);
--- a/src/structs.h
+++ b/src/structs.h
@@ -2881,6 +2881,7 @@ struct file_buffer
     int		b_p_cin;	// 'cindent'
     char_u	*b_p_cino;	// 'cinoptions'
     char_u	*b_p_cink;	// 'cinkeys'
+    char_u	*b_p_cinsd;	// 'cinscopedecls'
 #endif
 #if defined(FEAT_CINDENT) || defined(FEAT_SMARTINDENT)
     char_u	*b_p_cinw;	// 'cinwords'
--- a/src/testdir/test_cindent.vim
+++ b/src/testdir/test_cindent.vim
@@ -5319,6 +5319,49 @@ func Test_cindent_change_multline()
   close!
 endfunc
 
+func Test_cindent_scopedecls()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=g0
+  setl cinsd+=public\ slots,signals
+
+  let code =<< trim [CODE]
+  class Foo
+  {
+  public:
+  virtual void foo() = 0;
+  public slots:
+  void onBar();
+  signals:
+  void baz();
+  private:
+  int x;
+  };
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  class Foo
+  {
+  public:
+	virtual void foo() = 0;
+  public slots:
+	void onBar();
+  signals:
+	void baz();
+  private:
+	int x;
+  };
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
 func Test_cindent_pragma()
   new
   setl cindent ts=4 sw=4
--- 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 */
 /**/
+    4702,
+/**/
     4701,
 /**/
     4700,