# HG changeset patch # User Bram Moolenaar # Date 1649331904 -7200 # Node ID 8bc8071928ed846ef0333c160d7ea49f896d76a4 # Parent 10886e23615f8c4a09c5e8ecab959aaa1cf2e266 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) diff --git a/runtime/doc/indent.txt b/runtime/doc/indent.txt --- 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 > { { diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt --- 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.: > diff --git a/runtime/doc/quickref.txt b/runtime/doc/quickref.txt --- 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 diff --git a/runtime/optwin.vim b/runtime/optwin.vim --- a/runtime/optwin.vim +++ b/runtime/optwin.vim @@ -624,6 +624,8 @@ call BinOptionG("scf", &scf) if has("gui") call AddOption("mousehide", gettext("hide the mouse pointer while typing")) call BinOptionG("mh", &mh) + call AddOption("mousemoveevent", gettext("report mouse movement events")) + call BinOptionG("mousemev", &mousemev) endif call AddOption("mousemodel", gettext("\"extend\", \"popup\" or \"popup_setpos\"; what the right\nmouse button is used for")) call OptionG("mousem", &mousem) @@ -927,6 +929,9 @@ if has("cindent") call AddOption("cinwords", gettext("list of words that cause more C-indent")) call append("$", "\t" .. s:local_to_buffer) call OptionL("cinw") + call AddOption("cinscopedecls", gettext("list of scope declaration names used by cino-g")) + call append("$", "\t" .. s:local_to_buffer) + call OptionL("cinsd") call AddOption("indentexpr", gettext("expression used to obtain the indent of a line")) call append("$", "\t" .. s:local_to_buffer) call OptionL("inde") diff --git a/src/buffer.c b/src/buffer.c --- 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); diff --git a/src/cindent.c b/src/cindent.c --- 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; } /* diff --git a/src/option.c b/src/option.c --- 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; diff --git a/src/option.h b/src/option.h --- 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 diff --git a/src/optiondefs.h b/src/optiondefs.h --- 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, diff --git a/src/optionstr.c b/src/optionstr.c --- 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); diff --git a/src/structs.h b/src/structs.h --- 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' diff --git a/src/testdir/test_cindent.vim b/src/testdir/test_cindent.vim --- 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 diff --git a/src/version.c b/src/version.c --- 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,