forked from aniani/vim
patch 8.1.0862: no verbose version of character classes
Problem: No verbose version of character classes. Solution: Add [:ident:], [:keyword:] and [:fname:]. (Ozaki Kiichi, closes #1373)
This commit is contained in:
@@ -1118,6 +1118,9 @@ x A single character, with no special meaning, matches itself
|
|||||||
*[:tab:]* [:tab:] the <Tab> character
|
*[:tab:]* [:tab:] the <Tab> character
|
||||||
*[:escape:]* [:escape:] the <Esc> character
|
*[:escape:]* [:escape:] the <Esc> character
|
||||||
*[:backspace:]* [:backspace:] the <BS> character
|
*[:backspace:]* [:backspace:] the <BS> character
|
||||||
|
*[:ident:]* [:ident:] identifier character (same as "\i")
|
||||||
|
*[:keyword:]* [:keyword:] keyword character (same as "\k")
|
||||||
|
*[:fname:]* [:fname:] file name character (same as "\f")
|
||||||
The brackets in character class expressions are additional to the
|
The brackets in character class expressions are additional to the
|
||||||
brackets delimiting a collection. For example, the following is a
|
brackets delimiting a collection. For example, the following is a
|
||||||
plausible pattern for a UNIX filename: "[-./[:alnum:]_~]\+" That is,
|
plausible pattern for a UNIX filename: "[-./[:alnum:]_~]\+" That is,
|
||||||
|
32
src/regexp.c
32
src/regexp.c
@@ -484,6 +484,12 @@ get_char_class(char_u **pp)
|
|||||||
#define CLASS_BACKSPACE 14
|
#define CLASS_BACKSPACE 14
|
||||||
"escape:]",
|
"escape:]",
|
||||||
#define CLASS_ESCAPE 15
|
#define CLASS_ESCAPE 15
|
||||||
|
"ident:]",
|
||||||
|
#define CLASS_IDENT 16
|
||||||
|
"keyword:]",
|
||||||
|
#define CLASS_KEYWORD 17
|
||||||
|
"fname:]",
|
||||||
|
#define CLASS_FNAME 18
|
||||||
};
|
};
|
||||||
#define CLASS_NONE 99
|
#define CLASS_NONE 99
|
||||||
int i;
|
int i;
|
||||||
@@ -698,6 +704,7 @@ static char_u *re_put_long(char_u *pr, long_u val);
|
|||||||
static int read_limits(long *, long *);
|
static int read_limits(long *, long *);
|
||||||
static void regtail(char_u *, char_u *);
|
static void regtail(char_u *, char_u *);
|
||||||
static void regoptail(char_u *, char_u *);
|
static void regoptail(char_u *, char_u *);
|
||||||
|
static int reg_iswordc(int);
|
||||||
|
|
||||||
static regengine_T bt_regengine;
|
static regengine_T bt_regengine;
|
||||||
static regengine_T nfa_regengine;
|
static regengine_T nfa_regengine;
|
||||||
@@ -2545,6 +2552,21 @@ collection:
|
|||||||
case CLASS_ESCAPE:
|
case CLASS_ESCAPE:
|
||||||
regc('\033');
|
regc('\033');
|
||||||
break;
|
break;
|
||||||
|
case CLASS_IDENT:
|
||||||
|
for (cu = 1; cu <= 255; cu++)
|
||||||
|
if (vim_isIDc(cu))
|
||||||
|
regmbc(cu);
|
||||||
|
break;
|
||||||
|
case CLASS_KEYWORD:
|
||||||
|
for (cu = 1; cu <= 255; cu++)
|
||||||
|
if (reg_iswordc(cu))
|
||||||
|
regmbc(cu);
|
||||||
|
break;
|
||||||
|
case CLASS_FNAME:
|
||||||
|
for (cu = 1; cu <= 255; cu++)
|
||||||
|
if (vim_isfilec(cu))
|
||||||
|
regmbc(cu);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -3589,6 +3611,16 @@ free_regexp_stuff(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return TRUE if character 'c' is included in 'iskeyword' option for
|
||||||
|
* "reg_buf" buffer.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
reg_iswordc(int c)
|
||||||
|
{
|
||||||
|
return vim_iswordc_buf(c, rex.reg_buf);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get pointer to the line "lnum", which is relative to "reg_firstlnum".
|
* Get pointer to the line "lnum", which is relative to "reg_firstlnum".
|
||||||
*/
|
*/
|
||||||
|
@@ -226,7 +226,10 @@ enum
|
|||||||
NFA_CLASS_TAB,
|
NFA_CLASS_TAB,
|
||||||
NFA_CLASS_RETURN,
|
NFA_CLASS_RETURN,
|
||||||
NFA_CLASS_BACKSPACE,
|
NFA_CLASS_BACKSPACE,
|
||||||
NFA_CLASS_ESCAPE
|
NFA_CLASS_ESCAPE,
|
||||||
|
NFA_CLASS_IDENT,
|
||||||
|
NFA_CLASS_KEYWORD,
|
||||||
|
NFA_CLASS_FNAME
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Keep in sync with classchars. */
|
/* Keep in sync with classchars. */
|
||||||
@@ -1718,6 +1721,15 @@ collection:
|
|||||||
case CLASS_ESCAPE:
|
case CLASS_ESCAPE:
|
||||||
EMIT(NFA_CLASS_ESCAPE);
|
EMIT(NFA_CLASS_ESCAPE);
|
||||||
break;
|
break;
|
||||||
|
case CLASS_IDENT:
|
||||||
|
EMIT(NFA_CLASS_IDENT);
|
||||||
|
break;
|
||||||
|
case CLASS_KEYWORD:
|
||||||
|
EMIT(NFA_CLASS_KEYWORD);
|
||||||
|
break;
|
||||||
|
case CLASS_FNAME:
|
||||||
|
EMIT(NFA_CLASS_FNAME);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
EMIT(NFA_CONCAT);
|
EMIT(NFA_CONCAT);
|
||||||
continue;
|
continue;
|
||||||
@@ -2555,6 +2567,9 @@ nfa_set_code(int c)
|
|||||||
case NFA_CLASS_RETURN: STRCPY(code, "NFA_CLASS_RETURN"); break;
|
case NFA_CLASS_RETURN: STRCPY(code, "NFA_CLASS_RETURN"); break;
|
||||||
case NFA_CLASS_BACKSPACE: STRCPY(code, "NFA_CLASS_BACKSPACE"); break;
|
case NFA_CLASS_BACKSPACE: STRCPY(code, "NFA_CLASS_BACKSPACE"); break;
|
||||||
case NFA_CLASS_ESCAPE: STRCPY(code, "NFA_CLASS_ESCAPE"); break;
|
case NFA_CLASS_ESCAPE: STRCPY(code, "NFA_CLASS_ESCAPE"); break;
|
||||||
|
case NFA_CLASS_IDENT: STRCPY(code, "NFA_CLASS_IDENT"); break;
|
||||||
|
case NFA_CLASS_KEYWORD: STRCPY(code, "NFA_CLASS_KEYWORD"); break;
|
||||||
|
case NFA_CLASS_FNAME: STRCPY(code, "NFA_CLASS_FNAME"); break;
|
||||||
|
|
||||||
case NFA_ANY: STRCPY(code, "NFA_ANY"); break;
|
case NFA_ANY: STRCPY(code, "NFA_ANY"); break;
|
||||||
case NFA_IDENT: STRCPY(code, "NFA_IDENT"); break;
|
case NFA_IDENT: STRCPY(code, "NFA_IDENT"); break;
|
||||||
@@ -4846,6 +4861,18 @@ check_char_class(int class, int c)
|
|||||||
if (c == '\033')
|
if (c == '\033')
|
||||||
return OK;
|
return OK;
|
||||||
break;
|
break;
|
||||||
|
case NFA_CLASS_IDENT:
|
||||||
|
if (vim_isIDc(c))
|
||||||
|
return OK;
|
||||||
|
break;
|
||||||
|
case NFA_CLASS_KEYWORD:
|
||||||
|
if (reg_iswordc(c))
|
||||||
|
return OK;
|
||||||
|
break;
|
||||||
|
case NFA_CLASS_FNAME:
|
||||||
|
if (vim_isfilec(c))
|
||||||
|
return OK;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* should not be here :P */
|
/* should not be here :P */
|
||||||
|
@@ -51,6 +51,12 @@ func s:classes_test()
|
|||||||
let tabchar = ''
|
let tabchar = ''
|
||||||
let upperchars = ''
|
let upperchars = ''
|
||||||
let xdigitchars = ''
|
let xdigitchars = ''
|
||||||
|
let identchars = ''
|
||||||
|
let identchars1 = ''
|
||||||
|
let kwordchars = ''
|
||||||
|
let kwordchars1 = ''
|
||||||
|
let fnamechars = ''
|
||||||
|
let fnamechars1 = ''
|
||||||
let i = 1
|
let i = 1
|
||||||
while i <= 255
|
while i <= 255
|
||||||
let c = nr2char(i)
|
let c = nr2char(i)
|
||||||
@@ -102,6 +108,24 @@ func s:classes_test()
|
|||||||
if c =~ '[[:xdigit:]]'
|
if c =~ '[[:xdigit:]]'
|
||||||
let xdigitchars .= c
|
let xdigitchars .= c
|
||||||
endif
|
endif
|
||||||
|
if c =~ '[[:ident:]]'
|
||||||
|
let identchars .= c
|
||||||
|
endif
|
||||||
|
if c =~ '\i'
|
||||||
|
let identchars1 .= c
|
||||||
|
endif
|
||||||
|
if c =~ '[[:keyword:]]'
|
||||||
|
let kwordchars .= c
|
||||||
|
endif
|
||||||
|
if c =~ '\k'
|
||||||
|
let kwordchars1 .= c
|
||||||
|
endif
|
||||||
|
if c =~ '[[:fname:]]'
|
||||||
|
let fnamechars .= c
|
||||||
|
endif
|
||||||
|
if c =~ '\f'
|
||||||
|
let fnamechars1 .= c
|
||||||
|
endif
|
||||||
let i += 1
|
let i += 1
|
||||||
endwhile
|
endwhile
|
||||||
|
|
||||||
@@ -121,6 +145,37 @@ func s:classes_test()
|
|||||||
call assert_equal("\t\n\x0b\f\r ", spacechars)
|
call assert_equal("\t\n\x0b\f\r ", spacechars)
|
||||||
call assert_equal("\t", tabchar)
|
call assert_equal("\t", tabchar)
|
||||||
call assert_equal('0123456789ABCDEFabcdef', xdigitchars)
|
call assert_equal('0123456789ABCDEFabcdef', xdigitchars)
|
||||||
|
|
||||||
|
if has('win32')
|
||||||
|
let identchars_ok = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
¡¢£¤¥¦§µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ'
|
||||||
|
let kwordchars_ok = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzµÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
|
||||||
|
elseif has('ebcdic')
|
||||||
|
let identchars_ok = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz¬®µº¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
|
||||||
|
let kwordchars_ok = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz¬®µº¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
|
||||||
|
else
|
||||||
|
let identchars_ok = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzµÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
|
||||||
|
let kwordchars_ok = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzµÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if has('win32')
|
||||||
|
let fnamechars_ok = '!#$%+,-./0123456789:=@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz{}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
|
||||||
|
elseif has('amiga')
|
||||||
|
let fnamechars_ok = '$+,-./0123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
|
||||||
|
elseif has('vms')
|
||||||
|
let fnamechars_ok = '#$%+,-./0123456789:;<>ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_abcdefghijklmnopqrstuvwxyz~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
|
||||||
|
elseif has('ebcdic')
|
||||||
|
let fnamechars_ok = '#$%+,-./=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
|
||||||
|
else
|
||||||
|
let fnamechars_ok = '#$%+,-./0123456789=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
|
||||||
|
endif
|
||||||
|
|
||||||
|
call assert_equal(identchars_ok, identchars)
|
||||||
|
call assert_equal(kwordchars_ok, kwordchars)
|
||||||
|
call assert_equal(fnamechars_ok, fnamechars)
|
||||||
|
|
||||||
|
call assert_equal(identchars1, identchars)
|
||||||
|
call assert_equal(kwordchars1, kwordchars)
|
||||||
|
call assert_equal(fnamechars1, fnamechars)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_classes_re1()
|
func Test_classes_re1()
|
||||||
|
@@ -783,6 +783,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
862,
|
||||||
/**/
|
/**/
|
||||||
861,
|
861,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user