mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
updated for version 7.0110
This commit is contained in:
parent
6c131c43ff
commit
d6c04cd66a
282
src/search.c
282
src/search.c
@ -3407,6 +3407,10 @@ extend:
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find block under the cursor, cursor at end.
|
||||||
|
* "what" and "other" are two matching parenthesis/paren/etc.
|
||||||
|
*/
|
||||||
int
|
int
|
||||||
current_block(oap, count, include, what, other)
|
current_block(oap, count, include, what, other)
|
||||||
oparg_T *oap;
|
oparg_T *oap;
|
||||||
@ -3421,10 +3425,10 @@ current_block(oap, count, include, what, other)
|
|||||||
pos_T *end_pos;
|
pos_T *end_pos;
|
||||||
pos_T old_start, old_end;
|
pos_T old_start, old_end;
|
||||||
char_u *save_cpo;
|
char_u *save_cpo;
|
||||||
int sol = FALSE; /* { at start of line */
|
int sol = FALSE; /* '{' at start of line */
|
||||||
|
|
||||||
old_pos = curwin->w_cursor;
|
old_pos = curwin->w_cursor;
|
||||||
old_end = curwin->w_cursor; /* remember where we started */
|
old_end = curwin->w_cursor; /* remember where we started */
|
||||||
old_start = old_end;
|
old_start = old_end;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3435,11 +3439,12 @@ current_block(oap, count, include, what, other)
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
setpcmark();
|
setpcmark();
|
||||||
if (what == '{') /* ignore indent */
|
if (what == '{') /* ignore indent */
|
||||||
while (inindent(1))
|
while (inindent(1))
|
||||||
if (inc_cursor() != 0)
|
if (inc_cursor() != 0)
|
||||||
break;
|
break;
|
||||||
if (gchar_cursor() == what) /* cursor on '(' or '{' */
|
if (gchar_cursor() == what)
|
||||||
|
/* cursor on '(' or '{', move cursor just after it */
|
||||||
++curwin->w_cursor.col;
|
++curwin->w_cursor.col;
|
||||||
}
|
}
|
||||||
#ifdef FEAT_VISUAL
|
#ifdef FEAT_VISUAL
|
||||||
@ -3455,7 +3460,7 @@ current_block(oap, count, include, what, other)
|
|||||||
/*
|
/*
|
||||||
* Search backwards for unclosed '(', '{', etc..
|
* Search backwards for unclosed '(', '{', etc..
|
||||||
* Put this position in start_pos.
|
* Put this position in start_pos.
|
||||||
* Ignory quotes here.
|
* Ignore quotes here.
|
||||||
*/
|
*/
|
||||||
save_cpo = p_cpo;
|
save_cpo = p_cpo;
|
||||||
p_cpo = (char_u *)"%";
|
p_cpo = (char_u *)"%";
|
||||||
@ -3554,6 +3559,273 @@ current_block(oap, count, include, what, other)
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int in_html_tag __ARGS((int));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return TRUE if the cursor is on a "<aaa>" tag. Ignore "<aaa/>".
|
||||||
|
* When "end_tag" is TRUE return TRUE if the cursor is on "</aaa>".
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
in_html_tag(end_tag)
|
||||||
|
int end_tag;
|
||||||
|
{
|
||||||
|
char_u *line = ml_get_curline();
|
||||||
|
char_u *p;
|
||||||
|
int c;
|
||||||
|
int lc = NUL;
|
||||||
|
pos_T pos;
|
||||||
|
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
if (enc_dbcs)
|
||||||
|
{
|
||||||
|
char_u *lp = NULL;
|
||||||
|
|
||||||
|
/* We search forward until the cursor, because searching backwards is
|
||||||
|
* very slow for DBCS encodings. */
|
||||||
|
for (p = line; p < line + curwin->w_cursor.col; mb_ptr_adv(p))
|
||||||
|
if (*p == '>' || *p == '<')
|
||||||
|
{
|
||||||
|
lc = *p;
|
||||||
|
lp = p;
|
||||||
|
}
|
||||||
|
if (*p != '<') /* check for '<' under cursor */
|
||||||
|
{
|
||||||
|
if (lc != '<')
|
||||||
|
return FALSE;
|
||||||
|
p = lp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
for (p = line + curwin->w_cursor.col; p > line; )
|
||||||
|
{
|
||||||
|
if (*p == '<') /* find '<' under/before cursor */
|
||||||
|
break;
|
||||||
|
mb_ptr_back(line, p);
|
||||||
|
if (*p == '>') /* find '>' before cursor */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (*p != '<')
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos.lnum = curwin->w_cursor.lnum;
|
||||||
|
pos.col = p - line;
|
||||||
|
|
||||||
|
mb_ptr_adv(p);
|
||||||
|
if (end_tag)
|
||||||
|
/* check that there is a '/' after the '<' */
|
||||||
|
return *p == '/';
|
||||||
|
|
||||||
|
/* check that there is no '/' after the '<' */
|
||||||
|
if (*p == '/')
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* check that the matching '>' is not preceded by '/' */
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (inc(&pos) < 0)
|
||||||
|
return FALSE;
|
||||||
|
c = *ml_get_pos(&pos);
|
||||||
|
if (c == '>')
|
||||||
|
break;
|
||||||
|
lc = c;
|
||||||
|
}
|
||||||
|
return lc != '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find tag block under the cursor, cursor at end.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
current_tagblock(oap, count_arg, include)
|
||||||
|
oparg_T *oap;
|
||||||
|
long count_arg;
|
||||||
|
int include; /* TRUE == include white space */
|
||||||
|
{
|
||||||
|
long count = count_arg;
|
||||||
|
long n;
|
||||||
|
pos_T old_pos;
|
||||||
|
pos_T start_pos;
|
||||||
|
pos_T end_pos;
|
||||||
|
pos_T old_start, old_end;
|
||||||
|
char_u *spat, *epat;
|
||||||
|
char_u *p;
|
||||||
|
char_u *cp;
|
||||||
|
int len;
|
||||||
|
int r;
|
||||||
|
int do_include = include;
|
||||||
|
int save_p_ws = p_ws;
|
||||||
|
int retval = FAIL;
|
||||||
|
|
||||||
|
p_ws = FALSE;
|
||||||
|
|
||||||
|
old_pos = curwin->w_cursor;
|
||||||
|
old_end = curwin->w_cursor; /* remember where we started */
|
||||||
|
old_start = old_end;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we start on "<aaa>" use the whole block inclusive.
|
||||||
|
*/
|
||||||
|
#ifdef FEAT_VISUAL
|
||||||
|
if (!VIsual_active || equalpos(VIsual, curwin->w_cursor))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
setpcmark();
|
||||||
|
|
||||||
|
/* ignore indent */
|
||||||
|
while (inindent(1))
|
||||||
|
if (inc_cursor() != 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (in_html_tag(FALSE))
|
||||||
|
{
|
||||||
|
/* cursor on start tag, move to just after it */
|
||||||
|
while (*ml_get_cursor() != '>')
|
||||||
|
if (inc_cursor() < 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (in_html_tag(TRUE))
|
||||||
|
{
|
||||||
|
/* cursor on end tag, move to just before it */
|
||||||
|
while (*ml_get_cursor() != '<')
|
||||||
|
if (dec_cursor() < 0)
|
||||||
|
break;
|
||||||
|
dec_cursor();
|
||||||
|
old_end = curwin->w_cursor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef FEAT_VISUAL
|
||||||
|
else if (lt(VIsual, curwin->w_cursor))
|
||||||
|
{
|
||||||
|
old_start = VIsual;
|
||||||
|
curwin->w_cursor = VIsual; /* cursor at low end of Visual */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
old_end = VIsual;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
again:
|
||||||
|
/*
|
||||||
|
* Search backwards for unclosed "<aaa>".
|
||||||
|
* Put this position in start_pos.
|
||||||
|
*/
|
||||||
|
for (n = 0; n < count; ++n)
|
||||||
|
{
|
||||||
|
if (do_searchpair((char_u *)"<[^ \t>/!]\\+\\%(\\_s\\_[^>]\\{-}[^/]>\\|$\\|>\\)",
|
||||||
|
(char_u *)"",
|
||||||
|
(char_u *)"</[^>]*>", BACKWARD, (char_u *)"", 0) <= 0)
|
||||||
|
{
|
||||||
|
curwin->w_cursor = old_pos;
|
||||||
|
goto theend;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
start_pos = curwin->w_cursor;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Search for matching "</aaa>". First isolate the "aaa".
|
||||||
|
*/
|
||||||
|
inc_cursor();
|
||||||
|
p = ml_get_cursor();
|
||||||
|
for (cp = p; *cp != NUL && *cp != '>' && !vim_iswhite(*cp); mb_ptr_adv(cp))
|
||||||
|
;
|
||||||
|
len = cp - p;
|
||||||
|
if (len == 0)
|
||||||
|
{
|
||||||
|
curwin->w_cursor = old_pos;
|
||||||
|
goto theend;
|
||||||
|
}
|
||||||
|
spat = alloc(len + 29);
|
||||||
|
epat = alloc(len + 9);
|
||||||
|
if (spat == NULL || epat == NULL)
|
||||||
|
{
|
||||||
|
vim_free(spat);
|
||||||
|
vim_free(epat);
|
||||||
|
curwin->w_cursor = old_pos;
|
||||||
|
goto theend;
|
||||||
|
}
|
||||||
|
sprintf((char *)spat, "<%.*s\\%%(\\_[^>]\\{-}[^/]>\\|>\\)\\c", len, p);
|
||||||
|
sprintf((char *)epat, "</%.*s>\\c", len, p);
|
||||||
|
|
||||||
|
r = do_searchpair(spat, (char_u *)"", epat, FORWARD, (char_u *)"", 0);
|
||||||
|
|
||||||
|
vim_free(spat);
|
||||||
|
vim_free(epat);
|
||||||
|
|
||||||
|
if (r < 1 || lt(curwin->w_cursor, old_end))
|
||||||
|
{
|
||||||
|
/* Can't find other end or it's before the previous end. Could be a
|
||||||
|
* HTML tag that doesn't have a matching end. Search backwards for
|
||||||
|
* another starting tag. */
|
||||||
|
count = 1;
|
||||||
|
curwin->w_cursor = start_pos;
|
||||||
|
goto again;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (do_include || r < 1)
|
||||||
|
{
|
||||||
|
/* Include up to the '>'. */
|
||||||
|
while (*ml_get_cursor() != '>')
|
||||||
|
if (inc_cursor() < 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Exclude the '<' of the end tag. */
|
||||||
|
if (*ml_get_cursor() == '<')
|
||||||
|
dec_cursor();
|
||||||
|
}
|
||||||
|
end_pos = curwin->w_cursor;
|
||||||
|
|
||||||
|
if (!do_include)
|
||||||
|
{
|
||||||
|
/* Exclude the start tag. */
|
||||||
|
curwin->w_cursor = start_pos;
|
||||||
|
while (inc_cursor() >= 0)
|
||||||
|
if (*ml_get_cursor() == '>' && lt(curwin->w_cursor, end_pos))
|
||||||
|
{
|
||||||
|
inc_cursor();
|
||||||
|
start_pos = curwin->w_cursor;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
curwin->w_cursor = end_pos;
|
||||||
|
|
||||||
|
/* If we now have the same start as before reset "do_include" and try
|
||||||
|
* again. */
|
||||||
|
if (equalpos(start_pos, old_start))
|
||||||
|
{
|
||||||
|
do_include = TRUE;
|
||||||
|
curwin->w_cursor = old_start;
|
||||||
|
count = count_arg;
|
||||||
|
goto again;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef FEAT_VISUAL
|
||||||
|
if (VIsual_active)
|
||||||
|
{
|
||||||
|
if (*p_sel == 'e')
|
||||||
|
++curwin->w_cursor.col;
|
||||||
|
VIsual = start_pos;
|
||||||
|
VIsual_mode = 'v';
|
||||||
|
redraw_curbuf_later(INVERTED); /* update the inversion */
|
||||||
|
showmode();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
oap->start = start_pos;
|
||||||
|
oap->motion_type = MCHAR;
|
||||||
|
oap->inclusive = TRUE;
|
||||||
|
}
|
||||||
|
retval = OK;
|
||||||
|
|
||||||
|
theend:
|
||||||
|
p_ws = save_p_ws;
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
current_par(oap, count, include, type)
|
current_par(oap, count, include, type)
|
||||||
oparg_T *oap;
|
oparg_T *oap;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user