forked from aniani/vim
patch 9.0.0622: matchaddpos() can get slow when adding many matches
Problem: matchaddpos() can get slow when adding many matches.
Solution: Update the next available match ID when manually picking an ID and
remove check if the available ID can be used. (idea by Rick Howe)
This commit is contained in:
32
src/match.c
32
src/match.c
@@ -50,19 +50,28 @@ match_add(
|
||||
semsg(_(e_invalid_id_nr_must_be_greater_than_or_equal_to_one_1), id);
|
||||
return -1;
|
||||
}
|
||||
if (id != -1)
|
||||
if (id == -1)
|
||||
{
|
||||
cur = wp->w_match_head;
|
||||
while (cur != NULL)
|
||||
{
|
||||
// use the next available match ID
|
||||
id = wp->w_next_match_id++;
|
||||
}
|
||||
else
|
||||
{
|
||||
// check the given ID is not already in use
|
||||
for (cur = wp->w_match_head; cur != NULL; cur = cur->mit_next)
|
||||
if (cur->mit_id == id)
|
||||
{
|
||||
semsg(_(e_id_already_taken_nr), id);
|
||||
return -1;
|
||||
}
|
||||
cur = cur->mit_next;
|
||||
}
|
||||
|
||||
// Make sure the next match ID is always higher than the highest
|
||||
// manually selected ID. Add some extra in case a few more IDs are
|
||||
// added soon.
|
||||
if (wp->w_next_match_id < id + 100)
|
||||
wp->w_next_match_id = id + 100;
|
||||
}
|
||||
|
||||
if ((hlg_id = syn_namen2id(grp, (int)STRLEN(grp))) == 0)
|
||||
{
|
||||
semsg(_(e_no_such_highlight_group_name_str), grp);
|
||||
@@ -74,17 +83,6 @@ match_add(
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Find available match ID.
|
||||
while (id == -1)
|
||||
{
|
||||
cur = wp->w_match_head;
|
||||
while (cur != NULL && cur->mit_id != wp->w_next_match_id)
|
||||
cur = cur->mit_next;
|
||||
if (cur == NULL)
|
||||
id = wp->w_next_match_id;
|
||||
wp->w_next_match_id++;
|
||||
}
|
||||
|
||||
// Build new match.
|
||||
m = ALLOC_CLEAR_ONE(matchitem_T);
|
||||
if (m == NULL)
|
||||
|
||||
Reference in New Issue
Block a user