aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api/buffer.c
diff options
context:
space:
mode:
authorchentau <tchen1998@gmail.com>2021-01-05 00:28:34 -0800
committerchentau <tchen1998@gmail.com>2021-01-05 00:28:34 -0800
commit231f75e086a9d7a6d48e1eefd1789861bd8097bb (patch)
tree49f0558d4892be284c65fffbd0081a0769f36332 /src/nvim/api/buffer.c
parent10b278bdae4227ab1fdc1257e09bfa6524cbf63c (diff)
downloadrneovim-231f75e086a9d7a6d48e1eefd1789861bd8097bb.tar.gz
rneovim-231f75e086a9d7a6d48e1eefd1789861bd8097bb.tar.bz2
rneovim-231f75e086a9d7a6d48e1eefd1789861bd8097bb.zip
change gravity to be a boolean flag, and add corresponding flag for end position of extmark
Diffstat (limited to 'src/nvim/api/buffer.c')
-rw-r--r--src/nvim/api/buffer.c43
1 files changed, 30 insertions, 13 deletions
diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c
index 7c381ac1ed..8faf812357 100644
--- a/src/nvim/api/buffer.c
+++ b/src/nvim/api/buffer.c
@@ -1400,9 +1400,13 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id,
/// callbacks. The mark will only be used for the current
/// redraw cycle, and not be permantently stored in the
/// buffer.
-/// - gravity : the direction the extmark will be shifted in
-/// when new text is inserted. Must be either 'left' or
-/// 'right'.
+/// - right_gravity : boolean that indicates the direction
+/// the extmark will be shifted in when new text is inserted
+/// (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
/// @return Id of the created/updated extmark
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;
VirtText virt_text = KV_INITIAL_VALUE;
bool right_gravity = true;
+ bool end_right_gravity = false;
+
for (size_t i = 0; i < opts.size; i++) {
String k = opts.items[i].key;
Object *v = &opts.items[i].value;
@@ -1526,19 +1532,20 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id,
goto error;
}
priority = (DecorPriority)v->data.integer;
- } else if (strequal("gravity", k.data)) {
- if (v->type != kObjectTypeString) {
+ } else if (strequal("right_gravity", k.data)) {
+ if (v->type != kObjectTypeBoolean) {
api_set_error(err, kErrorTypeValidation,
- "gravity must be a string");
+ "right_gravity must be a boolean");
goto error;
}
- if (strequal("left", v->data.string.data)) {
- right_gravity = false;
- } else if (!strequal("right", v->data.string.data)) {
+ right_gravity = v->data.boolean;
+ } else if (strequal("end_right_gravity", k.data)) {
+ if (v->type != kObjectTypeBoolean) {
api_set_error(err, kErrorTypeValidation,
- "invalid option for gravity: must be 'left' or 'right'");
+ "end_right_gravity must be a boolean");
goto error;
}
+ end_right_gravity = v->data.boolean;
} else {
api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data);
goto error;
@@ -1563,6 +1570,14 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id,
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
if (ephemeral && decor_state.buf == buf) {
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,
- line2, col2, decor, right_gravity, kExtmarkNoUndo);
+ line2, col2, decor, right_gravity,
+ end_right_gravity, kExtmarkNoUndo);
}
return (Integer)id;
@@ -1704,7 +1720,7 @@ Integer nvim_buf_add_highlight(Buffer buffer,
extmark_set(buf, ns_id, 0,
(int)line, (colnr_T)col_start,
end_line, (colnr_T)col_end,
- decor_hl(hl_id), true, kExtmarkNoUndo);
+ decor_hl(hl_id), true, false, kExtmarkNoUndo);
return src_id;
}
@@ -1813,7 +1829,8 @@ Integer nvim_buf_set_virtual_text(Buffer buffer,
Decoration *decor = xcalloc(1, sizeof(*decor));
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;
}