mirror of
https://github.com/neovim/neovim.git
synced 2025-10-02 16:08:36 +00:00
perf(column): keep track of number of lines that hold up the 'signcolumn'
Problem: The entire marktree needs to be traversed each time a sign is removed from the sentinel line. Solution: Remove sentinel line and instead keep track of the number of lines that hold up the 'signcolumn' in "max_count". Adjust this number for added/removed signs, and set it to 0 when the maximum number of signs on a line changes. Only when "max_count" is decremented to 0 due to sign removal do we need to check the entire buffer. Also replace "invalid_top" and "invalid_bot" with a map of invalid ranges, further reducing the number of lines to be checked. Also improve tree traversal when counting the number of signs. Instead of looping over the to be checked range and counting the overlap for each row, keep track of the overlap in an array and add this to the count.
This commit is contained in:

committed by
Lewis Russell

parent
e42f03264b
commit
4a34da82c1
@@ -67,18 +67,18 @@ void extmark_set(buf_T *buf, uint32_t ns_id, uint32_t *idp, int row, colnr_T col
|
||||
} else {
|
||||
assert(marktree_itr_valid(itr));
|
||||
if (old_mark.pos.row == row && old_mark.pos.col == col) {
|
||||
// not paired: we can revise in place
|
||||
if (mt_decor_any(old_mark)) {
|
||||
mt_itr_rawkey(itr).flags &= (uint16_t) ~MT_FLAG_DECOR_SIGNTEXT;
|
||||
buf_decor_remove(buf, row, row, mt_decor(old_mark), true);
|
||||
}
|
||||
|
||||
// not paired: we can revise in place
|
||||
mt_itr_rawkey(itr).flags &= (uint16_t) ~MT_FLAG_EXTERNAL_MASK;
|
||||
mt_itr_rawkey(itr).flags |= flags;
|
||||
mt_itr_rawkey(itr).decor_data = decor.data;
|
||||
goto revised;
|
||||
}
|
||||
buf_decor_remove(buf, old_mark.pos.row, old_mark.pos.row, mt_decor(old_mark), true);
|
||||
marktree_del_itr(buf->b_marktree, itr, false);
|
||||
buf_decor_remove(buf, old_mark.pos.row, old_mark.pos.row, mt_decor(old_mark), true);
|
||||
}
|
||||
} else {
|
||||
*ns = MAX(*ns, id);
|
||||
@@ -515,20 +515,6 @@ void extmark_splice_impl(buf_T *buf, int start_row, colnr_T start_col, bcount_t
|
||||
extmark_splice_delete(buf, start_row, start_col, end_row, end_col, uvp, false, undo);
|
||||
}
|
||||
|
||||
// Move the signcolumn sentinel line
|
||||
if (buf->b_signs_with_text && buf->b_signcols.sentinel) {
|
||||
linenr_T se_lnum = buf->b_signcols.sentinel;
|
||||
if (se_lnum >= start_row) {
|
||||
if (old_row != 0 && se_lnum > old_row + start_row) {
|
||||
buf->b_signcols.sentinel += new_row - old_row;
|
||||
} else if (new_row == 0) {
|
||||
buf->b_signcols.sentinel = 0;
|
||||
} else {
|
||||
buf->b_signcols.sentinel += new_row;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
marktree_splice(buf->b_marktree, (int32_t)start_row, start_col,
|
||||
old_row, old_col,
|
||||
new_row, new_col);
|
||||
|
Reference in New Issue
Block a user