change gravity to be a boolean flag, and add corresponding flag for end position of extmark

This commit is contained in:
chentau
2021-01-05 00:28:34 -08:00
parent 10b278bdae
commit 231f75e086
3 changed files with 34 additions and 16 deletions

View File

@@ -1400,9 +1400,13 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id,
/// callbacks. The mark will only be used for the current /// callbacks. The mark will only be used for the current
/// redraw cycle, and not be permantently stored in the /// redraw cycle, and not be permantently stored in the
/// buffer. /// buffer.
/// - gravity : the direction the extmark will be shifted in /// - right_gravity : boolean that indicates the direction
/// when new text is inserted. Must be either 'left' or /// the extmark will be shifted in when new text is inserted
/// 'right'. /// (true for right, false for left). defaults to true.
/// - end_right_gravity : boolean that indicates the direction
/// the extmark end position (if it exists) will be shifted
/// in when new text is inserted (true for right, false
/// for left). Defaults to false.
/// @param[out] err Error details, if any /// @param[out] err Error details, if any
/// @return Id of the created/updated extmark /// @return Id of the created/updated extmark
Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id,
@@ -1444,6 +1448,8 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id,
colnr_T col2 = 0; colnr_T col2 = 0;
VirtText virt_text = KV_INITIAL_VALUE; VirtText virt_text = KV_INITIAL_VALUE;
bool right_gravity = true; bool right_gravity = true;
bool end_right_gravity = false;
for (size_t i = 0; i < opts.size; i++) { for (size_t i = 0; i < opts.size; i++) {
String k = opts.items[i].key; String k = opts.items[i].key;
Object *v = &opts.items[i].value; Object *v = &opts.items[i].value;
@@ -1526,19 +1532,20 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id,
goto error; goto error;
} }
priority = (DecorPriority)v->data.integer; priority = (DecorPriority)v->data.integer;
} else if (strequal("gravity", k.data)) { } else if (strequal("right_gravity", k.data)) {
if (v->type != kObjectTypeString) { if (v->type != kObjectTypeBoolean) {
api_set_error(err, kErrorTypeValidation, api_set_error(err, kErrorTypeValidation,
"gravity must be a string"); "right_gravity must be a boolean");
goto error; goto error;
} }
if (strequal("left", v->data.string.data)) { right_gravity = v->data.boolean;
right_gravity = false; } else if (strequal("end_right_gravity", k.data)) {
} else if (!strequal("right", v->data.string.data)) { if (v->type != kObjectTypeBoolean) {
api_set_error(err, kErrorTypeValidation, api_set_error(err, kErrorTypeValidation,
"invalid option for gravity: must be 'left' or 'right'"); "end_right_gravity must be a boolean");
goto error; goto error;
} }
end_right_gravity = v->data.boolean;
} else { } else {
api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data); api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data);
goto error; goto error;
@@ -1563,6 +1570,14 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id,
col2 = 0; col2 = 0;
} }
// Only error out if they try to set end_right_gravity to true without
// setting end_col or end_line
if (line2 == 0 && col2 == 0 && end_right_gravity) {
api_set_error(err, kErrorTypeValidation,
"cannot set end_right_gravity to true "
"without setting end_line and end_col");
}
// TODO(bfredl): synergize these two branches even more // TODO(bfredl): synergize these two branches even more
if (ephemeral && decor_state.buf == buf) { if (ephemeral && decor_state.buf == buf) {
int attr_id = hl_id > 0 ? syn_id2attr(hl_id) : 0; int attr_id = hl_id > 0 ? syn_id2attr(hl_id) : 0;
@@ -1589,7 +1604,8 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id,
} }
id = extmark_set(buf, (uint64_t)ns_id, id, (int)line, (colnr_T)col, id = extmark_set(buf, (uint64_t)ns_id, id, (int)line, (colnr_T)col,
line2, col2, decor, right_gravity, kExtmarkNoUndo); line2, col2, decor, right_gravity,
end_right_gravity, kExtmarkNoUndo);
} }
return (Integer)id; return (Integer)id;
@@ -1704,7 +1720,7 @@ Integer nvim_buf_add_highlight(Buffer buffer,
extmark_set(buf, ns_id, 0, extmark_set(buf, ns_id, 0,
(int)line, (colnr_T)col_start, (int)line, (colnr_T)col_start,
end_line, (colnr_T)col_end, end_line, (colnr_T)col_end,
decor_hl(hl_id), true, kExtmarkNoUndo); decor_hl(hl_id), true, false, kExtmarkNoUndo);
return src_id; return src_id;
} }
@@ -1813,7 +1829,8 @@ Integer nvim_buf_set_virtual_text(Buffer buffer,
Decoration *decor = xcalloc(1, sizeof(*decor)); Decoration *decor = xcalloc(1, sizeof(*decor));
decor->virt_text = virt_text; decor->virt_text = virt_text;
extmark_set(buf, ns_id, 0, (int)line, 0, -1, -1, decor, true, kExtmarkNoUndo); extmark_set(buf, ns_id, 0, (int)line, 0, -1, -1, decor, true,
false, kExtmarkNoUndo);
return src_id; return src_id;
} }

View File

@@ -69,7 +69,7 @@ void bufhl_add_hl_pos_offset(buf_T *buf,
} }
(void)extmark_set(buf, (uint64_t)src_id, 0, (void)extmark_set(buf, (uint64_t)src_id, 0,
(int)lnum-1, hl_start, (int)lnum-1+end_off, hl_end, (int)lnum-1, hl_start, (int)lnum-1+end_off, hl_end,
decor, true, kExtmarkNoUndo); decor, true, false, kExtmarkNoUndo);
} }
} }

View File

@@ -71,7 +71,8 @@ static ExtmarkNs *buf_ns_ref(buf_T *buf, uint64_t ns_id, bool put) {
/// @returns the mark id /// @returns the mark id
uint64_t extmark_set(buf_T *buf, uint64_t ns_id, uint64_t id, uint64_t extmark_set(buf_T *buf, uint64_t ns_id, uint64_t id,
int row, colnr_T col, int end_row, colnr_T end_col, int row, colnr_T col, int end_row, colnr_T end_col,
Decoration *decor, bool right_gravity, ExtmarkOp op) Decoration *decor, bool right_gravity,
bool end_right_gravity, ExtmarkOp op)
{ {
ExtmarkNs *ns = buf_ns_ref(buf, ns_id, true); ExtmarkNs *ns = buf_ns_ref(buf, ns_id, true);
assert(ns != NULL); assert(ns != NULL);
@@ -110,7 +111,7 @@ uint64_t extmark_set(buf_T *buf, uint64_t ns_id, uint64_t id,
if (end_row > -1) { if (end_row > -1) {
mark = marktree_put_pair(buf->b_marktree, mark = marktree_put_pair(buf->b_marktree,
row, col, right_gravity, row, col, right_gravity,
end_row, end_col, false); end_row, end_col, end_right_gravity);
} else { } else {
mark = marktree_put(buf->b_marktree, row, col, right_gravity); mark = marktree_put(buf->b_marktree, row, col, right_gravity);
} }