diff options
author | Tom Praschan <13141438+tom-anders@users.noreply.github.com> | 2022-04-07 12:39:08 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-04-07 12:39:08 +0100 |
commit | 3506cf34c17c5eae6c2d1317db1fcd5a8493c288 (patch) | |
tree | 7a93cd7c69e55b1ee9e170d8efb62e75f67087fd | |
parent | 3ad2090316edc85e93094bba7af64f9991cc7f85 (diff) | |
download | vim-git-3506cf34c17c5eae6c2d1317db1fcd5a8493c288.tar.gz |
patch 8.2.4702: C++ scope labels are hard-codedv8.2.4702
Problem: C++ scope labels are hard-coded.
Solution: Add 'cinscopedecls' to define the labels. (Rom Praschan,
closes #10109)
-rw-r--r-- | runtime/doc/indent.txt | 8 | ||||
-rw-r--r-- | runtime/doc/options.txt | 14 | ||||
-rw-r--r-- | runtime/doc/quickref.txt | 1 | ||||
-rw-r--r-- | runtime/optwin.vim | 5 | ||||
-rw-r--r-- | src/buffer.c | 1 | ||||
-rw-r--r-- | src/cindent.c | 38 | ||||
-rw-r--r-- | src/option.c | 3 | ||||
-rw-r--r-- | src/option.h | 2 | ||||
-rw-r--r-- | src/optiondefs.h | 10 | ||||
-rw-r--r-- | src/optionstr.c | 1 | ||||
-rw-r--r-- | src/structs.h | 1 | ||||
-rw-r--r-- | src/testdir/test_cindent.vim | 43 | ||||
-rw-r--r-- | src/version.c | 2 |
13 files changed, 112 insertions, 17 deletions
diff --git a/runtime/doc/indent.txt b/runtime/doc/indent.txt index 6e8f35b2d..69a03f977 100644 --- a/runtime/doc/indent.txt +++ b/runtime/doc/indent.txt @@ -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 > { { diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index d5e5e6834..8b2021107 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -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.: > diff --git a/runtime/doc/quickref.txt b/runtime/doc/quickref.txt index e53294291..279e3d56c 100644 --- a/runtime/doc/quickref.txt +++ b/runtime/doc/quickref.txt @@ -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 diff --git a/runtime/optwin.vim b/runtime/optwin.vim index d138ab1d1..9b4868f7c 100644 --- 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") diff --git a/src/buffer.c b/src/buffer.c index bd378302c..5f8b1ad1d 100644 --- 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 index ca21c123e..a22db9560 100644 --- 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; + 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; } /* diff --git a/src/option.c b/src/option.c index 4d50a6480..49123aa36 100644 --- 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 index 85f2fa816..4c583a48f 100644 --- 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 index 4f2ec4ddc..54cccf83e 100644 --- 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 index 09e6d8a12..fd72da4df 100644 --- 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 index 5a76a599d..a1dbfbed2 100644 --- 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 index d8ea4e772..dbd4aa006 100644 --- 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 index f00fbcb27..3cf9d188f 100644 --- 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, |