diff options
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r-- | src/nvim/eval.c | 83 |
1 files changed, 68 insertions, 15 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 7298f2e9a8..790f1081b5 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -7204,6 +7204,23 @@ static buf_T *tv_get_buf(typval_T *tv, int curtab_only) } /* + * Get the buffer from "arg" and give an error and return NULL if it is not + * valid. + */ + static buf_T * +get_buf_arg(typval_T *arg) +{ + buf_T *buf; + + ++emsg_off; + buf = tv_get_buf(arg, FALSE); + --emsg_off; + if (buf == NULL) + EMSG2(_("E158: Invalid buffer name: %s"), tv_get_string(arg)); + return buf; +} + +/* * "bufname(expr)" function */ static void f_bufname(typval_T *argvars, typval_T *rettv, FunPtr fptr) @@ -15506,14 +15523,10 @@ f_sign_getplaced(typval_T *argvars, typval_T *rettv) if (argvars[0].v_type != VAR_UNKNOWN) { - // get signs placed in this buffer - buf = tv_get_buf(&argvars[0], FALSE); + // get signs placed in the specified buffer + buf = get_buf_arg(&argvars[0]); if (buf == NULL) - { - EMSG2(_("E158: Invalid buffer name: %s"), - tv_get_string(&argvars[0])); return; - } if (argvars[1].v_type != VAR_UNKNOWN) { @@ -15553,6 +15566,53 @@ f_sign_getplaced(typval_T *argvars, typval_T *rettv) } /* + * "sign_jump()" function + */ + static void +f_sign_jump(typval_T *argvars, typval_T *rettv) +{ + int sign_id; + char_u *sign_group = NULL; + buf_T *buf; + int notanum = FALSE; + + rettv->vval.v_number = -1; + + // Sign identifer + sign_id = (int)tv_get_number_chk(&argvars[0], ¬anum); + if (notanum) + return; + if (sign_id <= 0) + { + EMSG(_(e_invarg)); + return; + } + + // Sign group + sign_group = tv_get_string_chk(&argvars[1]); + if (sign_group == NULL) + return; + if (sign_group[0] == '\0') + sign_group = NULL; // global sign group + else + { + sign_group = vim_strsave(sign_group); + if (sign_group == NULL) + return; + } + + // Buffer to place the sign + buf = get_buf_arg(&argvars[2]); + if (buf == NULL) + goto cleanup; + + rettv->vval.v_number = sign_jump(sign_id, sign_group, buf); + +cleanup: + xfree(sign_group); +} + +/* * "sign_place()" function */ static void @@ -15599,12 +15659,9 @@ f_sign_place(typval_T *argvars, typval_T *rettv) goto cleanup; // Buffer to place the sign - buf = tv_get_buf(&argvars[3], FALSE); + buf = get_buf_arg(&argvars[3]); if (buf == NULL) - { - EMSG2(_("E158: Invalid buffer name: %s"), tv_get_string(&argvars[3])); goto cleanup; - } if (argvars[4].v_type != VAR_UNKNOWN) { @@ -15708,13 +15765,9 @@ f_sign_unplace(typval_T *argvars, typval_T *rettv) if ((di = tv_dict_find(dict, (char_u *)"buffer", -1)) != NULL) { - buf = tv_get_buf(&di->di_tv, FALSE); + buf = get_buf_arg(&di->di_tv); if (buf == NULL) - { - EMSG2(_("E158: Invalid buffer name: %s"), - tv_get_string(&di->di_tv)); goto cleanup; - } } if (tv_dict_find(dict, (char_u *)"id", -1) != NULL) sign_id = tv_dict_get_number(dict, (char_u *)"id"); |