diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.lua | 4 | ||||
-rw-r--r-- | src/nvim/sign.c | 33 | ||||
-rw-r--r-- | src/nvim/sign_defs.h | 1 |
3 files changed, 31 insertions, 7 deletions
diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua index 82d695d82b..b57482dc9a 100644 --- a/src/nvim/eval.lua +++ b/src/nvim/eval.lua @@ -10112,6 +10112,7 @@ M.funcs = { linehl highlight group used for the whole line the sign is placed in; not present if not set. name name of the sign + priority default priority value of the sign numhl highlight group used for the line number where the sign is placed; not present if not set. text text that is displayed when there is no icon @@ -10322,7 +10323,8 @@ M.funcs = { priority Priority of the sign. When multiple signs are placed on a line, the sign with the highest priority is used. If not specified, the - default value of 10 is used. See + default value of 10 is used, unless specified + otherwise by the sign definition. See |sign-priority| for more information. If {id} refers to an existing sign, then the existing sign is diff --git a/src/nvim/sign.c b/src/nvim/sign.c index 605098fb66..fbd25493ef 100644 --- a/src/nvim/sign.c +++ b/src/nvim/sign.c @@ -401,7 +401,7 @@ int init_sign_text(sign_T *sp, schar_T *sign_text, char *text) /// Define a new sign or update an existing sign static int sign_define_by_name(char *name, char *icon, char *text, char *linehl, char *texthl, - char *culhl, char *numhl) + char *culhl, char *numhl, int prio) { cstr_t *key; sign_T **sp = (sign_T **)pmap_put_ref(cstr_t)(&sign_map, name, &key, NULL); @@ -431,6 +431,8 @@ static int sign_define_by_name(char *name, char *icon, char *text, char *linehl, return FAIL; } + (*sp)->sn_priority = prio; + char *arg[] = { linehl, texthl, culhl, numhl }; int *hl[] = { &(*sp)->sn_line_hl, &(*sp)->sn_text_hl, &(*sp)->sn_cul_hl, &(*sp)->sn_num_hl }; for (int i = 0; i < 4; i++) { @@ -472,6 +474,11 @@ static void sign_list_defined(sign_T *sp) describe_sign_text(buf, sp->sn_text); msg_outtrans(buf, 0); } + if (sp->sn_priority > 0) { + char lbuf[MSG_BUF_LEN]; + vim_snprintf(lbuf, MSG_BUF_LEN, " priority=%d", sp->sn_priority); + msg_puts(lbuf); + } static char *arg[] = { " linehl=", " texthl=", " culhl=", " numhl=" }; int hl[] = { sp->sn_line_hl, sp->sn_text_hl, sp->sn_cul_hl, sp->sn_num_hl }; for (int i = 0; i < 4; i++) { @@ -508,6 +515,11 @@ static int sign_place(uint32_t *id, char *group, char *name, buf_T *buf, linenr_ return FAIL; } + // Use the default priority value for this sign. + if (prio == -1) { + prio = (sp->sn_priority != -1) ? sp->sn_priority : SIGN_DEF_PRIO; + } + if (lnum > 0) { // ":sign place {id} line={lnum} name={name} file={fname}": place a sign buf_set_sign(buf, id, group, prio, lnum, sp); @@ -602,6 +614,7 @@ static void sign_define_cmd(char *name, char *cmdline) char *texthl = NULL; char *culhl = NULL; char *numhl = NULL; + int prio = -1; // set values for a defined sign. while (true) { @@ -622,6 +635,8 @@ static void sign_define_cmd(char *name, char *cmdline) culhl = arg + 6; } else if (strncmp(arg, "numhl=", 6) == 0) { numhl = arg + 6; + } else if (strncmp(arg, "priority=", 9) == 0) { + prio = atoi(arg + 9); } else { semsg(_(e_invarg2), arg); return; @@ -632,7 +647,7 @@ static void sign_define_cmd(char *name, char *cmdline) *cmdline++ = NUL; } - sign_define_by_name(name, icon, text, linehl, texthl, culhl, numhl); + sign_define_by_name(name, icon, text, linehl, texthl, culhl, numhl, prio); } /// ":sign place" command @@ -847,7 +862,7 @@ void ex_sign(exarg_T *eap) linenr_T lnum = -1; char *name = NULL; char *group = NULL; - int prio = SIGN_DEF_PRIO; + int prio = -1; buf_T *buf = NULL; // Parse command line arguments @@ -880,6 +895,9 @@ static dict_T *sign_get_info_dict(sign_T *sp) describe_sign_text(buf, sp->sn_text); tv_dict_add_str(d, S_LEN("text"), buf); } + if (sp->sn_priority > 0) { + tv_dict_add_nr(d, S_LEN("priority"), sp->sn_priority); + } static char *arg[] = { "linehl", "texthl", "culhl", "numhl" }; int hl[] = { sp->sn_line_hl, sp->sn_text_hl, sp->sn_cul_hl, sp->sn_num_hl }; for (int i = 0; i < 4; i++) { @@ -1044,7 +1062,8 @@ char *get_sign_name(expand_T *xp, int idx) case EXP_SUBCMD: return cmds[idx]; case EXP_DEFINE: { - char *define_arg[] = { "culhl=", "icon=", "linehl=", "numhl=", "text=", "texthl=", NULL }; + char *define_arg[] = { "culhl=", "icon=", "linehl=", "numhl=", "text=", "texthl=", + "priority=", NULL }; return define_arg[idx]; } case EXP_PLACE: { @@ -1200,6 +1219,7 @@ static int sign_define_from_dict(char *name, dict_T *dict) char *texthl = NULL; char *culhl = NULL; char *numhl = NULL; + int prio = -1; if (dict != NULL) { icon = tv_dict_get_string(dict, "icon", false); @@ -1208,9 +1228,10 @@ static int sign_define_from_dict(char *name, dict_T *dict) texthl = tv_dict_get_string(dict, "texthl", false); culhl = tv_dict_get_string(dict, "culhl", false); numhl = tv_dict_get_string(dict, "numhl", false); + prio = (int)tv_dict_get_number_def(dict, "priority", -1); } - return sign_define_by_name(name, icon, text, linehl, texthl, culhl, numhl) - 1; + return sign_define_by_name(name, icon, text, linehl, texthl, culhl, numhl, prio) - 1; } /// Define multiple signs using attributes from list 'l' and store the return @@ -1442,7 +1463,7 @@ static int sign_place_from_dict(typval_T *id_tv, typval_T *group_tv, typval_T *n } } - int prio = SIGN_DEF_PRIO; + int prio = -1; di = tv_dict_find(dict, "priority", -1); if (di != NULL) { prio = (int)tv_get_number_chk(&di->di_tv, ¬anum); diff --git a/src/nvim/sign_defs.h b/src/nvim/sign_defs.h index ad2a2b737d..f6712513b7 100644 --- a/src/nvim/sign_defs.h +++ b/src/nvim/sign_defs.h @@ -18,6 +18,7 @@ typedef struct { int sn_text_hl; // highlight ID for text int sn_cul_hl; // highlight ID for text on current line when 'cursorline' is set int sn_num_hl; // highlight ID for line number + int sn_priority; // default priority of this sign, -1 means SIGN_DEF_PRIO } sign_T; typedef struct { |