summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Praschan <13141438+tom-anders@users.noreply.github.com>2022-04-07 12:39:08 +0100
committerBram Moolenaar <Bram@vim.org>2022-04-07 12:39:08 +0100
commit3506cf34c17c5eae6c2d1317db1fcd5a8493c288 (patch)
tree7a93cd7c69e55b1ee9e170d8efb62e75f67087fd
parent3ad2090316edc85e93094bba7af64f9991cc7f85 (diff)
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.txt8
-rw-r--r--runtime/doc/options.txt14
-rw-r--r--runtime/doc/quickref.txt1
-rw-r--r--runtime/optwin.vim5
-rw-r--r--src/buffer.c1
-rw-r--r--src/cindent.c38
-rw-r--r--src/option.c3
-rw-r--r--src/option.h2
-rw-r--r--src/optiondefs.h10
-rw-r--r--src/optionstr.c1
-rw-r--r--src/structs.h1
-rw-r--r--src/testdir/test_cindent.vim43
-rw-r--r--src/version.c2
13 files changed, 112 insertions, 17 deletions
diff --git a/runtime/doc/indent.txt b/runtime/doc/indent.txt
index 6e8f35b2d2..69a03f977d 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 d5e5e6834d..8b2021107b 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 e532942914..279e3d56cc 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 d138ab1d17..9b4868f7cf 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 bd378302cd..5f8b1ad1dc 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 ca21c123e0..a22db9560e 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 4d50a6480c..49123aa36b 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 85f2fa816f..4c583a48ff 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 4f2ec4ddc5..54cccf83eb 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 09e6d8a12e..fd72da4df6 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 5a76a599da..a1dbfbed28 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 d8ea4e772e..dbd4aa006e 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 f00fbcb27b..3cf9d188f0 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,