aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/extmark.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/extmark.c')
-rw-r--r--src/nvim/extmark.c46
1 files changed, 31 insertions, 15 deletions
diff --git a/src/nvim/extmark.c b/src/nvim/extmark.c
index d24b304270..ff9fa55388 100644
--- a/src/nvim/extmark.c
+++ b/src/nvim/extmark.c
@@ -159,21 +159,22 @@ static bool extmark_setraw(buf_T *buf, uint64_t mark, int row, colnr_T col)
return true;
}
-linenr_T extmark_del_id(buf_T *buf, uint32_t ns_id, uint32_t id)
+/// Remove an extmark in "ns_id" by "id"
+///
+/// @return false on missing id
+bool extmark_del_id(buf_T *buf, uint32_t ns_id, uint32_t id)
{
- MarkTreeIter it[1] = { 0 };
- MTKey key = marktree_lookup_ns(buf->b_marktree, ns_id, id, false, it);
- if (!key.id) {
- return 0;
+ MarkTreeIter itr[1] = { 0 };
+ MTKey key = marktree_lookup_ns(buf->b_marktree, ns_id, id, false, itr);
+ if (key.id) {
+ extmark_del(buf, itr, key, false);
}
- return extmark_del(buf, it, key, false);
+ return key.id > 0;
}
/// Remove a (paired) extmark "key" pointed to by "itr"
-///
-/// @return line number of the deleted mark
-linenr_T extmark_del(buf_T *buf, MarkTreeIter *itr, MTKey key, bool restore)
+void extmark_del(buf_T *buf, MarkTreeIter *itr, MTKey key, bool restore)
{
assert(key.pos.row >= 0);
@@ -193,7 +194,6 @@ linenr_T extmark_del(buf_T *buf, MarkTreeIter *itr, MTKey key, bool restore)
}
// TODO(bfredl): delete it from current undo header, opportunistically?
- return key.pos.row + 1;
}
/// Free extmarks in a ns between lines
@@ -240,8 +240,8 @@ bool extmark_clear(buf_T *buf, uint32_t ns_id, int l_row, colnr_T l_col, int u_r
///
/// if upper_lnum or upper_col are negative the buffer
/// will be searched to the start, or end
-/// dir can be set to control the order of the array
-/// amount = amount of marks to find or -1 for all
+/// reverse can be set to control the order of the array
+/// amount = amount of marks to find or INT64_MAX for all
ExtmarkInfoArray extmark_get(buf_T *buf, uint32_t ns_id, int l_row, colnr_T l_col, int u_row,
colnr_T u_col, int64_t amount, bool reverse, ExtmarkType type_filter,
bool overlap)
@@ -299,7 +299,10 @@ static void push_mark(ExtmarkInfoArray *array, uint32_t ns_id, ExtmarkType type_
if (type_filter != kExtmarkNone) {
Decoration *decor = mark.decor_full;
if (decor && (decor->sign_text || decor->number_hl_id)) {
- type_flags |= kExtmarkSign;
+ type_flags |= (kExtmarkSignHL|kExtmarkSign);
+ }
+ if (decor && (decor->line_hl_id || decor->cursorline_hl_id)) {
+ type_flags |= (kExtmarkSignHL|kExtmarkHighlight);
}
if (decor && decor->virt_text.size) {
type_flags |= kExtmarkVirtText;
@@ -307,8 +310,7 @@ static void push_mark(ExtmarkInfoArray *array, uint32_t ns_id, ExtmarkType type_
if (decor && decor->virt_lines.size) {
type_flags |= kExtmarkVirtLines;
}
- if ((decor && (decor->line_hl_id || decor->cursorline_hl_id))
- || mark.hl_id) {
+ if (mark.hl_id) {
type_flags |= kExtmarkHighlight;
}
@@ -596,6 +598,20 @@ 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, 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);