mirror of
https://github.com/neovim/neovim.git
synced 2025-09-16 08:18:17 +00:00
vim-patch:8.2.4702: C++ scope labels are hard-coded
Problem: C++ scope labels are hard-coded.
Solution: Add 'cinscopedecls' to define the labels. (Tom Praschan,
closes vim/vim#10109)
3506cf34c1
This commit is contained in:
@@ -38,11 +38,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
|
that toplevel functions have a '{' in the first column. Otherwise they are
|
||||||
easily confused with declarations.
|
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.
|
'cindent' Enables Vim to perform C program indenting automatically.
|
||||||
'cinkeys' Specifies which keys trigger reindenting in insert mode.
|
'cinkeys' Specifies which keys trigger reindenting in insert mode.
|
||||||
'cinoptions' Sets your preferred indent style.
|
'cinoptions' Sets your preferred indent style.
|
||||||
'cinwords' Defines keywords that start an extra indent in the next line.
|
'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
|
If 'lisp' is not on and 'equalprg' is empty, the "=" operator indents using
|
||||||
Vim's built-in algorithm rather than calling an external program.
|
Vim's built-in algorithm rather than calling an external program.
|
||||||
@@ -289,8 +290,9 @@ The examples below assume a 'shiftwidth' of 4.
|
|||||||
<
|
<
|
||||||
*cino-g*
|
*cino-g*
|
||||||
gN Place C++ scope declarations N characters from the indent of the
|
gN Place C++ scope declarations N characters from the indent of the
|
||||||
block they are in. (default 'shiftwidth'). A scope declaration
|
block they are in. (default 'shiftwidth'). By default, a scope
|
||||||
can be "public:", "protected:" or "private:".
|
declaration is "public:", "protected:" or "private:". This can
|
||||||
|
be adjusted with the 'cinscopedecls' option.
|
||||||
|
|
||||||
cino= cino=g0 >
|
cino= cino=g0 >
|
||||||
{ {
|
{ {
|
||||||
|
@@ -1288,10 +1288,20 @@ 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:
|
matter, include the keyword both the uppercase and lowercase:
|
||||||
"if,If,IF".
|
"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 "")
|
'clipboard' 'cb' string (default "")
|
||||||
global
|
global
|
||||||
This option is a list of comma separated names.
|
This option is a list of comma-separated names.
|
||||||
These names are recognized:
|
These names are recognized:
|
||||||
|
|
||||||
*clipboard-unnamed*
|
*clipboard-unnamed*
|
||||||
|
@@ -638,6 +638,7 @@ Short explanation of each option: *option-list*
|
|||||||
'cinkeys' 'cink' keys that trigger indent when 'cindent' is set
|
'cinkeys' 'cink' keys that trigger indent when 'cindent' is set
|
||||||
'cinoptions' 'cino' how to do indenting when 'cindent' is set
|
'cinoptions' 'cino' how to do indenting when 'cindent' is set
|
||||||
'cinwords' 'cinw' words where 'si' and 'cin' add an indent
|
'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
|
'clipboard' 'cb' use the clipboard as the unnamed register
|
||||||
'cmdheight' 'ch' number of lines to use for the command-line
|
'cmdheight' 'ch' number of lines to use for the command-line
|
||||||
'cmdwinheight' 'cwh' height of the command-line window
|
'cmdwinheight' 'cwh' height of the command-line window
|
||||||
|
@@ -870,6 +870,9 @@ if has("cindent")
|
|||||||
call append("$", "cinwords\tlist of words that cause more C-indent")
|
call append("$", "cinwords\tlist of words that cause more C-indent")
|
||||||
call append("$", "\t(local to buffer)")
|
call append("$", "\t(local to buffer)")
|
||||||
call <SID>OptionL("cinw")
|
call <SID>OptionL("cinw")
|
||||||
|
call append("$", "cinscopedecls\tlist of scope declaration names used by cino-g")
|
||||||
|
call append("$", "\t(local to buffer)")
|
||||||
|
call <SID>OptionL("cinsd")
|
||||||
call append("$", "indentexpr\texpression used to obtain the indent of a line")
|
call append("$", "indentexpr\texpression used to obtain the indent of a line")
|
||||||
call append("$", "\t(local to buffer)")
|
call append("$", "\t(local to buffer)")
|
||||||
call <SID>OptionL("inde")
|
call <SID>OptionL("inde")
|
||||||
|
@@ -1938,6 +1938,7 @@ void free_buf_options(buf_T *buf, int free_p_ff)
|
|||||||
clear_string_option(&buf->b_p_cink);
|
clear_string_option(&buf->b_p_cink);
|
||||||
clear_string_option(&buf->b_p_cino);
|
clear_string_option(&buf->b_p_cino);
|
||||||
clear_string_option(&buf->b_p_cinw);
|
clear_string_option(&buf->b_p_cinw);
|
||||||
|
clear_string_option(&buf->b_p_cinsd);
|
||||||
clear_string_option(&buf->b_p_cpt);
|
clear_string_option(&buf->b_p_cpt);
|
||||||
clear_string_option(&buf->b_p_cfu);
|
clear_string_option(&buf->b_p_cfu);
|
||||||
clear_string_option(&buf->b_p_ofu);
|
clear_string_option(&buf->b_p_ofu);
|
||||||
|
@@ -696,6 +696,7 @@ struct file_buffer {
|
|||||||
char_u *b_p_cino; ///< 'cinoptions'
|
char_u *b_p_cino; ///< 'cinoptions'
|
||||||
char_u *b_p_cink; ///< 'cinkeys'
|
char_u *b_p_cink; ///< 'cinkeys'
|
||||||
char_u *b_p_cinw; ///< 'cinwords'
|
char_u *b_p_cinw; ///< 'cinwords'
|
||||||
|
char_u *b_p_cinsd; ///< 'cinscopedecls'
|
||||||
char_u *b_p_com; ///< 'comments'
|
char_u *b_p_com; ///< 'comments'
|
||||||
char_u *b_p_cms; ///< 'commentstring'
|
char_u *b_p_cms; ///< 'commentstring'
|
||||||
char_u *b_p_cpt; ///< 'complete'
|
char_u *b_p_cpt; ///< 'complete'
|
||||||
|
@@ -512,24 +512,27 @@ static int cin_isdefault(const char_u *s)
|
|||||||
&& s[1] != ':';
|
&& s[1] != ':';
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/// Recognize a scope declaration label set in 'cinscopedecls'.
|
||||||
* Recognize a "public/private/protected" scope declaration label.
|
bool cin_isscopedecl(const char_u *p)
|
||||||
*/
|
|
||||||
bool cin_isscopedecl(const char_u *s)
|
|
||||||
{
|
{
|
||||||
int i;
|
const char_u *s = cin_skipcomment(p);
|
||||||
|
|
||||||
s = cin_skipcomment(s);
|
const size_t cinsd_len = STRLEN(curbuf->b_p_cinsd) + 1;
|
||||||
if (STRNCMP(s, "public", 6) == 0) {
|
char_u *cinsd_buf = xmalloc(cinsd_len);
|
||||||
i = 6;
|
|
||||||
} else if (STRNCMP(s, "protected", 9) == 0) {
|
for (char_u *cinsd = curbuf->b_p_cinsd; *cinsd; ) {
|
||||||
i = 9;
|
const size_t len = copy_option_part(&cinsd, cinsd_buf, cinsd_len, ",");
|
||||||
} else if (STRNCMP(s, "private", 7) == 0) {
|
if (STRNCMP(s, cinsd_buf, len) == 0) {
|
||||||
i = 7;
|
const char_u *skip = cin_skipcomment(s + len);
|
||||||
} else {
|
if (*skip == ':' && skip[1] != ':') {
|
||||||
return false;
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return *(s = cin_skipcomment(s + i)) == ':' && s[1] != ':';
|
|
||||||
|
xfree(cinsd_buf);
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Maximum number of lines to search back for a "namespace" line.
|
// Maximum number of lines to search back for a "namespace" line.
|
||||||
|
@@ -133,6 +133,7 @@ static int p_cin;
|
|||||||
static char_u *p_cink;
|
static char_u *p_cink;
|
||||||
static char_u *p_cino;
|
static char_u *p_cino;
|
||||||
static char_u *p_cinw;
|
static char_u *p_cinw;
|
||||||
|
static char_u *p_cinsd;
|
||||||
static char_u *p_com;
|
static char_u *p_com;
|
||||||
static char_u *p_cms;
|
static char_u *p_cms;
|
||||||
static char_u *p_cpt;
|
static char_u *p_cpt;
|
||||||
@@ -2060,6 +2061,7 @@ void check_buf_options(buf_T *buf)
|
|||||||
parse_cino(buf);
|
parse_cino(buf);
|
||||||
check_string_option(&buf->b_p_ft);
|
check_string_option(&buf->b_p_ft);
|
||||||
check_string_option(&buf->b_p_cinw);
|
check_string_option(&buf->b_p_cinw);
|
||||||
|
check_string_option(&buf->b_p_cinsd);
|
||||||
check_string_option(&buf->b_p_cpt);
|
check_string_option(&buf->b_p_cpt);
|
||||||
check_string_option(&buf->b_p_cfu);
|
check_string_option(&buf->b_p_cfu);
|
||||||
check_string_option(&buf->b_p_ofu);
|
check_string_option(&buf->b_p_ofu);
|
||||||
@@ -6058,6 +6060,8 @@ static char_u *get_varp(vimoption_T *p)
|
|||||||
return (char_u *)&(curbuf->b_p_cink);
|
return (char_u *)&(curbuf->b_p_cink);
|
||||||
case PV_CINO:
|
case PV_CINO:
|
||||||
return (char_u *)&(curbuf->b_p_cino);
|
return (char_u *)&(curbuf->b_p_cino);
|
||||||
|
case PV_CINSD:
|
||||||
|
return (char_u *)&(curbuf->b_p_cinsd);
|
||||||
case PV_CINW:
|
case PV_CINW:
|
||||||
return (char_u *)&(curbuf->b_p_cinw);
|
return (char_u *)&(curbuf->b_p_cinw);
|
||||||
case PV_COM:
|
case PV_COM:
|
||||||
@@ -6505,6 +6509,8 @@ void buf_copy_options(buf_T *buf, int flags)
|
|||||||
COPY_OPT_SCTX(buf, BV_CINK);
|
COPY_OPT_SCTX(buf, BV_CINK);
|
||||||
buf->b_p_cino = vim_strsave(p_cino);
|
buf->b_p_cino = vim_strsave(p_cino);
|
||||||
COPY_OPT_SCTX(buf, BV_CINO);
|
COPY_OPT_SCTX(buf, BV_CINO);
|
||||||
|
buf->b_p_cinsd = vim_strsave(p_cinsd);
|
||||||
|
COPY_OPT_SCTX(buf, BV_CINSD);
|
||||||
// Don't copy 'filetype', it must be detected
|
// Don't copy 'filetype', it must be detected
|
||||||
buf->b_p_ft = empty_option;
|
buf->b_p_ft = empty_option;
|
||||||
buf->b_p_pi = p_pi;
|
buf->b_p_pi = p_pi;
|
||||||
|
@@ -773,6 +773,7 @@ enum {
|
|||||||
BV_CINK,
|
BV_CINK,
|
||||||
BV_CINO,
|
BV_CINO,
|
||||||
BV_CINW,
|
BV_CINW,
|
||||||
|
BV_CINSD,
|
||||||
BV_CM,
|
BV_CM,
|
||||||
BV_CMS,
|
BV_CMS,
|
||||||
BV_COM,
|
BV_COM,
|
||||||
|
@@ -350,6 +350,15 @@ return {
|
|||||||
varname='p_cinw',
|
varname='p_cinw',
|
||||||
defaults={if_true="if,else,while,do,for,switch"}
|
defaults={if_true="if,else,while,do,for,switch"}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
full_name='cinscopedecls', abbreviation='cinsd',
|
||||||
|
short_desc=N_("words that are recognized by 'cino-g'"),
|
||||||
|
type='string', list='onecomma', scope={'buffer'},
|
||||||
|
deny_duplicates=true,
|
||||||
|
alloced=true,
|
||||||
|
varname='p_cinsd',
|
||||||
|
defaults={if_true="public,protected,private"}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
full_name='clipboard', abbreviation='cb',
|
full_name='clipboard', abbreviation='cb',
|
||||||
short_desc=N_("use the clipboard as the unnamed register"),
|
short_desc=N_("use the clipboard as the unnamed register"),
|
||||||
|
@@ -5311,6 +5311,49 @@ func Test_cindent_case()
|
|||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
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()
|
func Test_cindent_pragma()
|
||||||
new
|
new
|
||||||
setl cindent ts=4 sw=4
|
setl cindent ts=4 sw=4
|
||||||
|
Reference in New Issue
Block a user