]> granicus.if.org Git - vim/commitdiff
patch 8.2.4702: C++ scope labels are hard-coded v8.2.4702
authorTom Praschan <13141438+tom-anders@users.noreply.github.com>
Thu, 7 Apr 2022 11:39:08 +0000 (12:39 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 7 Apr 2022 11:39:08 +0000 (12:39 +0100)
Problem:    C++ scope labels are hard-coded.
Solution:   Add 'cinscopedecls' to define the labels. (Rom Praschan,
            closes #10109)

13 files changed:
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

index 6e8f35b2d2d21be654e6e26dc21a7e97f5a7238a..69a03f977d837a2c997661c536eddc783d2ff7bd 100644 (file)
@@ -42,11 +42,12 @@ is not a C compiler: it does not recognize all syntax.  One requirement is
 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' of 4.
 <
                                                        *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 >
                  {                   {
index d5e5e6834df8c24fedd304b43c2534e6a77b613f..8b2021107b5a376619638f8b424390d8f67c7863 100644 (file)
@@ -1661,13 +1661,23 @@ A jump table for the options with a short description can be found at |Q_op|.
        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.: >
index e5329429145f614f0da4c7d48c63166f4ac6d34d..279e3d56ccfac12474ca25407d3c7af7ed4038df 100644 (file)
@@ -643,6 +643,7 @@ Short explanation of each option:           *option-list*
 '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
index d138ab1d17e43db767da55c7ca646e994a4303b3..9b4868f7cf135e7b2c5abc43538e064d5483c87b 100644 (file)
@@ -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")
index bd378302cd1d1cf3f727033867f9cf6f3b2b740a..5f8b1ad1dc2a77f10ecc9b76e7415dbcfca09f78 100644 (file)
@@ -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);
index ca21c123e0de2d34fa2dc277e889b885ebb1a121..a22db9560e832f96a6d3d2712300057303e97e6d 100644 (file)
@@ -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;
+    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;
+           }
+       }
 
-    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] != ':');
+       vim_free(cinsd_buf);
+    }
+
+    return FALSE;
 }
 
 /*
index 4d50a6480c4785a50fc1eb2aadf301fa805f14a4..49123aa36b52c919de192e1f5f3ebce10b4f59f5 100644 (file)
@@ -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;
index 85f2fa816f6be84a5fcce80dad6cd3ef3e8bf8f4..4c583a48ff1c9e07a5d0186c4569cf65f9ddda4d 100644 (file)
@@ -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
index 4f2ec4ddc5485281fc0ccfc024de1f309b38e9a0..54cccf83eb74dd17153ff38df18cea2479ba9517 100644 (file)
@@ -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,
index 09e6d8a12e6dfe2b3894e5416e8858972b5c2d61..fd72da4df62b6344e3a71fbd3ffeaf3b281d4d46 100644 (file)
@@ -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);
index 5a76a599da4e112f4025cae8829279054ff548fa..a1dbfbed28478726d378c56fd7f45b28e549f129 100644 (file)
@@ -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'
index d8ea4e772e2a30cc37a9f4b8cb8cd22cef963184..dbd4aa006e4f1853376ba0a137b287d5a7a0f555 100644 (file)
@@ -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
index f00fbcb27b12fa5c9eec5b1af9cceb7243534b60..3cf9d188f0f8d661aa80219a3cd972674c7714f9 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4702,
 /**/
     4701,
 /**/