mirror of
https://github.com/neovim/neovim.git
synced 2025-10-15 14:26:07 +00:00
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)
9f573a8df0
This commit is contained in:
@@ -58,16 +58,26 @@ static int match_add(win_T *wp, const char *const grp, const char *const pat, in
|
||||
(int64_t)id);
|
||||
return -1;
|
||||
}
|
||||
if (id != -1) {
|
||||
cur = wp->w_match_head;
|
||||
while (cur != NULL) {
|
||||
if (id == -1) {
|
||||
// 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(_("E801: ID already taken: %" PRId64), (int64_t)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_check_group(grp, strlen(grp))) == 0) {
|
||||
return -1;
|
||||
}
|
||||
@@ -76,18 +86,6 @@ static int match_add(win_T *wp, const char *const grp, const char *const pat, in
|
||||
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 = xcalloc(1, sizeof(matchitem_T));
|
||||
if (pos_list != NULL) {
|
||||
|
Reference in New Issue
Block a user